From ac5d0bc6855e612417fba2643835f795806a137f Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 25 Oct 2008 10:57:23 +0900 Subject: [PATCH] [2/19] paint: Add TOOL_LINE --- programs/paint/canvas.c | 75 +++++++++++++++++++++++++++++++++++++++++++++ programs/paint/line.bmp | Bin 0 -> 670 bytes programs/paint/main.c | 56 +++++++++++++++++++++++++++++---- programs/paint/resource.h | 1 + programs/paint/rsrc.rc | 2 + 5 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 programs/paint/line.bmp diff --git a/programs/paint/canvas.c b/programs/paint/canvas.c index 0adb108..3d18902 100644 --- a/programs/paint/canvas.c +++ b/programs/paint/canvas.c @@ -59,6 +59,28 @@ VOID PrepareForUndo(VOID) VOID Canvas_DrawBuffer(HDC hDC) { + HDC hMemDC; + HPEN hPen; + HBRUSH hbr; + HGDIOBJ hbmOld, hpenOld, hbrOld; + + switch(Globals.iToolSelect) + { + case TOOL_LINE: + hPen = CreatePen(PS_SOLID, Globals.nLineWidth, Globals.fSwapColor ? + Globals.rgbBack : Globals.rgbFore); + hpenOld = SelectObject(hDC, hPen); + MoveToEx(hDC, Globals.pt0.x, Globals.pt0.y, NULL); + LineTo(hDC, Globals.pt1.x, Globals.pt1.y); + SetPixel(hDC, Globals.pt1.x, Globals.pt1.y, Globals.fSwapColor ? + Globals.rgbBack : Globals.rgbFore); + SelectObject(hDC, hpenOld); + DeleteObject(hPen); + break; + + default: + break; + } } VOID Canvas_OnPaint(HWND hWnd, HDC hDC) @@ -307,6 +329,14 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) Globals.pt0 = pt; break; + case TOOL_LINE: + SetCursor(Globals.hcurCross2); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + CanvasToImage(&pt); + Globals.pt0 = Globals.pt1 = pt; + break; + default: break; } @@ -407,6 +437,16 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown case MODE_CANVAS: switch (Globals.iToolSelect) { + case TOOL_LINE: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pt1 = pt; + ShowSize(Globals.pt1.x - Globals.pt0.x, + Globals.pt1.y - Globals.pt0.y); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_PENCIL: SetCursor(Globals.hcurPencil); CanvasToImage(&pt); @@ -450,6 +490,14 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { switch (Globals.iToolSelect) { + case TOOL_LINE: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pt1 = pt; + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_PENCIL: SetCursor(Globals.hcurPencil); CanvasToImage(&pt); @@ -671,6 +719,33 @@ VOID Canvas_OnButtonUp(HWND hWnd, INT x, INT y, BOOL fRight) UpdateWindow(hWnd); break; + case TOOL_LINE: + CanvasToImage(&pt); + PrepareForUndo(); + hDC = GetDC(hWnd); + if (hDC != NULL) + { + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + HPEN hPen = CreatePen(PS_SOLID, Globals.nLineWidth, fRight ? + Globals.rgbBack : Globals.rgbFore); + HGDIOBJ hpenOld = SelectObject(hMemDC, hPen); + HGDIOBJ hbmOld = SelectObject(hMemDC, Globals.hbmImage); + MoveToEx(hMemDC, Globals.pt0.x , Globals.pt0.y, NULL); + LineTo(hMemDC, pt.x, pt.y); + SetPixel(hMemDC, pt.x, pt.y, fRight ? Globals.rgbBack : + Globals.rgbFore); + SelectObject(hMemDC, hbmOld); + SelectObject(hMemDC, hpenOld); + DeleteObject(hPen); + DeleteDC(hMemDC); + Globals.fModified = TRUE; + } + ReleaseDC(hWnd, hDC); + } + break; + default: break; } diff --git a/programs/paint/line.bmp b/programs/paint/line.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9a27bce3f43b98121f5eaf095009fdc0bbaa3e81 GIT binary patch literal 670 zcmZ?royWug26jMF1B!isG$Rm#Kmt@A%t0dl|NqYb#6Xe(C;b2@#}CAWXhP