基于C++的绘图板
//2021年3月12日12:23:33
C++項目[繪圖板]
結合easyx圖形庫
C++寫的,適合剛剛入門C++,需要鞏固基礎語法的朋友
一.分析需求
鼠標左鍵:拖動即可畫線
鼠標右鍵:清屏
鼠標滾輪:切換畫筆大小
界面布局分為繪畫區和工具欄(含有各種顏色按鈕)
具體分為
class Window//窗口類
class Point//坐標類
class Paint//畫家類
class Tools//所有空間的基類
class Canvas//Tools的派生類畫布類
class Button//Tools的派生類按鈕類
二.具體類的實現
Window類
class Window {typedef int EW_WINDOWMODE ; //窗口標記 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);//因為本程序中重復用到原點,即(0,0),這里直接定義為靜態變量,便于調用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())//畫橢圓,即矩形的內接圓{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){}//鼠標是否在控件上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;}//處理鼠標消息,需要繼承自己實現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: //滾輪調整字體大小lineSize = msg.wheel > 0 ? lineSize + 1 : lineSize - 1;if (lineSize <= 0){lineSize = 1;}break;case WM_MOUSEMOVE: //畫線if (isDown){if (isIn(begPos) && isIn(Point(msg.x, msg.y))) // 起始點和結束點都在區域內{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); //繪圖區域break;}return false;} public:int getLineSize(){return lineSize;}void setColor(COLORREF color){this->color = color;} private:int lineSize; //線條寬度COLORREF color; //線條顏色bool isDown; //鼠標是否按下Point begPos; //記錄上一個點的坐標 };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; //按鈕是否被點擊COLORREF color; //按鈕顏色ButtonStyle style; //按鈕樣式 };三.主函數
int main() {Window w(1100, 768,EW_SHOWCONSOLE);w.setWindowTitle("繪圖板");Paint::drawRect(Point::ZERO, w.getW(), w.getH(), WHITE); //繪圖區域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,隨后我還會補充新的功能進去(橡皮擦,取色器,快速畫形狀等等)
最后感謝頑石哥!!!
總結
- 上一篇: 7大子论坛回顾 | PGConf.Asi
- 下一篇: error TS1323: Dynami