日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

基于C++的绘图板

發(fā)布時(shí)間:2023/12/8 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于C++的绘图板 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

//2021年3月12日12:23:33
C++項(xiàng)目[繪圖板]
結(jié)合easyx圖形庫(kù)

C++寫的,適合剛剛?cè)腴TC++,需要鞏固基礎(chǔ)語(yǔ)法的朋友

一.分析需求

鼠標(biāo)左鍵:拖動(dòng)即可畫(huà)線
鼠標(biāo)右鍵:清屏
鼠標(biāo)滾輪:切換畫(huà)筆大小
界面布局分為繪畫(huà)區(qū)和工具欄(含有各種顏色按鈕)
具體分為
class Window//窗口類
class Point//坐標(biāo)類
class Paint//畫(huà)家類
class Tools//所有空間的基類
class Canvas//Tools的派生類畫(huà)布類
class Button//Tools的派生類按鈕類

二.具體類的實(shí)現(xiàn)

Window類

class Window {typedef int EW_WINDOWMODE ; //窗口標(biāo)記 public:Window(int w, int h, EW_WINDOWMODE flag = 0) :_width(w), _height(h){initgraph(w, h, flag);}~Window(){closegraph();}int exec(){return system("pause");} public:void setWindowTitle(const char * title){SetWindowText(GetHWnd(), title);}static int getW(){return getwidth();}static int getH(){return getheight();} private:int _width;int _height; };

Point類

class Point { public:Point() {};Point(int x, int y) :x(x), y(y) {};int x;int y;static Point ZERO; }; Point Point::ZERO = Point(0, 0);//因?yàn)楸境绦蛑兄貜?fù)用到原點(diǎn),即(0,0),這里直接定義為靜態(tài)變量,便于調(diào)用

Paint類

class Paint { public:static void drawRect(const Point& p, int w, int h, COLORREF color = getfillcolor()){setfillcolor(color);solidrectangle(p.x, p.y, p.x+w, p.y+h);}static void drawLine(const Point& p1, const Point& p2, COLORREF color = getlinecolor(),int lineSize = 1){setlinestyle(PS_COSMETIC, lineSize);setlinecolor(color);line(p1.x, p1.y, p2.x, p2.y);}static void drawText(int x, int y, const char* text,COLORREF color = gettextcolor(),int textSize = 26){setbkmode(TRANSPARENT);settextcolor(color);settextstyle(textSize, 0,"黑體");outtextxy(x, y, text);}static void drawText(int x, int y, int text, COLORREF color = gettextcolor(), int textSize = 26){char lineSizeStr[10] = "";sprintf_s(lineSizeStr, "%d", text);Paint::drawText(x, y, lineSizeStr, color, textSize);}static void drawCircle(const Point& p,int w,int h, COLORREF color = getfillcolor())//畫(huà)橢圓,即矩形的內(nèi)接圓{setfillcolor(color);solidellipse(p.x, p.y, p.x + w, p.y + h);} };

Tools類

class Tools { public:Tools() {};Tools(int x, int y, int w, int h):leftTop(x, y), width(w), height(h){}//鼠標(biāo)是否在控件上bool isIn(const Point& p){if (p.x >= leftTop.x && p.x <= leftTop.x + width &&p.y >= leftTop.y && p.y <= leftTop.y + height){return true;}return false;}//處理鼠標(biāo)消息,需要繼承自己實(shí)現(xiàn)bool ProcessMsg(MOUSEMSG& msg){return 0;}Point leftTop;int width;int height; };

Canvas類

class Canvas :public Tools { public:Canvas() {}Canvas(int x, int y, int w, int h) :Tools(x, y, w, h),color(BLACK),lineSize(1){this->isDown = false;this->begPos = Point(0, 0);}bool ProcessMsg(MOUSEMSG& msg){switch (msg.uMsg){case WM_LBUTTONDOWN:if (isIn(Point(msg.x,msg.y))){isDown = true;begPos = Point(msg.x, msg.y);}break;case WM_LBUTTONUP:isDown = false;break;case WM_MOUSEWHEEL: //滾輪調(diào)整字體大小lineSize = msg.wheel > 0 ? lineSize + 1 : lineSize - 1;if (lineSize <= 0){lineSize = 1;}break;case WM_MOUSEMOVE: //畫(huà)線if (isDown){if (isIn(begPos) && isIn(Point(msg.x, msg.y))) // 起始點(diǎn)和結(jié)束點(diǎn)都在區(qū)域內(nèi){Paint::drawLine(begPos, Point(msg.x, msg.y), color, lineSize);}begPos = Point(msg.x, msg.y);}break;case WM_RBUTTONDOWN: //清屏Paint::drawRect(Point::ZERO, Window::getW()-100, Window::getH(), WHITE); //繪圖區(qū)域break;}return false;} public:int getLineSize(){return lineSize;}void setColor(COLORREF color){this->color = color;} private:int lineSize; //線條寬度COLORREF color; //線條顏色bool isDown; //鼠標(biāo)是否按下Point begPos; //記錄上一個(gè)點(diǎn)的坐標(biāo) };

Button類

class Button:public Tools { public:enum ButtonStyle { CIRCLE, RECT };Button():style(ButtonStyle::CIRCLE) {}Button(int x, int y, int w, int h, ButtonStyle style = ButtonStyle::CIRCLE):Tools(x, y, w, h), style(style){isClick = false;}bool ProcessMsg(MOUSEMSG& msg, Canvas& canvas){switch (msg.uMsg){case WM_LBUTTONDOWN:if (isIn(Point(msg.x,msg.y))){printf("leftTop(%d,%d) %#X \n",leftTop.x,leftTop.y, color);canvas.setColor(color);isClick = true;}break;case WM_LBUTTONUP:isClick = false;break;}if (style == ButtonStyle::CIRCLE){Paint::drawCircle(leftTop, width, height, color);}else if (style == ButtonStyle::RECT){Paint::drawRect(leftTop, width, height, color);}return false;} public:void setPos(const Point&p){this->leftTop = p;}void setSize(int w,int h){this->width = w;this->height = h;}void setColor(COLORREF color){this->color = color;}void setStyle(ButtonStyle style){this->style = style;} private:bool isClick; //按鈕是否被點(diǎn)擊COLORREF color; //按鈕顏色ButtonStyle style; //按鈕樣式 };

三.主函數(shù)

int main() {Window w(1100, 768,EW_SHOWCONSOLE);w.setWindowTitle("繪圖板");Paint::drawRect(Point::ZERO, w.getW(), w.getH(), WHITE); //繪圖區(qū)域Paint::drawRect(Point(w.getW()-100, 0), w.getW(), w.getH(), 0xEFEFEF); //工具欄Canvas canvas(0, 0, w.getW()-100, w.getH());//顏色按鈕Button btns[9];for (int i = 0; i < 9; i++){btns[i].setSize(50, 50);btns[i].setPos(Point(Window::getW() - 100 + 26, 50 + i * 60));btns[i].setColor(RGB(rand() % 256, rand() % 256, rand() % 256));//btns[i].setStyle(Button::RECT);}BeginBatchDraw();while (true){MOUSEMSG msg = GetMouseMsg();canvas.ProcessMsg(msg);Paint::drawRect(Point(1050, 700), 50, 50, 0xEFEFEF);Paint::drawText(1000, 700, "字體大小:", BLACK,15);Paint::drawText(1080,700, canvas.getLineSize(),BLACK,15);for (int i = 0; i < 9; i++){btns[i].ProcessMsg(msg, canvas);}FlushBatchDraw();}return w.exec(); }

這是版本1.0,隨后我還會(huì)補(bǔ)充新的功能進(jìn)去(橡皮擦,取色器,快速畫(huà)形狀等等)
最后感謝頑石哥!!!

總結(jié)

以上是生活随笔為你收集整理的基于C++的绘图板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。