From 366679f186d2b4fab0e71e495140fec5354cf7e8 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 1 Nov 2008 23:23:43 +0900 Subject: [PATCH] [5/19] mspaint: Add TOOL_MAGNIFIER --- programs/mspaint/canvas.c | 113 +++++++++++++++++++++++++++++++++++++++++++ programs/mspaint/main.c | 73 +++++++++++++++++++++++++++- programs/mspaint/main.h | 1 + programs/mspaint/resource.h | 1 + programs/mspaint/rsrc.rc | 4 ++ programs/mspaint/zoom.bmp | Bin 0 -> 670 bytes programs/mspaint/zoom.cur | Bin 0 -> 326 bytes 7 files changed, 191 insertions(+), 1 deletions(-) create mode 100644 programs/mspaint/zoom.bmp create mode 100644 programs/mspaint/zoom.cur diff --git a/programs/mspaint/canvas.c b/programs/mspaint/canvas.c index f471bd8..dc02916 100644 --- a/programs/mspaint/canvas.c +++ b/programs/mspaint/canvas.c @@ -173,6 +173,65 @@ VOID Canvas_DrawBuffer(HDC hDC) DeleteObject(hbr); break; + case TOOL_MAGNIFIER: + if (Globals.nZoom == 1) + { + POINT pt, pt0, pt1; + 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)) + { + GetClientRect(Globals.hCanvasWnd, &rc); + hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); + hbr = (HBRUSH)GetStockObject(NULL_BRUSH); + hbrOld = SelectObject(hDC, hbr); + hpenOld = SelectObject(hDC, hPen); + SetROP2(hDC, R2_XORPEN); + + pt0.x = pt.x - (rc.right - rc.left) / 4 / 2; + if (pt0.x < 0) + pt0.x = 0; + if (pt.x + (rc.right - rc.left) / 4 / 2 > Globals.sizImage.cx) + pt0.x = Globals.sizImage.cx - (rc.right - rc.left) / 4; + if (pt0.x < 0) + { + pt0.x = 0; + pt1.x = Globals.sizImage.cx; + } + else + { + pt1.x = pt0.x + (rc.right - rc.left) / 4; + } + + pt0.y = pt.y - (rc.bottom - rc.top) / 4 / 2; + if (pt0.y < 0) + pt0.y = 0; + if (pt.y + (rc.bottom - rc.top) / 4 / 2 > Globals.sizImage.cy) + pt0.y = Globals.sizImage.cy - (rc.bottom - rc.top) / 4; + if (pt0.y < 0) + { + pt0.y = 0; + pt1.y = Globals.sizImage.cy; + } + else + { + pt1.y = pt0.y + (rc.bottom - rc.top) / 4; + } + + Rectangle(hDC, pt0.x, pt0.y, pt1.x, pt1.y); + SetROP2(hDC, R2_COPYPEN); + SelectObject(hDC, hbrOld); + SelectObject(hDC, hpenOld); + DeleteObject(hPen); + } + } + break; + default: break; } @@ -401,6 +460,45 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) { switch (Globals.iToolSelect) { + case TOOL_MAGNIFIER: + CanvasToImage(&pt); + GetClientRect(hWnd, &rc); + + pt0.x = pt.x - (rc.right - rc.left) / 4 / 2; + if (pt0.x < 0) + pt0.x = 0; + if (pt.x + (rc.right - rc.left) / 4 / 2 > Globals.sizImage.cx) + pt0.x = Globals.sizImage.cx - (rc.right - rc.left) / 4; + if (pt0.x < 0) + { + pt0.x = 0; + } + + pt0.y = pt.y - (rc.bottom - rc.top) / 4 / 2; + if (pt0.y < 0) + pt0.y = 0; + if (pt.y + (rc.bottom - rc.top) / 4 / 2 > Globals.sizImage.cy) + pt0.y = Globals.sizImage.cy - (rc.bottom - rc.top) / 4; + if (pt0.y < 0) + { + pt0.y = 0; + } + Globals.iToolSelect = Globals.iToolPrev; + Globals.iToolClicking = -1; + Globals.ipt = 0; + InvalidateRect(Globals.hToolBox, NULL, TRUE); + UpdateWindow(Globals.hToolBox); + + if (Globals.nZoom == 1) + { + if (rc.right - rc.left < Globals.sizImage.cx) pt.x = 0; + if (rc.bottom - rc.top < Globals.sizImage.cy) pt.y = 0; + PAINT_Zoom2(pt0.x, pt0.y, 4); + } + else + PAINT_Zoom(1); + break; + case TOOL_PENCIL: SetCursor(Globals.hcurPencil); Globals.mode = MODE_CANVAS; @@ -751,6 +849,16 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { switch (Globals.iToolSelect) { + case TOOL_MAGNIFIER: + SetCursor(Globals.hcurZoom); + CanvasToImage(&pt); + Globals.pt0 = pt; + ShowPos(pt); + ShowNoSize(); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_PENCIL: SetCursor(Globals.hcurPencil); CanvasToImage(&pt); @@ -770,6 +878,11 @@ 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) + { + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + } return; } } diff --git a/programs/mspaint/main.c b/programs/mspaint/main.c index d9e8eab..d6a6a67 100644 --- a/programs/mspaint/main.c +++ b/programs/mspaint/main.c @@ -289,6 +289,7 @@ static VOID PAINT_InitData(VOID) Globals.hcurBDiagonal = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(3)); Globals.hcurFDiagonal = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(4)); Globals.hcurPencil = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(5)); + Globals.hcurZoom = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(9)); Globals.hcurCross2 = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(12)); Globals.nLineWidth = 1; @@ -564,6 +565,44 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) InvertRect(hDC, &rc); break; + case TOOL_MAGNIFIER: + hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_ZOOM)); + 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.nZoom) + { + case 1: + rc.top = 210 + (290 - 210) * 0 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + + case 2: + rc.top = 210 + (290 - 210) * 1 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + + case 6: + rc.top = 210 + (290 - 210) * 2 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + + case 8: + rc.top = 210 + (290 - 210) * 3 / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + } + break; + case TOOL_BOX: case TOOL_ROUNDRECT: case TOOL_ELLIPSE: @@ -625,7 +664,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_FILL: case TOOL_ERASER: case TOOL_POLYGON: - case TOOL_MAGNIFIER: NotSupportedYet(); break; @@ -666,6 +704,38 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) } break; + case TOOL_MAGNIFIER: + 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)) + { + switch (i) + { + case 0: + PAINT_Zoom(1); + break; + case 1: + PAINT_Zoom(2); + break; + case 2: + PAINT_Zoom(6); + break; + case 3: + PAINT_Zoom(8); + break; + } + Globals.iToolSelect = Globals.iToolPrev; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + } + } + break; + case TOOL_LINE: case TOOL_CURVE: rc.left = 6; @@ -817,6 +887,7 @@ VOID PAINT_OnDestroy(HWND hWnd) DestroyCursor(Globals.hcurHorizontal); DestroyCursor(Globals.hcurVertical); DestroyCursor(Globals.hcurPencil); + DestroyCursor(Globals.hcurZoom); DestroyCursor(Globals.hcurCross2); KillTimer(Globals.hCanvasWnd, Globals.idTimer); } diff --git a/programs/mspaint/main.h b/programs/mspaint/main.h index b016f09..5cb8294 100644 --- a/programs/mspaint/main.h +++ b/programs/mspaint/main.h @@ -100,6 +100,7 @@ typedef struct HCURSOR hcurHorizontal; HCURSOR hcurVertical; HCURSOR hcurPencil; + HCURSOR hcurZoom; HCURSOR hcurCross2; UINT idTimer; diff --git a/programs/mspaint/resource.h b/programs/mspaint/resource.h index d85872b..33b75bd 100644 --- a/programs/mspaint/resource.h +++ b/programs/mspaint/resource.h @@ -23,6 +23,7 @@ #define SELECTION_MENU 0x203 #define ID_ACCEL 0x204 #define IDB_TOOLS 0x205 +#define IDB_ZOOM 0x20C #define IDB_LINE 0x20D #define IDB_FILL 0x20F #define IDD_ZOOM 0x207 diff --git a/programs/mspaint/rsrc.rc b/programs/mspaint/rsrc.rc index 5435e7d..74453cc 100644 --- a/programs/mspaint/rsrc.rc +++ b/programs/mspaint/rsrc.rc @@ -61,6 +61,8 @@ IDI_PAINT ICON "paint.ico" /* @makedep: tools.bmp */ IDB_TOOLS BITMAP "tools.bmp" +/* @makedep: zoom.bmp */ +IDB_ZOOM BITMAP "zoom.bmp" /* @makedep: line.bmp */ IDB_LINE BITMAP "line.bmp" /* @makedep: fill.bmp */ @@ -76,6 +78,8 @@ IDB_FILL BITMAP "fill.bmp" 4 CURSOR "fdiagon.cur" /* @makedep: pencil.cur */ 5 CURSOR "pencil.cur" +/* @makedep: zoom.cur */ +9 CURSOR "zoom.cur" /* @makedep: cross2.cur */ 12 CURSOR "cross2.cur" diff --git a/programs/mspaint/zoom.bmp b/programs/mspaint/zoom.bmp new file mode 100644 index 0000000000000000000000000000000000000000..af8c0abe5649b9bcb9187795af14bc74c1702c99 GIT binary patch literal 670 zcmcJM!41MN3`JA+;LZ{Ssb|=MMM4hUgHiO-x2^a$84l-F zu(d_p)V&8ge7cUcZekWhBw!`s#P2V%Q}O#a}mbTAF3_%aP&+>n+q*I6e}W7mVri`t05l m6dujUf5_