[MSPAINT_NEW]
[reactos.git] / reactos / base / applications / mspaint_new / winproc.cpp
1 /*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL
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
8 */
9
10 /* INCLUDES *********************************************************/
11
12 #include "precomp.h"
13
14 #include "dialogs.h"
15 #include "registry.h"
16
17 /* FUNCTIONS ********************************************************/
18
19 void
20 zoomTo(int newZoom, int mouseX, int mouseY)
21 {
22 RECT clientRectScrollbox;
23 RECT clientRectImageArea;
24 int x, y, w, h;
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();
31
32 toolsModel.SetZoom(newZoom);
33
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);
38
39 scrollboxWindow.SendMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, x), 0);
40 scrollboxWindow.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, y), 0);
41 }
42
43 void CMainWindow::alignChildrenToMainWindow()
44 {
45 int x, y, w, h;
46 RECT clientRect;
47 GetClientRect(&clientRect);
48
49 if (toolBoxContainer.IsWindowVisible())
50 {
51 x = 56;
52 w = clientRect.right - 56;
53 }
54 else
55 {
56 x = 0;
57 w = clientRect.right;
58 }
59 if (paletteWindow.IsWindowVisible())
60 {
61 y = 49;
62 h = clientRect.bottom - 49;
63 }
64 else
65 {
66 y = 3;
67 h = clientRect.bottom - 3;
68 }
69
70 scrollboxWindow.MoveWindow(x, y, w, ::IsWindowVisible(hStatusBar) ? h - 23 : h, TRUE);
71 paletteWindow.MoveWindow(x, 9, 255, 32, TRUE);
72 }
73
74 void CMainWindow::saveImage(BOOL overwrite)
75 {
76 if (isAFile && overwrite)
77 {
78 imageModel.SaveImage(filepathname);
79 }
80 else if (GetSaveFileName(&sfn) != 0)
81 {
82 TCHAR tempstr[1000];
83 TCHAR resstr[100];
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);
90 isAFile = TRUE;
91 }
92 }
93
94 void CMainWindow::UpdateApplicationProperties(HBITMAP bitmap, LPTSTR newfilename, LPTSTR newfilepathname)
95 {
96 TCHAR tempstr[1000];
97 TCHAR resstr[100];
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();
105 isAFile = TRUE;
106 }
107
108 void CMainWindow::InsertSelectionFromHBITMAP(HBITMAP bitmap, HWND window)
109 {
110 int width = GetDIBWidth(bitmap);
111 int height = GetDIBHeight(bitmap);
112 int curWidth = imageModel.GetWidth();
113 int curHeight = imageModel.GetHeight();
114
115 if (width > curWidth || height > curHeight)
116 {
117 BOOL shouldEnlarge = TRUE;
118
119 if (askBeforeEnlarging)
120 {
121 TCHAR programname[20];
122 TCHAR shouldEnlargePromptText[100];
123
124 LoadString(hProgInstance, IDS_PROGRAMNAME, programname, SIZEOF(programname));
125 LoadString(hProgInstance, IDS_ENLARGEPROMPTTEXT, shouldEnlargePromptText, SIZEOF(shouldEnlargePromptText));
126
127 switch (MessageBox(shouldEnlargePromptText, programname, MB_YESNOCANCEL | MB_ICONQUESTION))
128 {
129 case IDYES:
130 break;
131 case IDNO:
132 shouldEnlarge = FALSE;
133 break;
134 case IDCANCEL:
135 return;
136 }
137 }
138
139 if (shouldEnlarge)
140 {
141 if (width > curWidth)
142 curWidth = width;
143
144 if (height > curHeight)
145 curHeight = height;
146
147 imageModel.Crop(curWidth, curHeight, 0, 0);
148 }
149 }
150
151 HWND hToolbar = FindWindowEx(toolBoxContainer.m_hWnd, NULL, TOOLBARCLASSNAME, NULL);
152 SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELPARAM(TRUE, 0));
153 toolBoxContainer.SendMessage(WM_COMMAND, ID_RECTSEL);
154
155 imageModel.CopyPrevious();
156 selectionModel.InsertFromHBITMAP(bitmap);
157
158 placeSelWin();
159 selectionWindow.ShowWindow(SW_SHOW);
160 ForceRefreshSelectionContents();
161 }
162
163 LRESULT CMainWindow::OnDropFiles(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
164 {
165 HDROP drophandle;
166 TCHAR droppedfile[MAX_PATH];
167 HBITMAP bmNew = NULL;
168 drophandle = (HDROP)wParam;
169 DragQueryFile(drophandle, 0, droppedfile, SIZEOF(droppedfile));
170 DragFinish(drophandle);
171 LoadDIBFromFile(&bmNew, droppedfile, &fileTime, &fileSize, &fileHPPM, &fileVPPM);
172 if (bmNew != NULL)
173 {
174 TCHAR *pathend;
175 pathend = _tcsrchr(droppedfile, '\\');
176 pathend++;
177 UpdateApplicationProperties(bmNew, pathend, pathend);
178 }
179 return 0;
180 }
181
182 LRESULT CMainWindow::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
183 {
184 SendMessage(WM_SETICON, ICON_BIG, (LPARAM) LoadIcon(hProgInstance, MAKEINTRESOURCE(IDI_APPICON)));
185 SendMessage(WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon(hProgInstance, MAKEINTRESOURCE(IDI_APPICON)));
186 return 0;
187 }
188
189 LRESULT CMainWindow::OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
190 {
191 PostQuitMessage(0); /* send a WM_QUIT to the message queue */
192 return 0;
193 }
194
195 LRESULT CMainWindow::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
196 {
197 if (!imageModel.IsImageSaved())
198 {
199 TCHAR programname[20];
200 TCHAR saveprompttext[100];
201 TCHAR temptext[500];
202 LoadString(hProgInstance, IDS_PROGRAMNAME, programname, SIZEOF(programname));
203 LoadString(hProgInstance, IDS_SAVEPROMPTTEXT, saveprompttext, SIZEOF(saveprompttext));
204 _stprintf(temptext, saveprompttext, filename);
205 switch (MessageBox(temptext, programname, MB_YESNOCANCEL | MB_ICONQUESTION))
206 {
207 case IDNO:
208 DestroyWindow();
209 break;
210 case IDYES:
211 saveImage(FALSE);
212 if (imageModel.IsImageSaved())
213 DestroyWindow();
214 break;
215 }
216 }
217 else
218 {
219 DestroyWindow();
220 }
221 return 0;
222 }
223
224 LRESULT CMainWindow::OnInitMenuPopup(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
225 {
226 HMENU menu = GetMenu();
227 BOOL trueSelection = (selectionWindow.IsWindowVisible() && ((toolsModel.GetActiveTool() == TOOL_FREESEL) || (toolsModel.GetActiveTool() == TOOL_RECTSEL)));
228 switch (lParam)
229 {
230 case 0: /* File menu */
231 EnableMenuItem(menu, IDM_FILEASWALLPAPERPLANE, ENABLED_IF(isAFile));
232 EnableMenuItem(menu, IDM_FILEASWALLPAPERCENTERED, ENABLED_IF(isAFile));
233 EnableMenuItem(menu, IDM_FILEASWALLPAPERSTRETCHED, ENABLED_IF(isAFile));
234 break;
235 case 1: /* Edit menu */
236 EnableMenuItem(menu, IDM_EDITUNDO, ENABLED_IF(imageModel.HasUndoSteps()));
237 EnableMenuItem(menu, IDM_EDITREDO, ENABLED_IF(imageModel.HasRedoSteps()));
238 EnableMenuItem(menu, IDM_EDITCUT, ENABLED_IF(trueSelection));
239 EnableMenuItem(menu, IDM_EDITCOPY, ENABLED_IF(trueSelection));
240 EnableMenuItem(menu, IDM_EDITDELETESELECTION, ENABLED_IF(trueSelection));
241 EnableMenuItem(menu, IDM_EDITINVERTSELECTION, ENABLED_IF(trueSelection));
242 EnableMenuItem(menu, IDM_EDITCOPYTO, ENABLED_IF(trueSelection));
243 OpenClipboard();
244 EnableMenuItem(menu, IDM_EDITPASTE, ENABLED_IF(GetClipboardData(CF_BITMAP) != NULL));
245 CloseClipboard();
246 break;
247 case 2: /* View menu */
248 CheckMenuItem(menu, IDM_VIEWTOOLBOX, CHECKED_IF(toolBoxContainer.IsWindowVisible()));
249 CheckMenuItem(menu, IDM_VIEWCOLORPALETTE, CHECKED_IF(paletteWindow.IsWindowVisible()));
250 CheckMenuItem(menu, IDM_VIEWSTATUSBAR, CHECKED_IF(::IsWindowVisible(hStatusBar)));
251 CheckMenuItem(menu, IDM_FORMATICONBAR, CHECKED_IF(textEditWindow.IsWindowVisible()));
252 EnableMenuItem(menu, IDM_FORMATICONBAR, ENABLED_IF(toolsModel.GetActiveTool() == TOOL_TEXT));
253
254 CheckMenuItem(menu, IDM_VIEWSHOWGRID, CHECKED_IF(showGrid));
255 CheckMenuItem(menu, IDM_VIEWSHOWMINIATURE, CHECKED_IF(showMiniature));
256 break;
257 case 3: /* Image menu */
258 EnableMenuItem(menu, IDM_IMAGECROP, ENABLED_IF(selectionWindow.IsWindowVisible()));
259 CheckMenuItem(menu, IDM_IMAGEDRAWOPAQUE, CHECKED_IF(!toolsModel.IsBackgroundTransparent()));
260 break;
261 }
262
263 CheckMenuItem(menu, IDM_VIEWZOOM125, CHECKED_IF(toolsModel.GetZoom() == 125));
264 CheckMenuItem(menu, IDM_VIEWZOOM25, CHECKED_IF(toolsModel.GetZoom() == 250));
265 CheckMenuItem(menu, IDM_VIEWZOOM50, CHECKED_IF(toolsModel.GetZoom() == 500));
266 CheckMenuItem(menu, IDM_VIEWZOOM100, CHECKED_IF(toolsModel.GetZoom() == 1000));
267 CheckMenuItem(menu, IDM_VIEWZOOM200, CHECKED_IF(toolsModel.GetZoom() == 2000));
268 CheckMenuItem(menu, IDM_VIEWZOOM400, CHECKED_IF(toolsModel.GetZoom() == 4000));
269 CheckMenuItem(menu, IDM_VIEWZOOM800, CHECKED_IF(toolsModel.GetZoom() == 8000));
270
271 CheckMenuItem(menu, IDM_COLORSMODERNPALETTE, CHECKED_IF(paletteModel.SelectedPalette() == 1));
272 CheckMenuItem(menu, IDM_COLORSOLDPALETTE, CHECKED_IF(paletteModel.SelectedPalette() == 2));
273 return 0;
274 }
275
276 LRESULT CMainWindow::OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
277 {
278 int test[] = { LOWORD(lParam) - 260, LOWORD(lParam) - 140, LOWORD(lParam) - 20 };
279 SendMessage(hStatusBar, WM_SIZE, wParam, lParam);
280 SendMessage(hStatusBar, SB_SETPARTS, 3, (LPARAM)&test);
281 alignChildrenToMainWindow();
282 Invalidate(TRUE);
283 return 0;
284 }
285
286 LRESULT CMainWindow::OnGetMinMaxInfo(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
287 {
288 MINMAXINFO *mm = (LPMINMAXINFO) lParam;
289 mm->ptMinTrackSize.x = 330;
290 mm->ptMinTrackSize.y = 430;
291 return 0;
292 }
293
294 LRESULT CMainWindow::OnSetCursor(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
295 {
296 SetCursor(LoadCursor(NULL, IDC_ARROW));
297 return 0;
298 }
299
300 LRESULT CMainWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
301 {
302 if (wParam == VK_ESCAPE)
303 {
304 if (!imageArea.drawing)
305 {
306 /* Deselect */
307 if ((toolsModel.GetActiveTool() == TOOL_RECTSEL) || (toolsModel.GetActiveTool() == TOOL_FREESEL))
308 {
309 startPaintingL(hDrawingDC, 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor());
310 whilePaintingL(hDrawingDC, 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor());
311 endPaintingL(hDrawingDC, 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor());
312 selectionWindow.ShowWindow(SW_HIDE);
313 }
314 }
315 /* FIXME: also cancel current drawing underway */
316 }
317 return 0;
318 }
319
320 LRESULT CMainWindow::OnSysColorChange(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
321 {
322 /* Redirect message to common controls */
323 HWND hToolbar = FindWindowEx(toolBoxContainer.m_hWnd, NULL, TOOLBARCLASSNAME, NULL);
324 SendMessage(hToolbar, WM_SYSCOLORCHANGE, 0, 0);
325 return 0;
326 }
327
328 LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
329 {
330 switch (LOWORD(wParam))
331 {
332 case IDM_HELPINFO:
333 {
334 HICON paintIcon = LoadIcon(hProgInstance, MAKEINTRESOURCE(IDI_APPICON));
335 TCHAR infotitle[100];
336 TCHAR infotext[200];
337 LoadString(hProgInstance, IDS_INFOTITLE, infotitle, SIZEOF(infotitle));
338 LoadString(hProgInstance, IDS_INFOTEXT, infotext, SIZEOF(infotext));
339 ShellAbout(m_hWnd, infotitle, infotext, paintIcon);
340 DeleteObject(paintIcon);
341 break;
342 }
343 case IDM_HELPHELPTOPICS:
344 HtmlHelp(m_hWnd, _T("help\\Paint.chm"), 0, 0);
345 break;
346 case IDM_FILEEXIT:
347 SendMessage(WM_CLOSE, wParam, lParam);
348 break;
349 case IDM_FILENEW:
350 {
351 BOOL reset = TRUE;
352 if (!imageModel.IsImageSaved())
353 {
354 TCHAR programname[20];
355 TCHAR saveprompttext[100];
356 TCHAR temptext[500];
357 LoadString(hProgInstance, IDS_PROGRAMNAME, programname, SIZEOF(programname));
358 LoadString(hProgInstance, IDS_SAVEPROMPTTEXT, saveprompttext, SIZEOF(saveprompttext));
359 _stprintf(temptext, saveprompttext, filename);
360 switch (MessageBox(temptext, programname, MB_YESNOCANCEL | MB_ICONQUESTION))
361 {
362 case IDNO:
363 imageModel.imageSaved = TRUE; //TODO: move to ImageModel
364 break;
365 case IDYES:
366 saveImage(FALSE);
367 break;
368 case IDCANCEL:
369 reset = FALSE;
370 break;
371 }
372 }
373 if (reset && imageModel.IsImageSaved()) //TODO: move to ImageModel
374 {
375 imageModel.Clear();
376 imageModel.ClearHistory();
377 }
378 break;
379 }
380 case IDM_FILEOPEN:
381 if (GetOpenFileName(&ofn) != 0)
382 {
383 HBITMAP bmNew = NULL;
384 LoadDIBFromFile(&bmNew, ofn.lpstrFile, &fileTime, &fileSize, &fileHPPM, &fileVPPM);
385 if (bmNew != NULL)
386 {
387 UpdateApplicationProperties(bmNew, ofn.lpstrFileTitle, ofn.lpstrFileTitle);
388 }
389 }
390 break;
391 case IDM_FILESAVE:
392 saveImage(TRUE);
393 break;
394 case IDM_FILESAVEAS:
395 saveImage(FALSE);
396 break;
397 case IDM_FILEASWALLPAPERPLANE:
398 SetWallpaper(filepathname, 1, 1);
399 break;
400 case IDM_FILEASWALLPAPERCENTERED:
401 SetWallpaper(filepathname, 1, 0);
402 break;
403 case IDM_FILEASWALLPAPERSTRETCHED:
404 SetWallpaper(filepathname, 2, 0);
405 break;
406 case IDM_EDITUNDO:
407 imageModel.Undo();
408 imageArea.Invalidate(FALSE);
409 break;
410 case IDM_EDITREDO:
411 imageModel.Redo();
412 imageArea.Invalidate(FALSE);
413 break;
414 case IDM_EDITCOPY:
415 OpenClipboard();
416 EmptyClipboard();
417 SetClipboardData(CF_BITMAP, CopyImage(selectionModel.GetBitmap(), IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
418 CloseClipboard();
419 break;
420 case IDM_EDITCUT:
421 /* Copy */
422 SendMessage(WM_COMMAND, IDM_EDITCOPY, 0);
423 /* Delete selection */
424 SendMessage(WM_COMMAND, IDM_EDITDELETESELECTION, 0);
425 break;
426 case IDM_EDITPASTE:
427 OpenClipboard();
428 if (GetClipboardData(CF_BITMAP) != NULL)
429 {
430 InsertSelectionFromHBITMAP((HBITMAP) GetClipboardData(CF_BITMAP), m_hWnd);
431 }
432 CloseClipboard();
433 break;
434 case IDM_EDITDELETESELECTION:
435 {
436 /* remove selection window and already painted content using undo */
437 imageModel.Undo();
438 break;
439 }
440 case IDM_EDITSELECTALL:
441 {
442 HWND hToolbar = FindWindowEx(toolBoxContainer.m_hWnd, NULL, TOOLBARCLASSNAME, NULL);
443 SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELPARAM(TRUE, 0));
444 toolBoxContainer.SendMessage(WM_COMMAND, ID_RECTSEL);
445 //TODO: do this properly
446 startPaintingL(hDrawingDC, 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor());
447 whilePaintingL(hDrawingDC, imageModel.GetWidth(), imageModel.GetHeight(), paletteModel.GetFgColor(), paletteModel.GetBgColor());
448 endPaintingL(hDrawingDC, imageModel.GetWidth(), imageModel.GetHeight(), paletteModel.GetFgColor(), paletteModel.GetBgColor());
449 break;
450 }
451 case IDM_EDITCOPYTO:
452 if (GetSaveFileName(&ofn) != 0)
453 SaveDIBToFile(selectionModel.GetBitmap(), ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM);
454 break;
455 case IDM_EDITPASTEFROM:
456 if (GetOpenFileName(&ofn) != 0)
457 {
458 HBITMAP bmNew = NULL;
459 LoadDIBFromFile(&bmNew, ofn.lpstrFile, &fileTime, &fileSize, &fileHPPM, &fileVPPM);
460 if (bmNew != NULL)
461 {
462 InsertSelectionFromHBITMAP(bmNew, m_hWnd);
463 DeleteObject(bmNew);
464 }
465 }
466 break;
467 case IDM_COLORSEDITPALETTE:
468 if (ChooseColor(&choosecolor))
469 paletteModel.SetFgColor(choosecolor.rgbResult);
470 break;
471 case IDM_COLORSMODERNPALETTE:
472 paletteModel.SelectPalette(1);
473 break;
474 case IDM_COLORSOLDPALETTE:
475 paletteModel.SelectPalette(2);
476 break;
477 case IDM_IMAGEINVERTCOLORS:
478 {
479 imageModel.InvertColors();
480 break;
481 }
482 case IDM_IMAGEDELETEIMAGE:
483 imageModel.CopyPrevious();
484 Rect(hDrawingDC, 0, 0, imageModel.GetWidth(), imageModel.GetHeight(), paletteModel.GetBgColor(), paletteModel.GetBgColor(), 0, TRUE);
485 imageArea.Invalidate(FALSE);
486 break;
487 case IDM_IMAGEROTATEMIRROR:
488 switch (mirrorRotateDlg())
489 {
490 case 1: /* flip horizontally */
491 if (selectionWindow.IsWindowVisible())
492 selectionModel.FlipHorizontally();
493 else
494 {
495 imageModel.CopyPrevious();
496 StretchBlt(hDrawingDC, imageModel.GetWidth() - 1, 0, -imageModel.GetWidth(), imageModel.GetHeight(), hDrawingDC, 0, 0,
497 imageModel.GetWidth(), imageModel.GetHeight(), SRCCOPY);
498 imageArea.Invalidate(FALSE);
499 }
500 break;
501 case 2: /* flip vertically */
502 if (selectionWindow.IsWindowVisible())
503 selectionModel.FlipVertically();
504 else
505 {
506 imageModel.CopyPrevious();
507 StretchBlt(hDrawingDC, 0, imageModel.GetHeight() - 1, imageModel.GetWidth(), -imageModel.GetHeight(), hDrawingDC, 0, 0,
508 imageModel.GetWidth(), imageModel.GetHeight(), SRCCOPY);
509 imageArea.Invalidate(FALSE);
510 }
511 break;
512 case 3: /* rotate 90 degrees */
513 break;
514 case 4: /* rotate 180 degrees */
515 if (selectionWindow.IsWindowVisible())
516 selectionModel.RotateNTimes90Degrees(2);
517 else
518 {
519 imageModel.CopyPrevious();
520 StretchBlt(hDrawingDC, imageModel.GetWidth() - 1, imageModel.GetHeight() - 1, -imageModel.GetWidth(), -imageModel.GetHeight(), hDrawingDC,
521 0, 0, imageModel.GetWidth(), imageModel.GetHeight(), SRCCOPY);
522 imageArea.Invalidate(FALSE);
523 }
524 break;
525 case 5: /* rotate 270 degrees */
526 break;
527 }
528 break;
529 case IDM_IMAGEATTRIBUTES:
530 {
531 if (attributesDlg())
532 {
533 imageModel.Crop(widthSetInDlg, heightSetInDlg, 0, 0);
534 }
535 break;
536 }
537 case IDM_IMAGESTRETCHSKEW:
538 {
539 if (changeSizeDlg())
540 {
541 imageModel.StretchSkew(stretchSkew.percentage.x, stretchSkew.percentage.y,
542 stretchSkew.angle.x, stretchSkew.angle.y);
543 }
544 break;
545 }
546 case IDM_IMAGEDRAWOPAQUE:
547 toolsModel.SetBackgroundTransparent(!toolsModel.IsBackgroundTransparent());
548 break;
549 case IDM_IMAGECROP:
550 imageModel.Insert((HBITMAP) CopyImage(selectionModel.GetBitmap(), IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
551 break;
552
553 case IDM_VIEWTOOLBOX:
554 toolBoxContainer.ShowWindow(toolBoxContainer.IsWindowVisible() ? SW_HIDE : SW_SHOW);
555 alignChildrenToMainWindow();
556 break;
557 case IDM_VIEWCOLORPALETTE:
558 paletteWindow.ShowWindow(paletteWindow.IsWindowVisible() ? SW_HIDE : SW_SHOW);
559 alignChildrenToMainWindow();
560 break;
561 case IDM_VIEWSTATUSBAR:
562 ::ShowWindow(hStatusBar, ::IsWindowVisible(hStatusBar) ? SW_HIDE : SW_SHOW);
563 alignChildrenToMainWindow();
564 break;
565 case IDM_FORMATICONBAR:
566 textEditWindow.ShowWindow(textEditWindow.IsWindowVisible() ? SW_HIDE : SW_SHOW);
567
568 case IDM_VIEWSHOWGRID:
569 showGrid = !showGrid;
570 imageArea.Invalidate(FALSE);
571 break;
572 case IDM_VIEWSHOWMINIATURE:
573 showMiniature = !showMiniature;
574 miniature.ShowWindow(showMiniature ? SW_SHOW : SW_HIDE);
575 break;
576
577 case IDM_VIEWZOOM125:
578 zoomTo(125, 0, 0);
579 break;
580 case IDM_VIEWZOOM25:
581 zoomTo(250, 0, 0);
582 break;
583 case IDM_VIEWZOOM50:
584 zoomTo(500, 0, 0);
585 break;
586 case IDM_VIEWZOOM100:
587 zoomTo(1000, 0, 0);
588 break;
589 case IDM_VIEWZOOM200:
590 zoomTo(2000, 0, 0);
591 break;
592 case IDM_VIEWZOOM400:
593 zoomTo(4000, 0, 0);
594 break;
595 case IDM_VIEWZOOM800:
596 zoomTo(8000, 0, 0);
597 break;
598 }
599 return 0;
600 }