From 87cccea3e79f1c49fcdd6cd6736ea679302c678d Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 25 Oct 2008 11:02:14 +0900 Subject: [PATCH] [7/19] paint: Add TOOL_ERASER --- programs/paint/canvas.c | 106 ++++++++++++++++++++++++++++++++++++++++++++- programs/paint/main.c | 57 ++++++++++++++++++++++++- programs/paint/main.h | 1 + programs/paint/resource.h | 1 + programs/paint/rsrc.rc | 2 + 5 files changed, 165 insertions(+), 2 deletions(-) diff --git a/programs/paint/canvas.c b/programs/paint/canvas.c index 9b468c9..64c7733 100644 --- a/programs/paint/canvas.c +++ b/programs/paint/canvas.c @@ -82,6 +82,29 @@ VOID Canvas_DrawBuffer(HDC hDC) switch(Globals.iToolSelect) { + case TOOL_ERASER: + { + POINT pt; + RECT rc; + GetCursorPos(&pt); + ScreenToClient(Globals.hCanvasWnd, &pt); + CanvasToImage(&pt); + rc.left = rc.top = 0; + rc.right = Globals.sizImage.cx; + rc.bottom = Globals.sizImage.cy; + if (PtInRect(&rc, pt)) + { + SelectObject(hDC, GetStockObject(WHITE_BRUSH)); + SelectObject(hDC, GetStockObject(BLACK_PEN)); + Rectangle(hDC, + pt.x - Globals.nEraserSize / 2, + pt.y - Globals.nEraserSize / 2, + pt.x + Globals.nEraserSize / 2, + pt.y + Globals.nEraserSize / 2); + } + } + break; + case TOOL_CURVE: hPen = CreatePen(PS_SOLID, Globals.nLineWidth, Globals.fSwapColor ? Globals.rgbBack : Globals.rgbFore); @@ -507,6 +530,38 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) PAINT_Zoom(1); break; + case TOOL_ERASER: + if (!fRight) + { + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + SetCursor(NULL); + CanvasToImage(&pt); + PrepareForUndo(); + hDC = GetDC(hWnd); + if (hDC != NULL) + { + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + hbmOld = SelectObject(hMemDC, Globals.hbmImage); + rc.left = pt.x - Globals.nEraserSize / 2; + rc.top = pt.y - Globals.nEraserSize / 2; + rc.right = rc.left + Globals.nEraserSize; + rc.bottom = rc.top + Globals.nEraserSize; + hbr = CreateSolidBrush(Globals.rgbBack); + FillRect(hMemDC, &rc, hbr); + DeleteObject(hbr); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + Globals.fModified = TRUE; + } + ReleaseDC(hWnd, hDC); + } + Globals.pt0 = pt; + } + break; + case TOOL_PENCIL: SetCursor(Globals.hcurPencil); Globals.mode = MODE_CANVAS; @@ -601,6 +656,20 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) } } +VOID CALLBACK EraserDDAProc(INT x, INT y, LPARAM lParam) +{ + RECT rc; + HDC hMemDC = (HDC)lParam; + HBRUSH hbr; + rc.left = x - Globals.nEraserSize / 2; + rc.top = y - Globals.nEraserSize / 2; + rc.right = rc.left + Globals.nEraserSize; + rc.bottom = rc.top + Globals.nEraserSize; + hbr = CreateSolidBrush(Globals.rgbBack); + FillRect(hMemDC, &rc, hbr); + DeleteObject(hbr); +} + VOID ShowPos(POINT pt) { WCHAR sz[64]; @@ -695,6 +764,31 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown case MODE_CANVAS: switch (Globals.iToolSelect) { + case TOOL_ERASER: + SetCursor(NULL); + CanvasToImage(&pt); + hDC = GetDC(hWnd); + if (hDC != NULL) + { + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + HGDIOBJ hbmOld = SelectObject(hMemDC, Globals.hbmImage); + LineDDA(Globals.pt0.x, Globals.pt0.y, pt.x, pt.y, + EraserDDAProc, (LPARAM)hMemDC); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + Globals.fModified = TRUE; + } + ReleaseDC(hWnd, hDC); + } + Globals.pt0 = pt; + ShowPos(pt); + ShowNoSize(); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_POLYGON: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -909,6 +1003,16 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown UpdateWindow(hWnd); break; + case TOOL_ERASER: + SetCursor(NULL); + CanvasToImage(&pt); + Globals.pt0 = pt; + ShowPos(pt); + ShowNoSize(); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_PENCIL: SetCursor(Globals.hcurPencil); CanvasToImage(&pt); @@ -928,7 +1032,7 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { SendMessage(Globals.hStatusBar, SB_SETTEXT, 1 | 0, (LPARAM)empty); SetCursor(Globals.hcurArrow); - if (Globals.iToolSelect == TOOL_MAGNIFIER) + if (Globals.iToolSelect == TOOL_MAGNIFIER || Globals.iToolSelect == TOOL_ERASER) { InvalidateRect(hWnd, NULL, FALSE); UpdateWindow(hWnd); diff --git a/programs/paint/main.c b/programs/paint/main.c index b2de76b..0f0dcc8 100644 --- a/programs/paint/main.c +++ b/programs/paint/main.c @@ -292,6 +292,7 @@ static VOID PAINT_InitData(VOID) Globals.hcurZoom = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(9)); Globals.hcurCross2 = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(12)); + Globals.nEraserSize = 8; Globals.nLineWidth = 1; Globals.iFillStyle = 0; @@ -547,6 +548,44 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) switch (Globals.iToolSelect) { + case TOOL_ERASER: + hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_ERASER)); + hbmOld = SelectObject(hdcMem, hbm); + BitBlt(hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, + hdcMem, 0, 0, SRCCOPY); + SelectObject(hdcMem, hbmOld); + DeleteObject(hbm); + + rc.left = 6; + rc.right = 48; + switch (Globals.nEraserSize) + { + case 4: + rc.top = 210 + (290 - 210) * 0 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + + case 6: + rc.top = 210 + (290 - 210) * 1 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + + case 8: + rc.top = 210 + (290 - 210) * 2 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + + case 10: + rc.top = 210 + (290 - 210) * 3 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + } + break; + case TOOL_LINE: case TOOL_CURVE: hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_LINE)); @@ -667,7 +706,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_BRUSH: case TOOL_AIRBRUSH: case TOOL_FILL: - case TOOL_ERASER: NotSupportedYet(); break; @@ -709,6 +747,23 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) } break; + case TOOL_ERASER: + rc.left = 6; + rc.right = 48; + for (i = 0; i < 4; i++) + { + rc.top = 210 + (290 - 210) * i / 4; + rc.bottom = rc.top + (290 - 210) / 4; + if (PtInRect(&rc, pt)) + { + Globals.nEraserSize = 4 + i * 2; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + } + } + break; + case TOOL_MAGNIFIER: rc.left = 6; rc.right = 48; diff --git a/programs/paint/main.h b/programs/paint/main.h index 41945d7..4e1a537 100644 --- a/programs/paint/main.h +++ b/programs/paint/main.h @@ -108,6 +108,7 @@ typedef struct INT nZoom; BOOL fShowGrid; + INT nEraserSize; INT nLineWidth; INT iFillStyle; diff --git a/programs/paint/resource.h b/programs/paint/resource.h index 33b75bd..2b0c084 100644 --- a/programs/paint/resource.h +++ b/programs/paint/resource.h @@ -23,6 +23,7 @@ #define SELECTION_MENU 0x203 #define ID_ACCEL 0x204 #define IDB_TOOLS 0x205 +#define IDB_ERASER 0x20B #define IDB_ZOOM 0x20C #define IDB_LINE 0x20D #define IDB_FILL 0x20F diff --git a/programs/paint/rsrc.rc b/programs/paint/rsrc.rc index 74453cc..87e10ec 100644 --- a/programs/paint/rsrc.rc +++ b/programs/paint/rsrc.rc @@ -61,6 +61,8 @@ IDI_PAINT ICON "paint.ico" /* @makedep: tools.bmp */ IDB_TOOLS BITMAP "tools.bmp" +/* @makedep: eraser.bmp */ +IDB_ERASER BITMAP "eraser.bmp" /* @makedep: zoom.bmp */ IDB_ZOOM BITMAP "zoom.bmp" /* @makedep: line.bmp */ -- 1.6.0.2