2 * PROJECT: PAINT for ReactOS
4 * FILE: base/applications/mspaint_new/winproc.cpp
5 * PURPOSE: Window procedure of the main window and all children apart from
6 * hPalWin, hToolSettings and hSelection
7 * PROGRAMMERS: Benedikt Freisen
10 /* INCLUDES *********************************************************/
17 /* FUNCTIONS ********************************************************/
20 zoomTo(int newZoom
, int mouseX
, int mouseY
)
22 RECT clientRectScrollbox
;
23 RECT clientRectImageArea
;
25 scrollboxWindow
.GetClientRect(&clientRectScrollbox
);
26 imageArea
.GetClientRect(&clientRectImageArea
);
27 w
= clientRectImageArea
.right
* clientRectScrollbox
.right
/ (clientRectImageArea
.right
* newZoom
/ toolsModel
.GetZoom());
28 h
= clientRectImageArea
.bottom
* clientRectScrollbox
.bottom
/ (clientRectImageArea
.bottom
* newZoom
/ toolsModel
.GetZoom());
29 x
= max(0, min(clientRectImageArea
.right
- w
, mouseX
- w
/ 2)) * newZoom
/ toolsModel
.GetZoom();
30 y
= max(0, min(clientRectImageArea
.bottom
- h
, mouseY
- h
/ 2)) * newZoom
/ toolsModel
.GetZoom();
32 toolsModel
.SetZoom(newZoom
);
34 selectionWindow
.ShowWindow(SW_HIDE
);
35 imageArea
.MoveWindow(3, 3, imageModel
.GetWidth() * toolsModel
.GetZoom() / 1000, imageModel
.GetHeight() * toolsModel
.GetZoom() / 1000, FALSE
);
36 scrollboxWindow
.Invalidate(TRUE
);
37 imageArea
.Invalidate(FALSE
);
39 scrollboxWindow
.SendMessage(WM_HSCROLL
, MAKEWPARAM(SB_THUMBPOSITION
, x
), 0);
40 scrollboxWindow
.SendMessage(WM_VSCROLL
, MAKEWPARAM(SB_THUMBPOSITION
, y
), 0);
43 void CMainWindow::alignChildrenToMainWindow()
47 GetClientRect(&clientRect
);
49 if (toolBoxContainer
.IsWindowVisible())
52 w
= clientRect
.right
- 56;
59 if (paletteWindow
.IsWindowVisible())
62 h
= clientRect
.bottom
- 49;
67 h
= clientRect
.bottom
- 3;
70 scrollboxWindow
.MoveWindow(x
, y
, w
, ::IsWindowVisible(hStatusBar
) ? h
- 23 : h
, TRUE
);
71 paletteWindow
.MoveWindow(x
, 9, 255, 32, TRUE
);
74 void CMainWindow::saveImage(BOOL overwrite
)
76 if (isAFile
&& overwrite
)
78 imageModel
.SaveImage(filepathname
);
80 else if (GetSaveFileName(&sfn
) != 0)
84 imageModel
.SaveImage(sfn
.lpstrFile
);
85 CopyMemory(filename
, sfn
.lpstrFileTitle
, sizeof(filename
));
86 CopyMemory(filepathname
, sfn
.lpstrFile
, sizeof(filepathname
));
87 LoadString(hProgInstance
, IDS_WINDOWTITLE
, resstr
, SIZEOF(resstr
));
88 _stprintf(tempstr
, resstr
, filename
);
89 SetWindowText(tempstr
);
94 void CMainWindow::UpdateApplicationProperties(HBITMAP bitmap
, LPTSTR newfilename
, LPTSTR newfilepathname
)
98 imageModel
.Insert(bitmap
);
99 CopyMemory(filename
, newfilename
, sizeof(filename
));
100 CopyMemory(filepathname
, newfilepathname
, sizeof(filepathname
));
101 LoadString(hProgInstance
, IDS_WINDOWTITLE
, resstr
, SIZEOF(resstr
));
102 _stprintf(tempstr
, resstr
, filename
);
103 SetWindowText(tempstr
);
104 imageModel
.ClearHistory();
108 void CMainWindow::InsertSelectionFromHBITMAP(HBITMAP bitmap
, HWND window
)
113 HWND hToolbar
= FindWindowEx(toolBoxContainer
.m_hWnd
, NULL
, TOOLBARCLASSNAME
, NULL
);
114 SendMessage(hToolbar
, TB_CHECKBUTTON
, ID_RECTSEL
, MAKELPARAM(TRUE
, 0));
115 toolBoxContainer
.SendMessage(WM_COMMAND
, ID_RECTSEL
);
117 DeleteObject(SelectObject(hSelDC
, hSelBm
= (HBITMAP
) CopyImage(bitmap
,
120 imageModel
.CopyPrevious();
121 SetRectEmpty(&rectSel_src
);
122 rectSel_dest
.left
= rectSel_dest
.top
= 0;
123 rectSel_dest
.right
= rectSel_dest
.left
+ GetDIBWidth(hSelBm
);
124 rectSel_dest
.bottom
= rectSel_dest
.top
+ GetDIBHeight(hSelBm
);
126 hTempDC
= CreateCompatibleDC(hSelDC
);
127 hTempMask
= CreateBitmap(RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), 1, 1, NULL
);
128 SelectObject(hTempDC
, hTempMask
);
129 Rect(hTempDC
, rectSel_dest
.left
, rectSel_dest
.top
, rectSel_dest
.right
, rectSel_dest
.bottom
, 0x00ffffff, 0x00ffffff, 1, 1);
130 DeleteObject(hSelMask
);
131 hSelMask
= hTempMask
;
135 selectionWindow
.ShowWindow(SW_SHOW
);
136 ForceRefreshSelectionContents();
139 LRESULT
CMainWindow::OnDropFiles(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
142 TCHAR droppedfile
[MAX_PATH
];
143 HBITMAP bmNew
= NULL
;
144 drophandle
= (HDROP
)wParam
;
145 DragQueryFile(drophandle
, 0, droppedfile
, SIZEOF(droppedfile
));
146 DragFinish(drophandle
);
147 LoadDIBFromFile(&bmNew
, droppedfile
, &fileTime
, &fileSize
, &fileHPPM
, &fileVPPM
);
151 pathend
= _tcsrchr(droppedfile
, '\\');
153 UpdateApplicationProperties(bmNew
, pathend
, pathend
);
158 LRESULT
CMainWindow::OnCreate(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
160 SendMessage(WM_SETICON
, ICON_BIG
, (LPARAM
) LoadIcon(hProgInstance
, MAKEINTRESOURCE(IDI_APPICON
)));
161 SendMessage(WM_SETICON
, ICON_SMALL
, (LPARAM
) LoadIcon(hProgInstance
, MAKEINTRESOURCE(IDI_APPICON
)));
167 LRESULT
CMainWindow::OnDestroy(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
169 PostQuitMessage(0); /* send a WM_QUIT to the message queue */
173 LRESULT
CMainWindow::OnClose(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
175 if (!imageModel
.IsImageSaved())
177 TCHAR programname
[20];
178 TCHAR saveprompttext
[100];
180 LoadString(hProgInstance
, IDS_PROGRAMNAME
, programname
, SIZEOF(programname
));
181 LoadString(hProgInstance
, IDS_SAVEPROMPTTEXT
, saveprompttext
, SIZEOF(saveprompttext
));
182 _stprintf(temptext
, saveprompttext
, filename
);
183 switch (MessageBox(temptext
, programname
, MB_YESNOCANCEL
| MB_ICONQUESTION
))
190 if (imageModel
.IsImageSaved())
202 LRESULT
CMainWindow::OnInitMenuPopup(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
204 HMENU menu
= GetMenu();
205 BOOL trueSelection
= (selectionWindow
.IsWindowVisible() && ((toolsModel
.GetActiveTool() == TOOL_FREESEL
) || (toolsModel
.GetActiveTool() == TOOL_RECTSEL
)));
208 case 0: /* File menu */
209 EnableMenuItem(menu
, IDM_FILEASWALLPAPERPLANE
, ENABLED_IF(isAFile
));
210 EnableMenuItem(menu
, IDM_FILEASWALLPAPERCENTERED
, ENABLED_IF(isAFile
));
211 EnableMenuItem(menu
, IDM_FILEASWALLPAPERSTRETCHED
, ENABLED_IF(isAFile
));
213 case 1: /* Edit menu */
214 EnableMenuItem(menu
, IDM_EDITUNDO
, ENABLED_IF(imageModel
.HasUndoSteps()));
215 EnableMenuItem(menu
, IDM_EDITREDO
, ENABLED_IF(imageModel
.HasRedoSteps()));
216 EnableMenuItem(menu
, IDM_EDITCUT
, ENABLED_IF(trueSelection
));
217 EnableMenuItem(menu
, IDM_EDITCOPY
, ENABLED_IF(trueSelection
));
218 EnableMenuItem(menu
, IDM_EDITDELETESELECTION
, ENABLED_IF(trueSelection
));
219 EnableMenuItem(menu
, IDM_EDITINVERTSELECTION
, ENABLED_IF(trueSelection
));
220 EnableMenuItem(menu
, IDM_EDITCOPYTO
, ENABLED_IF(trueSelection
));
222 EnableMenuItem(menu
, IDM_EDITPASTE
, ENABLED_IF(GetClipboardData(CF_BITMAP
) != NULL
));
225 case 2: /* View menu */
226 CheckMenuItem(menu
, IDM_VIEWTOOLBOX
, CHECKED_IF(toolBoxContainer
.IsWindowVisible()));
227 CheckMenuItem(menu
, IDM_VIEWCOLORPALETTE
, CHECKED_IF(paletteWindow
.IsWindowVisible()));
228 CheckMenuItem(menu
, IDM_VIEWSTATUSBAR
, CHECKED_IF(::IsWindowVisible(hStatusBar
)));
229 CheckMenuItem(menu
, IDM_FORMATICONBAR
, CHECKED_IF(textEditWindow
.IsWindowVisible()));
230 EnableMenuItem(menu
, IDM_FORMATICONBAR
, ENABLED_IF(toolsModel
.GetActiveTool() == TOOL_TEXT
));
232 CheckMenuItem(menu
, IDM_VIEWSHOWGRID
, CHECKED_IF(showGrid
));
233 CheckMenuItem(menu
, IDM_VIEWSHOWMINIATURE
, CHECKED_IF(showMiniature
));
235 case 3: /* Image menu */
236 EnableMenuItem(menu
, IDM_IMAGECROP
, ENABLED_IF(selectionWindow
.IsWindowVisible()));
237 CheckMenuItem(menu
, IDM_IMAGEDRAWOPAQUE
, CHECKED_IF(!toolsModel
.IsBackgroundTransparent()));
241 CheckMenuItem(menu
, IDM_VIEWZOOM125
, CHECKED_IF(toolsModel
.GetZoom() == 125));
242 CheckMenuItem(menu
, IDM_VIEWZOOM25
, CHECKED_IF(toolsModel
.GetZoom() == 250));
243 CheckMenuItem(menu
, IDM_VIEWZOOM50
, CHECKED_IF(toolsModel
.GetZoom() == 500));
244 CheckMenuItem(menu
, IDM_VIEWZOOM100
, CHECKED_IF(toolsModel
.GetZoom() == 1000));
245 CheckMenuItem(menu
, IDM_VIEWZOOM200
, CHECKED_IF(toolsModel
.GetZoom() == 2000));
246 CheckMenuItem(menu
, IDM_VIEWZOOM400
, CHECKED_IF(toolsModel
.GetZoom() == 4000));
247 CheckMenuItem(menu
, IDM_VIEWZOOM800
, CHECKED_IF(toolsModel
.GetZoom() == 8000));
249 CheckMenuItem(menu
, IDM_COLORSMODERNPALETTE
, CHECKED_IF(paletteModel
.SelectedPalette() == 1));
250 CheckMenuItem(menu
, IDM_COLORSOLDPALETTE
, CHECKED_IF(paletteModel
.SelectedPalette() == 2));
254 LRESULT
CMainWindow::OnSize(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
256 int test
[] = { LOWORD(lParam
) - 260, LOWORD(lParam
) - 140, LOWORD(lParam
) - 20 };
257 SendMessage(hStatusBar
, WM_SIZE
, wParam
, lParam
);
258 SendMessage(hStatusBar
, SB_SETPARTS
, 3, (LPARAM
)&test
);
259 alignChildrenToMainWindow();
264 LRESULT
CMainWindow::OnGetMinMaxInfo(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
266 MINMAXINFO
*mm
= (LPMINMAXINFO
) lParam
;
267 mm
->ptMinTrackSize
.x
= 330;
268 mm
->ptMinTrackSize
.y
= 430;
272 LRESULT
CMainWindow::OnSetCursor(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
274 SetCursor(LoadCursor(NULL
, IDC_ARROW
));
278 LRESULT
CMainWindow::OnKeyDown(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
280 if (wParam
== VK_ESCAPE
)
282 if (!imageArea
.drawing
)
285 if ((toolsModel
.GetActiveTool() == TOOL_RECTSEL
) || (toolsModel
.GetActiveTool() == TOOL_FREESEL
))
287 startPaintingL(hDrawingDC
, 0, 0, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
288 whilePaintingL(hDrawingDC
, 0, 0, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
289 endPaintingL(hDrawingDC
, 0, 0, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
290 selectionWindow
.ShowWindow(SW_HIDE
);
293 /* FIXME: also cancel current drawing underway */
298 LRESULT
CMainWindow::OnSysColorChange(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
300 /* Redirect message to common controls */
301 HWND hToolbar
= FindWindowEx(toolBoxContainer
.m_hWnd
, NULL
, TOOLBARCLASSNAME
, NULL
);
302 SendMessage(hToolbar
, WM_SYSCOLORCHANGE
, 0, 0);
306 LRESULT
CMainWindow::OnCommand(UINT nMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
308 switch (LOWORD(wParam
))
312 HICON paintIcon
= LoadIcon(hProgInstance
, MAKEINTRESOURCE(IDI_APPICON
));
313 TCHAR infotitle
[100];
315 LoadString(hProgInstance
, IDS_INFOTITLE
, infotitle
, SIZEOF(infotitle
));
316 LoadString(hProgInstance
, IDS_INFOTEXT
, infotext
, SIZEOF(infotext
));
317 ShellAbout(m_hWnd
, infotitle
, infotext
, paintIcon
);
318 DeleteObject(paintIcon
);
321 case IDM_HELPHELPTOPICS
:
322 HtmlHelp(m_hWnd
, _T("help\\Paint.chm"), 0, 0);
325 SendMessage(WM_CLOSE
, wParam
, lParam
);
330 if (!imageModel
.IsImageSaved())
332 TCHAR programname
[20];
333 TCHAR saveprompttext
[100];
335 LoadString(hProgInstance
, IDS_PROGRAMNAME
, programname
, SIZEOF(programname
));
336 LoadString(hProgInstance
, IDS_SAVEPROMPTTEXT
, saveprompttext
, SIZEOF(saveprompttext
));
337 _stprintf(temptext
, saveprompttext
, filename
);
338 switch (MessageBox(temptext
, programname
, MB_YESNOCANCEL
| MB_ICONQUESTION
))
341 imageModel
.imageSaved
= TRUE
; //TODO: move to ImageModel
351 if (reset
&& imageModel
.IsImageSaved()) //TODO: move to ImageModel
354 imageModel
.ClearHistory();
359 if (GetOpenFileName(&ofn
) != 0)
361 HBITMAP bmNew
= NULL
;
362 LoadDIBFromFile(&bmNew
, ofn
.lpstrFile
, &fileTime
, &fileSize
, &fileHPPM
, &fileVPPM
);
365 UpdateApplicationProperties(bmNew
, ofn
.lpstrFileTitle
, ofn
.lpstrFileTitle
);
375 case IDM_FILEASWALLPAPERPLANE
:
376 SetWallpaper(filepathname
, 1, 1);
378 case IDM_FILEASWALLPAPERCENTERED
:
379 SetWallpaper(filepathname
, 1, 0);
381 case IDM_FILEASWALLPAPERSTRETCHED
:
382 SetWallpaper(filepathname
, 2, 0);
386 imageArea
.Invalidate(FALSE
);
390 imageArea
.Invalidate(FALSE
);
395 SetClipboardData(CF_BITMAP
, CopyImage(hSelBm
, IMAGE_BITMAP
, 0, 0, LR_COPYRETURNORG
));
400 SendMessage(WM_COMMAND
, IDM_EDITCOPY
, 0);
401 /* Delete selection */
402 SendMessage(WM_COMMAND
, IDM_EDITDELETESELECTION
, 0);
406 if (GetClipboardData(CF_BITMAP
) != NULL
)
408 InsertSelectionFromHBITMAP((HBITMAP
) GetClipboardData(CF_BITMAP
), m_hWnd
);
412 case IDM_EDITDELETESELECTION
:
414 /* remove selection window and already painted content using undo(),
415 paint Rect for rectangular selections and Poly for freeform selections */
417 if (toolsModel
.GetActiveTool() == TOOL_RECTSEL
)
419 imageModel
.CopyPrevious();
420 Rect(hDrawingDC
, rectSel_dest
.left
, rectSel_dest
.top
, rectSel_dest
.right
,
421 rectSel_dest
.bottom
, paletteModel
.GetBgColor(), paletteModel
.GetBgColor(), 0, TRUE
);
423 if (toolsModel
.GetActiveTool() == TOOL_FREESEL
)
425 imageModel
.CopyPrevious();
426 Poly(hDrawingDC
, ptStack
, ptSP
+ 1, 0, 0, 2, 0, FALSE
, TRUE
);
430 case IDM_EDITSELECTALL
:
432 HWND hToolbar
= FindWindowEx(toolBoxContainer
.m_hWnd
, NULL
, TOOLBARCLASSNAME
, NULL
);
433 SendMessage(hToolbar
, TB_CHECKBUTTON
, ID_RECTSEL
, MAKELPARAM(TRUE
, 0));
434 toolBoxContainer
.SendMessage(WM_COMMAND
, ID_RECTSEL
);
435 //TODO: do this properly
436 startPaintingL(hDrawingDC
, 0, 0, paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
437 whilePaintingL(hDrawingDC
, imageModel
.GetWidth(), imageModel
.GetHeight(), paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
438 endPaintingL(hDrawingDC
, imageModel
.GetWidth(), imageModel
.GetHeight(), paletteModel
.GetFgColor(), paletteModel
.GetBgColor());
442 if (GetSaveFileName(&ofn
) != 0)
443 SaveDIBToFile(hSelBm
, ofn
.lpstrFile
, hDrawingDC
, NULL
, NULL
, fileHPPM
, fileVPPM
);
445 case IDM_EDITPASTEFROM
:
446 if (GetOpenFileName(&ofn
) != 0)
448 HBITMAP bmNew
= NULL
;
449 LoadDIBFromFile(&bmNew
, ofn
.lpstrFile
, &fileTime
, &fileSize
, &fileHPPM
, &fileVPPM
);
452 InsertSelectionFromHBITMAP(bmNew
, m_hWnd
);
457 case IDM_COLORSEDITPALETTE
:
458 if (ChooseColor(&choosecolor
))
459 paletteModel
.SetFgColor(choosecolor
.rgbResult
);
461 case IDM_COLORSMODERNPALETTE
:
462 paletteModel
.SelectPalette(1);
464 case IDM_COLORSOLDPALETTE
:
465 paletteModel
.SelectPalette(2);
467 case IDM_IMAGEINVERTCOLORS
:
469 imageModel
.InvertColors();
472 case IDM_IMAGEDELETEIMAGE
:
473 imageModel
.CopyPrevious();
474 Rect(hDrawingDC
, 0, 0, imageModel
.GetWidth(), imageModel
.GetHeight(), paletteModel
.GetBgColor(), paletteModel
.GetBgColor(), 0, TRUE
);
475 imageArea
.Invalidate(FALSE
);
477 case IDM_IMAGEROTATEMIRROR
:
478 switch (mirrorRotateDlg())
480 case 1: /* flip horizontally */
481 if (selectionWindow
.IsWindowVisible())
483 SelectObject(hSelDC
, hSelMask
);
484 StretchBlt(hSelDC
, RECT_WIDTH(rectSel_dest
) - 1, 0, -RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), hSelDC
,
485 0, 0, RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), SRCCOPY
);
486 SelectObject(hSelDC
, hSelBm
);
487 StretchBlt(hSelDC
, RECT_WIDTH(rectSel_dest
) - 1, 0, -RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), hSelDC
,
488 0, 0, RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), SRCCOPY
);
489 ForceRefreshSelectionContents();
493 imageModel
.CopyPrevious();
494 StretchBlt(hDrawingDC
, imageModel
.GetWidth() - 1, 0, -imageModel
.GetWidth(), imageModel
.GetHeight(), hDrawingDC
, 0, 0,
495 imageModel
.GetWidth(), imageModel
.GetHeight(), SRCCOPY
);
496 imageArea
.Invalidate(FALSE
);
499 case 2: /* flip vertically */
500 if (selectionWindow
.IsWindowVisible())
502 SelectObject(hSelDC
, hSelMask
);
503 StretchBlt(hSelDC
, 0, RECT_HEIGHT(rectSel_dest
) - 1, RECT_WIDTH(rectSel_dest
), -RECT_HEIGHT(rectSel_dest
), hSelDC
,
504 0, 0, RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), SRCCOPY
);
505 SelectObject(hSelDC
, hSelBm
);
506 StretchBlt(hSelDC
, 0, RECT_HEIGHT(rectSel_dest
) - 1, RECT_WIDTH(rectSel_dest
), -RECT_HEIGHT(rectSel_dest
), hSelDC
,
507 0, 0, RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), SRCCOPY
);
508 ForceRefreshSelectionContents();
512 imageModel
.CopyPrevious();
513 StretchBlt(hDrawingDC
, 0, imageModel
.GetHeight() - 1, imageModel
.GetWidth(), -imageModel
.GetHeight(), hDrawingDC
, 0, 0,
514 imageModel
.GetWidth(), imageModel
.GetHeight(), SRCCOPY
);
515 imageArea
.Invalidate(FALSE
);
518 case 3: /* rotate 90 degrees */
520 case 4: /* rotate 180 degrees */
521 if (selectionWindow
.IsWindowVisible())
523 SelectObject(hSelDC
, hSelMask
);
524 StretchBlt(hSelDC
, RECT_WIDTH(rectSel_dest
) - 1, RECT_HEIGHT(rectSel_dest
) - 1, -RECT_WIDTH(rectSel_dest
), -RECT_HEIGHT(rectSel_dest
), hSelDC
,
525 0, 0, RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), SRCCOPY
);
526 SelectObject(hSelDC
, hSelBm
);
527 StretchBlt(hSelDC
, RECT_WIDTH(rectSel_dest
) - 1, RECT_HEIGHT(rectSel_dest
) - 1, -RECT_WIDTH(rectSel_dest
), -RECT_HEIGHT(rectSel_dest
), hSelDC
,
528 0, 0, RECT_WIDTH(rectSel_dest
), RECT_HEIGHT(rectSel_dest
), SRCCOPY
);
529 ForceRefreshSelectionContents();
533 imageModel
.CopyPrevious();
534 StretchBlt(hDrawingDC
, imageModel
.GetWidth() - 1, imageModel
.GetHeight() - 1, -imageModel
.GetWidth(), -imageModel
.GetHeight(), hDrawingDC
,
535 0, 0, imageModel
.GetWidth(), imageModel
.GetHeight(), SRCCOPY
);
536 imageArea
.Invalidate(FALSE
);
539 case 5: /* rotate 270 degrees */
543 case IDM_IMAGEATTRIBUTES
:
547 imageModel
.Crop(widthSetInDlg
, heightSetInDlg
, 0, 0);
551 case IDM_IMAGESTRETCHSKEW
:
555 imageModel
.StretchSkew(stretchSkew
.percentage
.x
, stretchSkew
.percentage
.y
,
556 stretchSkew
.angle
.x
, stretchSkew
.angle
.y
);
560 case IDM_IMAGEDRAWOPAQUE
:
561 toolsModel
.SetBackgroundTransparent(!toolsModel
.IsBackgroundTransparent());
564 imageModel
.Insert((HBITMAP
) CopyImage(hSelBm
, IMAGE_BITMAP
, 0, 0, LR_COPYRETURNORG
));
567 case IDM_VIEWTOOLBOX
:
568 toolBoxContainer
.ShowWindow(toolBoxContainer
.IsWindowVisible() ? SW_HIDE
: SW_SHOW
);
569 alignChildrenToMainWindow();
571 case IDM_VIEWCOLORPALETTE
:
572 paletteWindow
.ShowWindow(paletteWindow
.IsWindowVisible() ? SW_HIDE
: SW_SHOW
);
573 alignChildrenToMainWindow();
575 case IDM_VIEWSTATUSBAR
:
576 ::ShowWindow(hStatusBar
, ::IsWindowVisible(hStatusBar
) ? SW_HIDE
: SW_SHOW
);
577 alignChildrenToMainWindow();
579 case IDM_FORMATICONBAR
:
580 textEditWindow
.ShowWindow(textEditWindow
.IsWindowVisible() ? SW_HIDE
: SW_SHOW
);
582 case IDM_VIEWSHOWGRID
:
583 showGrid
= !showGrid
;
584 imageArea
.Invalidate(FALSE
);
586 case IDM_VIEWSHOWMINIATURE
:
587 showMiniature
= !showMiniature
;
588 miniature
.ShowWindow(showMiniature
? SW_SHOW
: SW_HIDE
);
591 case IDM_VIEWZOOM125
:
600 case IDM_VIEWZOOM100
:
603 case IDM_VIEWZOOM200
:
606 case IDM_VIEWZOOM400
:
609 case IDM_VIEWZOOM800
: