From 5cbe4b2ed5afcf317e7482483d3e689c45d57d18 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 1 Nov 2008 23:22:56 +0900 Subject: [PATCH] [4/19] mspaint: Add TOOL_CURVE --- programs/mspaint/canvas.c | 117 +++++++++++++++++++++++++++++++++++++++++++++ programs/mspaint/main.c | 3 +- 2 files changed, 119 insertions(+), 1 deletions(-) diff --git a/programs/mspaint/canvas.c b/programs/mspaint/canvas.c index 4c8d416..f471bd8 100644 --- a/programs/mspaint/canvas.c +++ b/programs/mspaint/canvas.c @@ -82,6 +82,15 @@ VOID Canvas_DrawBuffer(HDC hDC) switch(Globals.iToolSelect) { + case TOOL_CURVE: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, Globals.fSwapColor ? + Globals.rgbBack : Globals.rgbFore); + hpenOld = SelectObject(hDC, hPen); + PolyBezier(hDC, &Globals.pt0, 4); + SelectObject(hDC, hpenOld); + DeleteObject(hPen); + break; + case TOOL_LINE: hPen = CreatePen(PS_SOLID, Globals.nLineWidth, Globals.fSwapColor ? Globals.rgbBack : Globals.rgbFore); @@ -415,6 +424,34 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) Globals.pt0 = pt; break; + case TOOL_CURVE: + SetCursor(Globals.hcurCross2); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + CanvasToImage(&pt); + switch (Globals.ipt) + { + case 0: + Globals.pt0 = Globals.pt1 = Globals.pt2 = Globals.pt3 = pt; + Globals.ipt = 1; + break; + + case 1: + Globals.pt2 = Globals.pt3 = pt; + break; + + case 2: + Globals.pt1 = pt; + break; + + case 3: + Globals.pt2 = pt; + break; + } + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_LINE: case TOOL_BOX: case TOOL_ELLIPSE: @@ -526,6 +563,25 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown case MODE_CANVAS: switch (Globals.iToolSelect) { + case TOOL_CURVE: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + if (Globals.ipt == 1) + { + Globals.pt2 = Globals.pt3 = pt; + } + else if (Globals.ipt == 2) + { + Globals.pt1 = pt; + } + else if (Globals.ipt == 3) + { + Globals.pt2 = pt; + } + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_LINE: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -591,6 +647,25 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { switch (Globals.iToolSelect) { + case TOOL_CURVE: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + if (Globals.ipt == 1) + { + Globals.pt2 = Globals.pt3 = pt; + } + else if (Globals.ipt == 2) + { + Globals.pt1 = pt; + } + else if (Globals.ipt == 3) + { + Globals.pt2 = pt; + } + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_LINE: case TOOL_BOX: case TOOL_ELLIPSE: @@ -793,6 +868,48 @@ VOID Canvas_OnButtonUp(HWND hWnd, INT x, INT y, BOOL fRight) Globals.mode = MODE_NORMAL; switch (Globals.iToolSelect) { + case TOOL_CURVE: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + if (Globals.ipt == 1) + { + Globals.pt2 = Globals.pt3 = pt; + Globals.ipt = 2; + } + else if (Globals.ipt == 2) + { + Globals.pt1 = pt; + Globals.ipt = 3; + } + else if (Globals.ipt == 3) + { + Globals.pt2 = pt; + Globals.ipt = 0; + PrepareForUndo(); + hDC = GetDC(hWnd); + if (hDC != NULL) + { + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + HPEN hPen; + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, + fRight ? Globals.rgbBack : Globals.rgbFore); + hbmOld = SelectObject(hMemDC, Globals.hbmImage); + SelectObject(hMemDC, hPen); + PolyBezier(hMemDC, &Globals.pt0, 4); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + DeleteObject(hPen); + Globals.fModified = TRUE; + } + ReleaseDC(hWnd, hDC); + } + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + } + break; + case TOOL_PENCIL: CanvasToImage(&pt); hDC = GetDC(hWnd); diff --git a/programs/mspaint/main.c b/programs/mspaint/main.c index e0376a6..d9e8eab 100644 --- a/programs/mspaint/main.c +++ b/programs/mspaint/main.c @@ -547,6 +547,7 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) switch (Globals.iToolSelect) { case TOOL_LINE: + case TOOL_CURVE: hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_LINE)); hbmOld = SelectObject(hdcMem, hbm); BitBlt(hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, @@ -625,7 +626,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_ERASER: case TOOL_POLYGON: case TOOL_MAGNIFIER: - case TOOL_CURVE: NotSupportedYet(); break; @@ -667,6 +667,7 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) break; case TOOL_LINE: + case TOOL_CURVE: rc.left = 6; rc.right = 48; for (i = 0; i < 5; i++) -- 1.6.0.2