From 350edbfb39e846c5f9d1499afd4dfafd6330b4c3 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 25 Oct 2008 11:09:38 +0900 Subject: [PATCH] [16/19] paint: Add selection handling (TOOL_BOXSELECT) --- programs/paint/canvas.c | 436 ++++++++++++++++++++++++++++++++++++++++++++- programs/paint/main.c | 48 +++++- programs/paint/main.h | 11 ++ programs/paint/move.cur | Bin 0 -> 326 bytes programs/paint/paint.c | 89 ++++++++-- programs/paint/resource.h | 1 + programs/paint/rsrc.rc | 4 + programs/paint/trans.bmp | Bin 0 -> 1638 bytes 8 files changed, 569 insertions(+), 20 deletions(-) create mode 100644 programs/paint/move.cur create mode 100644 programs/paint/trans.bmp diff --git a/programs/paint/canvas.c b/programs/paint/canvas.c index 47656e7..62d8501 100644 --- a/programs/paint/canvas.c +++ b/programs/paint/canvas.c @@ -48,6 +48,24 @@ VOID ImageToCanvas2(POINT *ppt) ppt->y = ppt->y * Globals.nZoom + 4; } +VOID NormalizeRect(RECT *prc) +{ + LONG n; + + if (prc->left > prc->right) + { + n = prc->left; + prc->left = prc->right; + prc->right = n; + } + if (prc->top > prc->bottom) + { + n = prc->top; + prc->top = prc->bottom; + prc->bottom = n; + } +} + INT sgn(INT x) { if (x > 0) return 1; @@ -64,6 +82,45 @@ VOID Regularize(POINT pt0, LPPOINT ppt1) ppt1->y = pt0.y + sgn(ppt1->y - pt0.y) * m; } +HBITMAP Selection_CreateBitmap(VOID) +{ + HDC hDC, hMemDC1, hMemDC2; + HGDIOBJ hbmOld1, hbmOld2; + HBITMAP hbmNew; + SIZE siz; + + hbmNew = NULL; + hDC = GetDC(Globals.hCanvasWnd); + if (hDC != NULL) + { + hMemDC1 = CreateCompatibleDC(hDC); + if (hMemDC1 != NULL) + { + hbmOld1 = SelectObject(hMemDC1, Globals.hbmImage); + hMemDC2 = CreateCompatibleDC(hDC); + if (hMemDC2 != NULL) + { + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_Create(siz); + if (hbmNew != NULL) + { + hbmOld2 = SelectObject(hMemDC2, hbmNew); + BitBlt(hMemDC2, 0, 0, siz.cx, siz.cy, + hMemDC1, Globals.pt0.x, Globals.pt0.y, + SRCCOPY); + SelectObject(hMemDC1, hbmOld2); + } + DeleteDC(hMemDC2); + } + SelectObject(hMemDC1, hbmOld1); + } + ReleaseDC(Globals.hCanvasWnd, hDC); + } + + return hbmNew; +} + VOID PrepareForUndo(VOID) { Globals.fCanUndo = TRUE; @@ -73,6 +130,69 @@ VOID PrepareForUndo(VOID) Globals.sizImageUndo = Globals.sizImage; } +VOID Selection_TakeOff(VOID) +{ + HDC hDC, hMemDC1; + HGDIOBJ hbmOld1; + HBITMAP hbmNew; + HBRUSH hbr; + + if (Globals.fSelect && Globals.hbmSelect == NULL) + { + hbmNew = Selection_CreateBitmap(); + hDC = GetDC(Globals.hCanvasWnd); + if (hDC != NULL) + { + hMemDC1 = CreateCompatibleDC(hDC); + if (hMemDC1 != NULL) + { + hbmOld1 = SelectObject(hMemDC1, Globals.hbmImage); + hbr = CreateSolidBrush(Globals.rgbBack); + FillRect(hMemDC1, (RECT*)&Globals.pt0, hbr); + DeleteObject(hbr); + SelectObject(hMemDC1, hbmOld1); + DeleteDC(hMemDC1); + Globals.fModified = TRUE; + } + ReleaseDC(Globals.hCanvasWnd, hDC); + } + Globals.hbmSelect = hbmNew; + } +} + +VOID Selection_Land(VOID) +{ + HDC hDC, hMemDC1, hMemDC2; + HGDIOBJ hbmOld1, hbmOld2; + + if (Globals.fSelect && Globals.hbmSelect) + { + hDC = GetDC(Globals.hCanvasWnd); + hMemDC1 = CreateCompatibleDC(hDC); + if (hMemDC1 != NULL) + { + hbmOld1 = SelectObject(hMemDC1, Globals.hbmImage); + hMemDC2 = CreateCompatibleDC(hDC); + if (hMemDC2 != NULL) + { + hbmOld2 = SelectObject(hMemDC2, Globals.hbmSelect); + BitBlt(hMemDC1, Globals.pt0.x, Globals.pt0.y, + Globals.pt1.x - Globals.pt0.x, + Globals.pt1.y - Globals.pt0.y, + hMemDC2, 0, 0, SRCCOPY); + SelectObject(hMemDC1, hbmOld2); + DeleteDC(hMemDC2); + } + SelectObject(hMemDC1, hbmOld1); + DeleteDC(hMemDC1); + } + ReleaseDC(Globals.hCanvasWnd, hDC); + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = NULL; + } + Globals.fSelect = FALSE; +} + VOID DrawBrush(HDC hMemDC, INT x, INT y, COLORREF rgb) { switch (Globals.iBrushType) @@ -176,6 +296,35 @@ VOID Canvas_DrawBuffer(HDC hDC) switch(Globals.iToolSelect) { + case TOOL_BOXSELECT: + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + hbmOld = SelectObject(hMemDC, Globals.hbmSelect); + BitBlt(hDC, Globals.pt0.x, Globals.pt0.y, + Globals.pt1.x - Globals.pt0.x, + Globals.pt1.y - Globals.pt0.y, + hMemDC, 0, 0, SRCCOPY); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + } + + if (Globals.mode == MODE_CANVAS) + { + hPen = CreatePen(PS_DOT, 1, 0); + hbr = (HBRUSH)GetStockObject(NULL_BRUSH); + hbrOld = SelectObject(hDC, hbr); + hpenOld = SelectObject(hDC, hPen); + SetROP2(hDC, R2_XORPEN); + Rectangle(hDC, Globals.pt0.x, Globals.pt0.y, + Globals.pt1.x, Globals.pt1.y); + SetROP2(hDC, R2_COPYPEN); + SelectObject(hDC, hbrOld); + SelectObject(hDC, hpenOld); + DeleteObject(hPen); + } + break; + case TOOL_ERASER: { POINT pt; @@ -631,6 +780,62 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) PAINT_Zoom(1); break; + case TOOL_BOXSELECT: + if (fRight) + { + HMENU hMenu, hSubMenu; + Globals.mode = MODE_NORMAL; + ReleaseCapture(); + hMenu = LoadMenu(Globals.hInstance, + MAKEINTRESOURCE(SELECTION_MENU)); + hSubMenu = GetSubMenu(hMenu, 0); + GetCursorPos(&pt); + + SetForegroundWindow(Globals.hMainWnd); + TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, + pt.x, pt.y, 0, Globals.hMainWnd, NULL); + PostMessage(Globals.hMainWnd, WM_NULL, 0, 0); + DestroyMenu(hMenu); + } + else + { + CanvasToImage(&pt); + if (Globals.fSelect) + { + if (PtInRect((RECT*)&Globals.pt0, pt)) + { + SetCursor(Globals.hcurMove); + Globals.mode = MODE_SELECTION; + SetCapture(hWnd); + NormalizeRect((RECT*)&Globals.pt0); + Globals.pt2.x = pt.x - Globals.pt0.x; + Globals.pt2.y = pt.y - Globals.pt0.y; + PrepareForUndo(); + Selection_TakeOff(); + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + { + SetCursor(Globals.hcurCross2); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + Selection_Land(); + Globals.fSelect = FALSE; + Globals.pt0 = Globals.pt1 = pt; + } + } + else + { + SetCursor(Globals.hcurCross2); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + Globals.fSelect = FALSE; + Globals.pt0 = Globals.pt1 = pt; + } + } + break; + case TOOL_ERASER: if (!fRight) { @@ -836,6 +1041,31 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) break; } } + else + { + if (Globals.iToolSelect == TOOL_BOXSELECT) + { + CanvasToImage(&pt); + if (Globals.fSelect && PtInRect((RECT*)&Globals.pt0, pt)) + { + SetCursor(Globals.hcurMove); + NormalizeRect((RECT*)&Globals.pt0); + Globals.pt2.x = pt.x - Globals.pt0.x; + Globals.pt2.y = pt.y - Globals.pt0.y; + Selection_TakeOff(); + SetCapture(hWnd); + Globals.mode = MODE_SELECTION; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + { + SetCursor(Globals.hcurCross2); + Selection_Land(); + Globals.fSelect = FALSE; + } + } + } } VOID CALLBACK EraserDDAProc(INT x, INT y, LPARAM lParam) @@ -943,9 +1173,31 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown } break; + case MODE_SELECTION: + SetCursor(Globals.hcurMove); + CanvasToImage(&pt); + ShowPos(pt); + ShowNoSize(); + OffsetRect((RECT*)&Globals.pt0, + pt.x - Globals.pt0.x - Globals.pt2.x, + pt.y - Globals.pt0.y - Globals.pt2.y); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case MODE_CANVAS: switch (Globals.iToolSelect) { + case TOOL_BOXSELECT: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pt1 = pt; + ShowSize(Globals.pt1.x - Globals.pt0.x, + Globals.pt1.y - Globals.pt0.x); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_BRUSH: SetCursor(Globals.hcurCross); CanvasToImage(&pt); @@ -1260,6 +1512,20 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { switch (Globals.iToolSelect) { + case TOOL_BOXSELECT: + if (Globals.fSelect && PtInRect((RECT*)&Globals.pt0, pt)) + { + SetCursor(Globals.hcurMove); + } + else + { + SetCursor(Globals.hcurCross2); + } + CanvasToImage(&pt); + ShowPos(pt); + ShowNoSize(); + break; + case TOOL_MAGNIFIER: SetCursor(Globals.hcurZoom); CanvasToImage(&pt); @@ -1329,11 +1595,18 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown else { SendMessage(Globals.hStatusBar, SB_SETTEXT, 1 | 0, (LPARAM)empty); - SetCursor(Globals.hcurArrow); - if (Globals.iToolSelect == TOOL_MAGNIFIER || Globals.iToolSelect == TOOL_ERASER) + if (Globals.fSelect && PtInRect((RECT*)&Globals.pt0, pt)) { - InvalidateRect(hWnd, NULL, FALSE); - UpdateWindow(hWnd); + SetCursor(Globals.hcurMove); + } + else + { + SetCursor(Globals.hcurArrow); + if (Globals.iToolSelect == TOOL_MAGNIFIER || Globals.iToolSelect == TOOL_ERASER) + { + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + } } return; } @@ -1369,6 +1642,29 @@ VOID Canvas_Resize(HWND hWnd, SIZE sizNew) ShowLastError(); } +VOID Selection_Stretch(HWND hWnd, SIZE sizNew) +{ + HBITMAP hbmNew; + SIZE siz; + Selection_TakeOff(); + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_CreateStretched(hWnd, sizNew, Globals.hbmSelect, siz); + if (hbmNew != NULL) + { + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = hbmNew; + Globals.pt1.x = Globals.pt0.x + sizNew.cx; + Globals.pt1.y = Globals.pt0.y + sizNew.cy; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + ShowLastError(); +} + VOID Canvas_Stretch(HWND hWnd, SIZE sizNew) { HBITMAP hbmNew = BM_CreateStretched(hWnd, sizNew, @@ -1398,6 +1694,27 @@ VOID Canvas_Stretch(HWND hWnd, SIZE sizNew) ShowLastError(); } +VOID Selection_HFlip(HWND hWnd) +{ + HBITMAP hbmNew; + SIZE siz; + Selection_TakeOff(); + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_CreateHFliped(hWnd, Globals.hbmSelect, siz); + if (hbmNew != NULL) + { + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = hbmNew; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + ShowLastError(); +} + VOID Canvas_HFlip(HWND hWnd) { HBITMAP hbmNew = BM_CreateHFliped(hWnd, Globals.hbmImage, @@ -1415,6 +1732,27 @@ VOID Canvas_HFlip(HWND hWnd) ShowLastError(); } +VOID Selection_VFlip(HWND hWnd) +{ + HBITMAP hbmNew; + SIZE siz; + Selection_TakeOff(); + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_CreateVFliped(hWnd, Globals.hbmSelect, siz); + if (hbmNew != NULL) + { + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = hbmNew; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + ShowLastError(); +} + VOID Canvas_VFlip(HWND hWnd) { HBITMAP hbmNew = BM_CreateVFliped(Globals.hCanvasWnd, @@ -1432,6 +1770,30 @@ VOID Canvas_VFlip(HWND hWnd) ShowLastError(); } +VOID Selection_Rotate90Degree(HWND hWnd) +{ + SIZE siz; + HBITMAP hbmNew; + Selection_TakeOff(); + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_CreateRotated90Degree(hWnd, + Globals.hbmSelect, siz); + if (hbmNew != NULL) + { + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = hbmNew; + Globals.pt1.x = Globals.pt0.x + siz.cy; + Globals.pt1.y = Globals.pt0.y + siz.cx; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + ShowLastError(); +} + VOID Canvas_Rotate90Degree(HWND hWnd) { SIZE siz; @@ -1463,6 +1825,28 @@ VOID Canvas_Rotate90Degree(HWND hWnd) ShowLastError(); } +VOID Selection_Rotate180Degree(HWND hWnd) +{ + HBITMAP hbmNew; + SIZE siz; + Selection_TakeOff(); + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_CreateRotated180Degree(hWnd, + Globals.hbmSelect, siz); + if (hbmNew != NULL) + { + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = hbmNew; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + ShowLastError(); +} + VOID Canvas_Rotate180Degree(HWND hWnd) { HBITMAP hbmNew = BM_CreateRotated180Degree(hWnd, @@ -1483,6 +1867,30 @@ VOID Canvas_Rotate180Degree(HWND hWnd) ShowLastError(); } +VOID Selection_Rotate270Degree(HWND hWnd) +{ + SIZE siz; + HBITMAP hbmNew; + Selection_TakeOff(); + siz.cx = Globals.pt1.x - Globals.pt0.x; + siz.cy = Globals.pt1.y - Globals.pt0.y; + hbmNew = BM_CreateRotated270Degree(hWnd, + Globals.hbmSelect, siz); + if (hbmNew != NULL) + { + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = hbmNew; + Globals.pt1.x = Globals.pt0.x + siz.cy; + Globals.pt1.y = Globals.pt0.y + siz.cx; + Globals.fModified = TRUE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + else + ShowLastError(); +} + VOID Canvas_Rotate270Degree(HWND hWnd) { SIZE siz; @@ -1662,11 +2070,31 @@ VOID Canvas_OnButtonUp(HWND hWnd, INT x, INT y, BOOL fRight) UpdateWindow(hWnd); break; + case MODE_SELECTION: + ReleaseCapture(); + Globals.mode = MODE_NORMAL; + break; + case MODE_CANVAS: ReleaseCapture(); Globals.mode = MODE_NORMAL; switch (Globals.iToolSelect) { + case TOOL_BOXSELECT: + SetCursor(Globals.hcurCross2); + CanvasToImage(&pt); + Globals.pt1 = pt; + NormalizeRect((RECT*)&Globals.pt0); + rc.left = rc.top = 0; + rc.right = Globals.sizImage.cx; + rc.bottom = Globals.sizImage.cy; + IntersectRect((RECT*)&Globals.pt0, (RECT*)&Globals.pt0, &rc); + Globals.fSelect = !IsRectEmpty((RECT*)&Globals.pt0); + Globals.hbmSelect = NULL; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + case TOOL_POLYGON: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); diff --git a/programs/paint/main.c b/programs/paint/main.c index 455b587..330915b 100644 --- a/programs/paint/main.c +++ b/programs/paint/main.c @@ -294,8 +294,10 @@ static VOID PAINT_InitData(VOID) Globals.hcurAirBrush = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(8)); Globals.hcurZoom = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(9)); Globals.hcurCross = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(10)); + Globals.hcurMove = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(11)); Globals.hcurCross2 = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(12)); + Globals.fTransparent = FALSE; Globals.nAirBrushRadius = 6; Globals.nEraserSize = 8; Globals.nLineWidth = 1; @@ -690,6 +692,22 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) InvertRect(hDC, &rc); break; + case TOOL_BOXSELECT: + case TOOL_POLYSELECT: + hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_TRANS)); + 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.top = 210 + (290 - 210) * Globals.fTransparent / 2; + rc.right = 48; + rc.bottom = rc.top + (290 - 210) / 2; + InvertRect(hDC, &rc); + break; + case TOOL_AIRBRUSH: hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_AIRBRUSH)); hbmOld = SelectObject(hdcMem, hbm); @@ -757,6 +775,7 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) HeapFree(GetProcessHeap(), 0, Globals.pPolyline); Globals.pPolyline = NULL; Globals.cPolyline = 0; + Selection_Land(); SetRectEmpty((RECT*)&Globals.pt0); InvalidateRect(Globals.hCanvasWnd, NULL, TRUE); UpdateWindow(Globals.hCanvasWnd); @@ -768,7 +787,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) break; case TOOL_POLYSELECT: - case TOOL_BOXSELECT: case TOOL_TEXT: NotSupportedYet(); break; @@ -847,6 +865,33 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) } break; + case TOOL_BOXSELECT: + case TOOL_POLYSELECT: + rc.left = 6; + rc.top = 210 + (290 - 210) * 0 / 2; + rc.right = 48; + rc.bottom = rc.top + (290 - 210) / 2; + if (PtInRect(&rc, pt)) + { + Globals.fTransparent = FALSE; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + } + rc.left = 6; + rc.top = 210 + (290 - 210) * 1 / 2; + rc.right = 48; + rc.bottom = rc.top + (290 - 210) / 2; + if (PtInRect(&rc, pt)) + { + Globals.fTransparent = TRUE; + NotSupportedYet(); + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + } + break; + case TOOL_MAGNIFIER: rc.left = 6; rc.right = 48; @@ -1071,6 +1116,7 @@ VOID PAINT_OnDestroy(HWND hWnd) DestroyCursor(Globals.hcurAirBrush); DestroyCursor(Globals.hcurZoom); DestroyCursor(Globals.hcurCross); + DestroyCursor(Globals.hcurMove); DestroyCursor(Globals.hcurCross2); KillTimer(Globals.hCanvasWnd, Globals.idTimer); if (Globals.pPolyline != NULL) diff --git a/programs/paint/main.h b/programs/paint/main.h index 57bda1c..f1b62c6 100644 --- a/programs/paint/main.h +++ b/programs/paint/main.h @@ -105,6 +105,7 @@ typedef struct HCURSOR hcurAirBrush; HCURSOR hcurZoom; HCURSOR hcurCross; + HCURSOR hcurMove; HCURSOR hcurCross2; UINT idTimer; @@ -113,6 +114,7 @@ typedef struct INT nZoom; BOOL fShowGrid; + BOOL fTransparent; INT nAirBrushRadius; INT nEraserSize; INT nLineWidth; @@ -151,6 +153,15 @@ VOID Canvas_VFlip(HWND hWnd); VOID Canvas_Rotate90Degree(HWND hWnd); VOID Canvas_Rotate180Degree(HWND hWnd); VOID Canvas_Rotate270Degree(HWND hWnd); +HBITMAP Selection_CreateBitmap(VOID); +VOID Selection_TakeOff(VOID); +VOID Selection_Land(VOID); +VOID Selection_Stretch(HWND hWnd, SIZE sizNew); +VOID Selection_HFlip(HWND hWnd); +VOID Selection_VFlip(HWND hWnd); +VOID Selection_Rotate90Degree(HWND hWnd); +VOID Selection_Rotate180Degree(HWND hWnd); +VOID Selection_Rotate270Degree(HWND hWnd); /* bitmap.c */ HBITMAP BM_Load(LPCWSTR pszFileName); diff --git a/programs/paint/move.cur b/programs/paint/move.cur new file mode 100644 index 0000000000000000000000000000000000000000..b1050d3ef8f93c09b4aec53563c689cf382bcba4 GIT binary patch literal 326 zcmbV{F%H5&38Yo*s(dd{UsJ>cF*x0O`5#>d(o&ds^^owLST#f~@J+;jH; literal 0 HcmV?d00001 diff --git a/programs/paint/paint.c b/programs/paint/paint.c index fdf2b36..2e6f0e6 100644 --- a/programs/paint/paint.c +++ b/programs/paint/paint.c @@ -452,6 +452,16 @@ VOID PAINT_EditDelete(VOID) VOID PAINT_ClearSelection(VOID) { + if (Globals.fSelect) + { + Selection_TakeOff(); + if (Globals.hbmSelect != NULL) + DeleteObject(Globals.hbmSelect); + Globals.hbmSelect = NULL; + Globals.fSelect = FALSE; + InvalidateRect(Globals.hCanvasWnd, NULL, FALSE); + UpdateWindow(Globals.hCanvasWnd); + } } VOID PAINT_CopyTo(VOID) @@ -466,7 +476,17 @@ VOID PAINT_PasteFrom(VOID) VOID PAINT_EditSelectAll(VOID) { - NotSupportedYet(); + Globals.fSelect = TRUE; + Globals.pt0.x = 0; + Globals.pt0.y = 0; + Globals.pt1.x = Globals.sizImage.cx; + Globals.pt1.y = Globals.sizImage.cy; + Globals.iToolSelect = TOOL_BOXSELECT; + Globals.hbmSelect = NULL; + InvalidateRect(Globals.hToolBox, NULL, TRUE); + UpdateWindow(Globals.hToolBox); + InvalidateRect(Globals.hCanvasWnd, NULL, TRUE); + UpdateWindow(Globals.hCanvasWnd); } VOID PAINT_HelpContents(VOID) @@ -572,12 +592,25 @@ VOID PAINT_InvertColors(VOID) hdcMem = CreateCompatibleDC(hDC); if (hdcMem != NULL) { - hbmOld = SelectObject(hdcMem, Globals.hbmImage); - rc.left = rc.top = 0; - rc.right = Globals.sizImage.cx; - rc.bottom = Globals.sizImage.cy; - InvertRect(hdcMem, &rc); - SelectObject(hdcMem, hbmOld); + if (Globals.fSelect) + { + Selection_TakeOff(); + hbmOld = SelectObject(hdcMem, Globals.hbmSelect); + rc.left = rc.top = 0; + rc.right = Globals.sizImage.cx; + rc.bottom = Globals.sizImage.cy; + InvertRect(hdcMem, &rc); + SelectObject(hdcMem, hbmOld); + } + else + { + hbmOld = SelectObject(hdcMem, Globals.hbmImage); + rc.left = rc.top = 0; + rc.right = Globals.sizImage.cx; + rc.bottom = Globals.sizImage.cy; + InvertRect(hdcMem, &rc); + SelectObject(hdcMem, hbmOld); + } DeleteDC(hdcMem); } ReleaseDC(Globals.hCanvasWnd, hDC); @@ -710,9 +743,20 @@ StretchSkewDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SetFocus(GetDlgItem(hDlg, edt2)); break; } - sizNew.cx = MulDiv(Globals.sizImage.cx, cxPercent, 100); - sizNew.cy = MulDiv(Globals.sizImage.cy, cyPercent, 100); - Canvas_Stretch(Globals.hCanvasWnd, sizNew); + if (Globals.fSelect) + { + sizNew.cx = MulDiv(Globals.pt1.x - Globals.pt0.x + 1, cxPercent, + 100); + sizNew.cy = MulDiv(Globals.pt1.y - Globals.pt0.y + 1, cyPercent, + 100); + Selection_Stretch(Globals.hCanvasWnd, sizNew); + } + else + { + sizNew.cx = MulDiv(Globals.sizImage.cx, cxPercent, 100); + sizNew.cy = MulDiv(Globals.sizImage.cy, cyPercent, 100); + Canvas_Stretch(Globals.hCanvasWnd, sizNew); + } EndDialog(hDlg, IDOK); break; @@ -912,25 +956,40 @@ FlipRotateDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case IDOK: if (IsDlgButtonChecked(hDlg, rad1) & 1) { - Canvas_HFlip(Globals.hCanvasWnd); + if (Globals.fSelect) + Selection_HFlip(Globals.hCanvasWnd); + else + Canvas_HFlip(Globals.hCanvasWnd); } else if (IsDlgButtonChecked(hDlg, rad2) & 1) { - Canvas_VFlip(Globals.hCanvasWnd); + if (Globals.fSelect) + Selection_VFlip(Globals.hCanvasWnd); + else + Canvas_VFlip(Globals.hCanvasWnd); } else if (IsDlgButtonChecked(hDlg, rad3) & 1) { if (IsDlgButtonChecked(hDlg, rad4) & 1) { - Canvas_Rotate90Degree(Globals.hCanvasWnd); + if (Globals.fSelect) + Selection_Rotate90Degree(Globals.hCanvasWnd); + else + Canvas_Rotate90Degree(Globals.hCanvasWnd); } else if (IsDlgButtonChecked(hDlg, rad5) & 1) { - Canvas_Rotate180Degree(Globals.hCanvasWnd); + if (Globals.fSelect) + Selection_Rotate180Degree(Globals.hCanvasWnd); + else + Canvas_Rotate180Degree(Globals.hCanvasWnd); } else if (IsDlgButtonChecked(hDlg, rad6) & 1) { - Canvas_Rotate270Degree(Globals.hCanvasWnd); + if (Globals.fSelect) + Selection_Rotate270Degree(Globals.hCanvasWnd); + else + Canvas_Rotate270Degree(Globals.hCanvasWnd); } } diff --git a/programs/paint/resource.h b/programs/paint/resource.h index 83f6b5f..739807a 100644 --- a/programs/paint/resource.h +++ b/programs/paint/resource.h @@ -29,6 +29,7 @@ #define IDB_LINE 0x20D #define IDB_BRUSH 0x20E #define IDB_FILL 0x20F +#define IDB_TRANS 0x210 #define IDD_ZOOM 0x207 #define IDD_STRETCH_SKEW 0x208 #define IDD_ATTRIBUTES 0x209 diff --git a/programs/paint/rsrc.rc b/programs/paint/rsrc.rc index e549318..415da1a 100644 --- a/programs/paint/rsrc.rc +++ b/programs/paint/rsrc.rc @@ -81,6 +81,8 @@ IDB_LINE BITMAP "line.bmp" IDB_BRUSH BITMAP "brush.bmp" /* @makedep: fill.bmp */ IDB_FILL BITMAP "fill.bmp" +/* @makedep: trans.bmp */ +IDB_TRANS BITMAP "trans.bmp" /* @makedep: horizon.cur */ 1 CURSOR "horizon.cur" @@ -102,6 +104,8 @@ IDB_FILL BITMAP "fill.bmp" 9 CURSOR "zoom.cur" /* @makedep: cross.cur */ 10 CURSOR "cross.cur" +/* @makedep: move.cur */ +11 CURSOR "move.cur" /* @makedep: cross2.cur */ 12 CURSOR "cross2.cur" diff --git a/programs/paint/trans.bmp b/programs/paint/trans.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3798d963e8cd4c13d9791fe54667c83dcaa973a3 GIT binary patch literal 1638 zcmeHG!41MN3^Wq(Bx^7SZ&-s7cxSXe7|0u#yK~c2YQOM^aBRoDT%*`=Zja~LBro{u zYtS+0!WqN`1ng9?l+apn8