From b91a59a269931e2598bb3778c42be37d359f9c96 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 25 Oct 2008 11:01:18 +0900 Subject: [PATCH] [6/19] paint: Add TOOL_POLYGON --- programs/paint/canvas.c | 151 +++++++++++++++++++++++++++++++++++++++++++++ programs/paint/eraser.bmp | Bin 0 -> 9174 bytes programs/paint/main.c | 9 +++- programs/paint/main.h | 3 + 4 files changed, 162 insertions(+), 1 deletions(-) create mode 100644 programs/paint/eraser.bmp diff --git a/programs/paint/canvas.c b/programs/paint/canvas.c index dc02916..9b468c9 100644 --- a/programs/paint/canvas.c +++ b/programs/paint/canvas.c @@ -91,6 +91,10 @@ VOID Canvas_DrawBuffer(HDC hDC) DeleteObject(hPen); break; + case TOOL_POLYGON: + Polyline(hDC, Globals.pPolyline, Globals.cPolyline); + break; + case TOOL_LINE: hPen = CreatePen(PS_SOLID, Globals.nLineWidth, Globals.fSwapColor ? Globals.rgbBack : Globals.rgbFore); @@ -486,6 +490,10 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) Globals.iToolSelect = Globals.iToolPrev; Globals.iToolClicking = -1; Globals.ipt = 0; + if (Globals.pPolyline != NULL) + HeapFree(GetProcessHeap(), 0, Globals.pPolyline); + Globals.pPolyline = NULL; + Globals.cPolyline = 0; InvalidateRect(Globals.hToolBox, NULL, TRUE); UpdateWindow(Globals.hToolBox); @@ -522,6 +530,32 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) Globals.pt0 = pt; break; + case TOOL_POLYGON: + SetCursor(Globals.hcurCross2); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + CanvasToImage(&pt); + if (Globals.cPolyline == 0) + { + Globals.cPolyline = 2; + Globals.pPolyline = (POINT*)HeapAlloc(GetProcessHeap(), 0, + 2 * sizeof(POINT)); + + Globals.pPolyline[0] = Globals.pPolyline[1] = pt; + } + else + { + DWORD cb; + Globals.cPolyline++; + cb = Globals.cPolyline * sizeof(POINT); + Globals.pPolyline = (POINT*)HeapReAlloc(GetProcessHeap(), 0, + Globals.pPolyline, cb); + Globals.pPolyline[Globals.cPolyline - 1] = pt; + } + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_CURVE: SetCursor(Globals.hcurCross2); Globals.mode = MODE_CANVAS; @@ -661,6 +695,14 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown case MODE_CANVAS: switch (Globals.iToolSelect) { + case TOOL_POLYGON: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pPolyline[Globals.cPolyline - 1] = pt; + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_CURVE: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -745,6 +787,14 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { switch (Globals.iToolSelect) { + case TOOL_POLYGON: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pPolyline[Globals.cPolyline - 1] = pt; + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_CURVE: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -919,6 +969,95 @@ VOID Canvas_Resize(HWND hWnd, SIZE sizNew) VOID Canvas_OnButtonDblClk(HWND hWnd, INT x, INT y, BOOL fRight) { + HDC hDC, hMemDC; + POINT pt; + pt.x = x; + pt.y = y; + + switch (Globals.iToolSelect) + { + case TOOL_POLYGON: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + hDC = GetDC(hWnd); + if (hDC != NULL) + { + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + HPEN hPen; + HBRUSH hbr; + HGDIOBJ hpenOld, hbrOld, hbmOld; + hbmOld = SelectObject(hMemDC, Globals.hbmImage); + if (fRight) + { + switch (Globals.iFillStyle) + { + case 0: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + Globals.rgbBack); + hbr = (HBRUSH)GetStockObject(NULL_BRUSH); + break; + + case 1: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + Globals.rgbBack); + hbr = CreateSolidBrush(Globals.rgbFore); + break; + + default: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + Globals.rgbBack); + hbr = CreateSolidBrush(Globals.rgbBack); + break; + } + } + else + { + switch (Globals.iFillStyle) + { + case 0: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + Globals.rgbFore); + hbr = (HBRUSH)GetStockObject(NULL_BRUSH); + break; + + case 1: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + Globals.rgbFore); + hbr = CreateSolidBrush(Globals.rgbBack); + break; + + default: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + Globals.rgbFore); + hbr = CreateSolidBrush(Globals.rgbFore); + break; + } + } + hpenOld = SelectObject(hMemDC, hPen); + hbrOld = SelectObject(hMemDC, hbr); + Polygon(hMemDC, Globals.pPolyline, Globals.cPolyline); + SelectObject(hMemDC, hpenOld); + SelectObject(hMemDC, hbrOld); + SelectObject(hMemDC, hbmOld); + DeleteObject(hPen); + DeleteObject(hbr); + DeleteDC(hMemDC); + } + ReleaseDC(hWnd, hDC); + } + HeapFree(GetProcessHeap(), 0, Globals.pPolyline); + Globals.pPolyline = NULL; + Globals.cPolyline = 0; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + + default: + break; + } } VOID Canvas_OnButtonUp(HWND hWnd, INT x, INT y, BOOL fRight) @@ -981,6 +1120,14 @@ VOID Canvas_OnButtonUp(HWND hWnd, INT x, INT y, BOOL fRight) Globals.mode = MODE_NORMAL; switch (Globals.iToolSelect) { + case TOOL_POLYGON: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pPolyline[Globals.cPolyline - 1] = pt; + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_CURVE: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -1299,6 +1446,10 @@ LRESULT CALLBACK CanvasWndProc(HWND hWnd, UINT uMsg, ReleaseCapture(); Globals.mode = MODE_NORMAL; Globals.ipt = 0; + if (Globals.pPolyline != NULL) + HeapFree(GetProcessHeap(), 0, Globals.pPolyline); + Globals.pPolyline = NULL; + Globals.cPolyline = 0; InvalidateRect(hWnd, NULL, FALSE); UpdateWindow(hWnd); } diff --git a/programs/paint/eraser.bmp b/programs/paint/eraser.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6e4739ba94ccd3029ae6ee655c49fc536e7ffcd5 GIT binary patch literal 9174 zcmeH|K@Ng25Jlk@?%i+#58xW_=&8JpHl-nxUlve*)x_6?GBZs7hu4H&Z;$hk$0f~E zx#n~qhf}WK%k!L+>B;yp0&#aF?)s+U6;phT1R_|8jV`s6c*V4CHddmM#737|O1xrP zHybO_NMfT4QV@Uu1R&5rKz_?h+MsiE3BHNIQD_bQaQ+PEhOJ=<1Rwwb2tc3*0Xh16 vSZr$IyNShK{1#{Xhad<62tWV=5P-lQ0_)Mgr`g!^Z@xx!NI?Js?+|zaZBv(W literal 0 HcmV?d00001 diff --git a/programs/paint/main.c b/programs/paint/main.c index d6a6a67..b2de76b 100644 --- a/programs/paint/main.c +++ b/programs/paint/main.c @@ -604,6 +604,7 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) break; case TOOL_BOX: + case TOOL_POLYGON: case TOOL_ROUNDRECT: case TOOL_ELLIPSE: hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_FILL)); @@ -649,6 +650,10 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) Globals.iToolSelect = i; Globals.iToolClicking = -1; Globals.ipt = 0; + if (Globals.pPolyline != NULL) + HeapFree(GetProcessHeap(), 0, Globals.pPolyline); + Globals.pPolyline = NULL; + Globals.cPolyline = 0; SetRectEmpty((RECT*)&Globals.pt0); InvalidateRect(Globals.hCanvasWnd, NULL, TRUE); UpdateWindow(Globals.hCanvasWnd); @@ -663,7 +668,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_AIRBRUSH: case TOOL_FILL: case TOOL_ERASER: - case TOOL_POLYGON: NotSupportedYet(); break; @@ -687,6 +691,7 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_BOX: case TOOL_ROUNDRECT: case TOOL_ELLIPSE: + case TOOL_POLYGON: for (i = 0; i < 3; i++) { rc.left = 6; @@ -890,6 +895,8 @@ VOID PAINT_OnDestroy(HWND hWnd) DestroyCursor(Globals.hcurZoom); DestroyCursor(Globals.hcurCross2); KillTimer(Globals.hCanvasWnd, Globals.idTimer); + if (Globals.pPolyline != NULL) + HeapFree(GetProcessHeap(), 0, Globals.pPolyline); } static LRESULT CALLBACK PaintWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, diff --git a/programs/paint/main.h b/programs/paint/main.h index 5cb8294..41945d7 100644 --- a/programs/paint/main.h +++ b/programs/paint/main.h @@ -122,6 +122,9 @@ typedef struct POINT pt3; INT ipt; COLORREF rgbPrev; + + INT cPolyline; + POINT *pPolyline; } PAINT_GLOBALS; extern PAINT_GLOBALS Globals; -- 1.6.0.2