[INTL]
[reactos.git] / base / applications / mspaint / winproc.c
1 /*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL
4 * FILE: base/applications/paint/winproc.c
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 selectTool(int tool)
21 {
22 ShowWindow(hSelection, SW_HIDE);
23 activeTool = tool;
24 pointSP = 0; // resets the point-buffer of the polygon and bezier functions
25 InvalidateRect(hToolSettings, NULL, TRUE);
26 ShowWindow(hTrackbarZoom, (tool == 6) ? SW_SHOW : SW_HIDE);
27 }
28
29 void
30 updateCanvasAndScrollbars()
31 {
32 ShowWindow(hSelection, SW_HIDE);
33 MoveWindow(hImageArea, 3, 3, imgXRes * zoom / 1000, imgYRes * zoom / 1000, FALSE);
34 InvalidateRect(hScrollbox, NULL, TRUE);
35 InvalidateRect(hImageArea, NULL, FALSE);
36
37 SetScrollPos(hScrollbox, SB_HORZ, 0, TRUE);
38 SetScrollPos(hScrollbox, SB_VERT, 0, TRUE);
39 }
40
41 void
42 zoomTo(int newZoom, int mouseX, int mouseY)
43 {
44 int tbPos = 0;
45 int tempZoom = newZoom;
46
47 long clientRectScrollbox[4];
48 long clientRectImageArea[4];
49 int x, y, w, h;
50 GetClientRect(hScrollbox, (LPRECT) &clientRectScrollbox);
51 GetClientRect(hImageArea, (LPRECT) &clientRectImageArea);
52 w = clientRectImageArea[2] * clientRectScrollbox[2] / (clientRectImageArea[2] * newZoom / zoom);
53 h = clientRectImageArea[3] * clientRectScrollbox[3] / (clientRectImageArea[3] * newZoom / zoom);
54 x = max(0, min(clientRectImageArea[2] - w, mouseX - w / 2)) * newZoom / zoom;
55 y = max(0, min(clientRectImageArea[3] - h, mouseY - h / 2)) * newZoom / zoom;
56
57 zoom = newZoom;
58
59 ShowWindow(hSelection, SW_HIDE);
60 MoveWindow(hImageArea, 3, 3, imgXRes * zoom / 1000, imgYRes * zoom / 1000, FALSE);
61 InvalidateRect(hScrollbox, NULL, TRUE);
62 InvalidateRect(hImageArea, NULL, FALSE);
63
64 SendMessage(hScrollbox, WM_HSCROLL, SB_THUMBPOSITION | (x << 16), 0);
65 SendMessage(hScrollbox, WM_VSCROLL, SB_THUMBPOSITION | (y << 16), 0);
66
67 while (tempZoom > 125)
68 {
69 tbPos++;
70 tempZoom = tempZoom >> 1;
71 }
72 SendMessage(hTrackbarZoom, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) tbPos);
73 }
74
75 void
76 drawZoomFrame(int mouseX, int mouseY)
77 {
78 HDC hdc;
79 HPEN oldPen;
80 HBRUSH oldBrush;
81 LOGBRUSH logbrush;
82 int rop;
83
84 long clientRectScrollbox[4];
85 long clientRectImageArea[4];
86 int x, y, w, h;
87 GetClientRect(hScrollbox, (LPRECT) &clientRectScrollbox);
88 GetClientRect(hImageArea, (LPRECT) &clientRectImageArea);
89 w = clientRectImageArea[2] * clientRectScrollbox[2] / (clientRectImageArea[2] * 2);
90 h = clientRectImageArea[3] * clientRectScrollbox[3] / (clientRectImageArea[3] * 2);
91 x = max(0, min(clientRectImageArea[2] - w, mouseX - w / 2));
92 y = max(0, min(clientRectImageArea[3] - h, mouseY - h / 2));
93
94 hdc = GetDC(hImageArea);
95 oldPen = SelectObject(hdc, CreatePen(PS_SOLID, 0, 0));
96 logbrush.lbStyle = BS_HOLLOW;
97 oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush));
98 rop = SetROP2(hdc, R2_NOT);
99 Rectangle(hdc, x, y, x + w, y + h);
100 SetROP2(hdc, rop);
101 DeleteObject(SelectObject(hdc, oldBrush));
102 DeleteObject(SelectObject(hdc, oldPen));
103 ReleaseDC(hImageArea, hdc);
104 }
105
106 void
107 alignChildrenToMainWindow()
108 {
109 int x, y, w, h;
110 RECT clientRect;
111 GetClientRect(hMainWnd, &clientRect);
112
113 if (IsWindowVisible(hToolBoxContainer))
114 {
115 x = 56;
116 w = clientRect.right - 56;
117 }
118 else
119 {
120 x = 0;
121 w = clientRect.right;
122 }
123 if (IsWindowVisible(hPalWin))
124 {
125 y = 49;
126 h = clientRect.bottom - 49;
127 }
128 else
129 {
130 y = 3;
131 h = clientRect.bottom - 3;
132 }
133
134 MoveWindow(hScrollbox, x, y, w, IsWindowVisible(hStatusBar) ? h - 23 : h, TRUE);
135 MoveWindow(hPalWin, x, 9, 255, 32, TRUE);
136 }
137
138 void
139 saveImage(BOOL overwrite)
140 {
141 if (isAFile && overwrite)
142 {
143 SaveDIBToFile(hBms[currInd], filepathname, hDrawingDC, &fileTime, &fileSize, fileHPPM,
144 fileVPPM);
145 imageSaved = TRUE;
146 }
147 else if (GetSaveFileName(&sfn) != 0)
148 {
149 TCHAR tempstr[1000];
150 TCHAR resstr[100];
151 SaveDIBToFile(hBms[currInd], sfn.lpstrFile, hDrawingDC, &fileTime, &fileSize,
152 fileHPPM, fileVPPM);
153 CopyMemory(filename, sfn.lpstrFileTitle, sizeof(filename));
154 CopyMemory(filepathname, sfn.lpstrFile, sizeof(filepathname));
155 LoadString(hProgInstance, IDS_WINDOWTITLE, resstr, SIZEOF(resstr));
156 _stprintf(tempstr, resstr, filename);
157 SetWindowText(hMainWnd, tempstr);
158 isAFile = TRUE;
159 imageSaved = TRUE;
160 }
161 }
162
163 void
164 UpdateApplicationProperties(HBITMAP bitmap, LPTSTR newfilename, LPTSTR newfilepathname)
165 {
166 TCHAR tempstr[1000];
167 TCHAR resstr[100];
168 insertReversible(bitmap);
169 updateCanvasAndScrollbars();
170 CopyMemory(filename, newfilename, sizeof(filename));
171 CopyMemory(filepathname, newfilepathname, sizeof(filepathname));
172 LoadString(hProgInstance, IDS_WINDOWTITLE, resstr, SIZEOF(resstr));
173 _stprintf(tempstr, resstr, filename);
174 SetWindowText(hMainWnd, tempstr);
175 clearHistory();
176 isAFile = TRUE;
177 }
178
179 void
180 InsertSelectionFromHBITMAP(HBITMAP bitmap, HWND window)
181 {
182 HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL);
183 SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0));
184 SendMessage(window, WM_COMMAND, ID_RECTSEL, 0);
185
186 DeleteObject(SelectObject(hSelDC, hSelBm = CopyImage(bitmap,
187 IMAGE_BITMAP, 0, 0,
188 LR_COPYRETURNORG)));
189 newReversible();
190 rectSel_src[0] = rectSel_src[1] = rectSel_src[2] = rectSel_src[3] = 0;
191 rectSel_dest[0] = rectSel_dest[1] = 0;
192 rectSel_dest[2] = GetDIBWidth(hSelBm);
193 rectSel_dest[3] = GetDIBHeight(hSelBm);
194 BitBlt(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3],
195 hSelDC, 0, 0, SRCCOPY);
196 placeSelWin();
197 ShowWindow(hSelection, SW_SHOW);
198 }
199
200 BOOL drawing;
201
202 LRESULT CALLBACK
203 WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
204 {
205 switch (message) /* handle the messages */
206 {
207 case WM_DROPFILES:
208 {
209 HDROP drophandle;
210 TCHAR droppedfile[MAX_PATH];
211 HBITMAP bmNew = NULL;
212 drophandle = (HDROP)wParam;
213 DragQueryFile(drophandle, 0, droppedfile, SIZEOF(droppedfile));
214 DragFinish(drophandle);
215 LoadDIBFromFile(&bmNew, droppedfile, &fileTime, &fileSize, &fileHPPM, &fileVPPM);
216 if (bmNew != NULL)
217 {
218 TCHAR *pathend;
219 pathend = _tcsrchr(droppedfile, '\\');
220 pathend++;
221 UpdateApplicationProperties(bmNew, pathend, pathend);
222 }
223 break;
224 }
225
226 case WM_CREATE:
227 ptStack = NULL;
228 ptSP = 0;
229 break;
230
231 case WM_DESTROY:
232 PostQuitMessage(0); /* send a WM_QUIT to the message queue */
233 break;
234
235 case WM_CLOSE:
236 if (hwnd == hwndMiniature)
237 {
238 ShowWindow(hwndMiniature, SW_HIDE);
239 showMiniature = FALSE;
240 break;
241 }
242 if (!imageSaved)
243 {
244 TCHAR programname[20];
245 TCHAR saveprompttext[100];
246 TCHAR temptext[500];
247 LoadString(hProgInstance, IDS_PROGRAMNAME, programname, SIZEOF(programname));
248 LoadString(hProgInstance, IDS_SAVEPROMPTTEXT, saveprompttext, SIZEOF(saveprompttext));
249 _stprintf(temptext, saveprompttext, filename);
250 switch (MessageBox(hwnd, temptext, programname, MB_YESNOCANCEL | MB_ICONQUESTION))
251 {
252 case IDNO:
253 DestroyWindow(hwnd);
254 break;
255 case IDYES:
256 saveImage(FALSE);
257 if (imageSaved)
258 DestroyWindow(hwnd);
259 break;
260 }
261 }
262 else
263 {
264 DestroyWindow(hwnd);
265 }
266 break;
267
268 case WM_INITMENUPOPUP:
269 switch (lParam)
270 {
271 case 0:
272 if (isAFile)
273 {
274 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERPLANE,
275 MF_ENABLED | MF_BYCOMMAND);
276 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERCENTERED,
277 MF_ENABLED | MF_BYCOMMAND);
278 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERSTRETCHED,
279 MF_ENABLED | MF_BYCOMMAND);
280 }
281 else
282 {
283 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERPLANE,
284 MF_GRAYED | MF_BYCOMMAND);
285 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERCENTERED,
286 MF_GRAYED | MF_BYCOMMAND);
287 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERSTRETCHED,
288 MF_GRAYED | MF_BYCOMMAND);
289 }
290 break;
291 case 1:
292 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITUNDO,
293 (undoSteps > 0) ? (MF_ENABLED | MF_BYCOMMAND) : (MF_GRAYED | MF_BYCOMMAND));
294 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITREDO,
295 (redoSteps > 0) ? (MF_ENABLED | MF_BYCOMMAND) : (MF_GRAYED | MF_BYCOMMAND));
296 if (IsWindowVisible(hSelection))
297 {
298 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCUT, MF_ENABLED | MF_BYCOMMAND);
299 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPY, MF_ENABLED | MF_BYCOMMAND);
300 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITDELETESELECTION, MF_ENABLED | MF_BYCOMMAND);
301 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITINVERTSELECTION, MF_ENABLED | MF_BYCOMMAND);
302 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPYTO, MF_ENABLED | MF_BYCOMMAND);
303 }
304 else
305 {
306 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCUT, MF_GRAYED | MF_BYCOMMAND);
307 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPY, MF_GRAYED | MF_BYCOMMAND);
308 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITDELETESELECTION, MF_GRAYED | MF_BYCOMMAND);
309 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITINVERTSELECTION, MF_GRAYED | MF_BYCOMMAND);
310 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPYTO, MF_GRAYED | MF_BYCOMMAND);
311 }
312 OpenClipboard(hMainWnd);
313 if (GetClipboardData(CF_BITMAP) != NULL)
314 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITPASTE, MF_ENABLED | MF_BYCOMMAND);
315 else
316 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITPASTE, MF_GRAYED | MF_BYCOMMAND);
317 CloseClipboard();
318 break;
319 case 3:
320 if (IsWindowVisible(hSelection))
321 EnableMenuItem(GetMenu(hMainWnd), IDM_IMAGECROP, MF_ENABLED | MF_BYCOMMAND);
322 else
323 EnableMenuItem(GetMenu(hMainWnd), IDM_IMAGECROP, MF_GRAYED | MF_BYCOMMAND);
324 CheckMenuItem(GetMenu(hMainWnd), IDM_IMAGEDRAWOPAQUE, (transpBg == 0) ?
325 (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
326 break;
327 }
328 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWTOOLBOX,
329 IsWindowVisible(hToolBoxContainer) ?
330 (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
331 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWCOLORPALETTE,
332 IsWindowVisible(hPalWin) ?
333 (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
334 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSTATUSBAR,
335 IsWindowVisible(hStatusBar) ?
336 (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
337
338 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWGRID,
339 showGrid ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
340 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWSHOWMINIATURE,
341 showMiniature ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
342
343 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM125,
344 (zoom == 125) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
345 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM25,
346 (zoom == 250) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
347 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM50,
348 (zoom == 500) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
349 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM100,
350 (zoom == 1000) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
351 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM200,
352 (zoom == 2000) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
353 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM400,
354 (zoom == 4000) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
355 CheckMenuItem(GetMenu(hMainWnd), IDM_VIEWZOOM800,
356 (zoom == 8000) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
357
358 CheckMenuItem(GetMenu(hMainWnd), IDM_COLORSMODERNPALETTE,
359 (selectedPalette == 1) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
360 CheckMenuItem(GetMenu(hMainWnd), IDM_COLORSOLDPALETTE,
361 (selectedPalette == 2) ? (MF_CHECKED | MF_BYCOMMAND) : (MF_UNCHECKED | MF_BYCOMMAND));
362 break;
363
364 case WM_SIZE:
365 if (hwnd == hMainWnd)
366 {
367 int test[] = { LOWORD(lParam) - 260, LOWORD(lParam) - 140, LOWORD(lParam) - 20 };
368 SendMessage(hStatusBar, WM_SIZE, wParam, lParam);
369 SendMessage(hStatusBar, SB_SETPARTS, 3, (LPARAM)&test);
370 alignChildrenToMainWindow();
371 InvalidateRect(hwnd, NULL, TRUE);
372 }
373 if (hwnd == hImageArea)
374 {
375 MoveWindow(hSizeboxLeftTop,
376 0,
377 0, 3, 3, TRUE);
378 MoveWindow(hSizeboxCenterTop,
379 imgXRes * zoom / 2000 + 3 * 3 / 4,
380 0, 3, 3, TRUE);
381 MoveWindow(hSizeboxRightTop,
382 imgXRes * zoom / 1000 + 3,
383 0, 3, 3, TRUE);
384 MoveWindow(hSizeboxLeftCenter,
385 0,
386 imgYRes * zoom / 2000 + 3 * 3 / 4, 3, 3, TRUE);
387 MoveWindow(hSizeboxRightCenter,
388 imgXRes * zoom / 1000 + 3,
389 imgYRes * zoom / 2000 + 3 * 3 / 4, 3, 3, TRUE);
390 MoveWindow(hSizeboxLeftBottom,
391 0,
392 imgYRes * zoom / 1000 + 3, 3, 3, TRUE);
393 MoveWindow(hSizeboxCenterBottom,
394 imgXRes * zoom / 2000 + 3 * 3 / 4,
395 imgYRes * zoom / 1000 + 3, 3, 3, TRUE);
396 MoveWindow(hSizeboxRightBottom,
397 imgXRes * zoom / 1000 + 3,
398 imgYRes * zoom / 1000 + 3, 3, 3, TRUE);
399 }
400 if ((hwnd == hImageArea) || (hwnd == hScrollbox))
401 {
402 long clientRectScrollbox[4];
403 long clientRectImageArea[4];
404 SCROLLINFO si;
405 GetClientRect(hScrollbox, (LPRECT) &clientRectScrollbox);
406 GetClientRect(hImageArea, (LPRECT) &clientRectImageArea);
407 si.cbSize = sizeof(SCROLLINFO);
408 si.fMask = SIF_PAGE | SIF_RANGE;
409 si.nMax = clientRectImageArea[2] + 6 - 1;
410 si.nMin = 0;
411 si.nPage = clientRectScrollbox[2];
412 SetScrollInfo(hScrollbox, SB_HORZ, &si, TRUE);
413 GetClientRect(hScrollbox, (LPRECT) clientRectScrollbox);
414 si.nMax = clientRectImageArea[3] + 6 - 1;
415 si.nPage = clientRectScrollbox[3];
416 SetScrollInfo(hScrollbox, SB_VERT, &si, TRUE);
417 MoveWindow(hScrlClient,
418 -GetScrollPos(hScrollbox, SB_HORZ), -GetScrollPos(hScrollbox, SB_VERT),
419 max(clientRectImageArea[2] + 6, clientRectScrollbox[2]),
420 max(clientRectImageArea[3] + 6, clientRectScrollbox[3]), TRUE);
421 }
422 break;
423
424 case WM_HSCROLL:
425 if (hwnd == hScrollbox)
426 {
427 SCROLLINFO si;
428 si.cbSize = sizeof(SCROLLINFO);
429 si.fMask = SIF_ALL;
430 GetScrollInfo(hScrollbox, SB_HORZ, &si);
431 switch (LOWORD(wParam))
432 {
433 case SB_THUMBTRACK:
434 case SB_THUMBPOSITION:
435 si.nPos = HIWORD(wParam);
436 break;
437 case SB_LINELEFT:
438 si.nPos -= 5;
439 break;
440 case SB_LINERIGHT:
441 si.nPos += 5;
442 break;
443 case SB_PAGELEFT:
444 si.nPos -= si.nPage;
445 break;
446 case SB_PAGERIGHT:
447 si.nPos += si.nPage;
448 break;
449 }
450 SetScrollInfo(hScrollbox, SB_HORZ, &si, TRUE);
451 MoveWindow(hScrlClient, -GetScrollPos(hScrollbox, SB_HORZ),
452 -GetScrollPos(hScrollbox, SB_VERT), imgXRes * zoom / 1000 + 6,
453 imgYRes * zoom / 1000 + 6, TRUE);
454 }
455 break;
456
457 case WM_VSCROLL:
458 if (hwnd == hScrollbox)
459 {
460 SCROLLINFO si;
461 si.cbSize = sizeof(SCROLLINFO);
462 si.fMask = SIF_ALL;
463 GetScrollInfo(hScrollbox, SB_VERT, &si);
464 switch (LOWORD(wParam))
465 {
466 case SB_THUMBTRACK:
467 case SB_THUMBPOSITION:
468 si.nPos = HIWORD(wParam);
469 break;
470 case SB_LINEUP:
471 si.nPos -= 5;
472 break;
473 case SB_LINEDOWN:
474 si.nPos += 5;
475 break;
476 case SB_PAGEUP:
477 si.nPos -= si.nPage;
478 break;
479 case SB_PAGEDOWN:
480 si.nPos += si.nPage;
481 break;
482 }
483 SetScrollInfo(hScrollbox, SB_VERT, &si, TRUE);
484 MoveWindow(hScrlClient, -GetScrollPos(hScrollbox, SB_HORZ),
485 -GetScrollPos(hScrollbox, SB_VERT), imgXRes * zoom / 1000 + 6,
486 imgYRes * zoom / 1000 + 6, TRUE);
487 }
488 break;
489
490 case WM_GETMINMAXINFO:
491 if (hwnd == hMainWnd)
492 {
493 MINMAXINFO *mm = (LPMINMAXINFO) lParam;
494 mm->ptMinTrackSize.x = 330;
495 mm->ptMinTrackSize.y = 430;
496 }
497 break;
498
499 case WM_PAINT:
500 DefWindowProc(hwnd, message, wParam, lParam);
501 if (hwnd == hImageArea)
502 {
503 HDC hdc = GetDC(hImageArea);
504 StretchBlt(hdc, 0, 0, imgXRes * zoom / 1000, imgYRes * zoom / 1000, hDrawingDC, 0, 0, imgXRes,
505 imgYRes, SRCCOPY);
506 if (showGrid && (zoom >= 4000))
507 {
508 HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, 0x00a0a0a0));
509 int counter;
510 for(counter = 0; counter <= imgYRes; counter++)
511 {
512 MoveToEx(hdc, 0, counter * zoom / 1000, NULL);
513 LineTo(hdc, imgXRes * zoom / 1000, counter * zoom / 1000);
514 }
515 for(counter = 0; counter <= imgXRes; counter++)
516 {
517 MoveToEx(hdc, counter * zoom / 1000, 0, NULL);
518 LineTo(hdc, counter * zoom / 1000, imgYRes * zoom / 1000);
519 }
520 DeleteObject(SelectObject(hdc, oldPen));
521 }
522 ReleaseDC(hImageArea, hdc);
523 InvalidateRect(hSelection, NULL, FALSE);
524 InvalidateRect(hwndMiniature, NULL, FALSE);
525 }
526 else if (hwnd == hwndMiniature)
527 {
528 RECT mclient;
529 HDC hdc;
530 GetClientRect(hwndMiniature, &mclient);
531 hdc = GetDC(hwndMiniature);
532 StretchBlt(hdc, 0, 0, mclient.right, mclient.bottom, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY);
533 ReleaseDC(hwndMiniature, hdc);
534 }
535 break;
536
537 // mouse events used for drawing
538
539 case WM_SETCURSOR:
540 if (hwnd == hImageArea)
541 {
542 switch (activeTool)
543 {
544 case TOOL_FILL:
545 SetCursor(hCurFill);
546 break;
547 case TOOL_COLOR:
548 SetCursor(hCurColor);
549 break;
550 case TOOL_ZOOM:
551 SetCursor(hCurZoom);
552 break;
553 case TOOL_PEN:
554 SetCursor(hCurPen);
555 break;
556 case TOOL_AIRBRUSH:
557 SetCursor(hCurAirbrush);
558 break;
559 default:
560 SetCursor(LoadCursor(NULL, IDC_CROSS));
561 }
562 }
563 else
564 DefWindowProc(hwnd, message, wParam, lParam);
565 break;
566
567 case WM_LBUTTONDOWN:
568 if (hwnd == hImageArea)
569 {
570 if ((!drawing) || (activeTool == TOOL_COLOR))
571 {
572 SetCapture(hImageArea);
573 drawing = TRUE;
574 startPaintingL(hDrawingDC, GET_X_LPARAM(lParam) * 1000 / zoom, GET_Y_LPARAM(lParam) * 1000 / zoom,
575 fgColor, bgColor);
576 }
577 else
578 {
579 SendMessage(hwnd, WM_LBUTTONUP, wParam, lParam);
580 undo();
581 }
582 InvalidateRect(hImageArea, NULL, FALSE);
583 if ((activeTool == TOOL_ZOOM) && (zoom < 8000))
584 zoomTo(zoom * 2, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
585 }
586 break;
587
588 case WM_RBUTTONDOWN:
589 if (hwnd == hImageArea)
590 {
591 if ((!drawing) || (activeTool == TOOL_COLOR))
592 {
593 SetCapture(hImageArea);
594 drawing = TRUE;
595 startPaintingR(hDrawingDC, GET_X_LPARAM(lParam) * 1000 / zoom, GET_Y_LPARAM(lParam) * 1000 / zoom,
596 fgColor, bgColor);
597 }
598 else
599 {
600 SendMessage(hwnd, WM_RBUTTONUP, wParam, lParam);
601 undo();
602 }
603 InvalidateRect(hImageArea, NULL, FALSE);
604 if ((activeTool == TOOL_ZOOM) && (zoom > 125))
605 zoomTo(zoom / 2, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
606 }
607 break;
608
609 case WM_LBUTTONUP:
610 if ((hwnd == hImageArea) && drawing)
611 {
612 ReleaseCapture();
613 drawing = FALSE;
614 endPaintingL(hDrawingDC, GET_X_LPARAM(lParam) * 1000 / zoom, GET_Y_LPARAM(lParam) * 1000 / zoom, fgColor,
615 bgColor);
616 InvalidateRect(hImageArea, NULL, FALSE);
617 if (activeTool == TOOL_COLOR)
618 {
619 int tempColor =
620 GetPixel(hDrawingDC, GET_X_LPARAM(lParam) * 1000 / zoom, GET_Y_LPARAM(lParam) * 1000 / zoom);
621 if (tempColor != CLR_INVALID)
622 fgColor = tempColor;
623 InvalidateRect(hPalWin, NULL, FALSE);
624 }
625 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) "");
626 }
627 break;
628
629 case WM_RBUTTONUP:
630 if ((hwnd == hImageArea) && drawing)
631 {
632 ReleaseCapture();
633 drawing = FALSE;
634 endPaintingR(hDrawingDC, GET_X_LPARAM(lParam) * 1000 / zoom, GET_Y_LPARAM(lParam) * 1000 / zoom, fgColor,
635 bgColor);
636 InvalidateRect(hImageArea, NULL, FALSE);
637 if (activeTool == TOOL_COLOR)
638 {
639 int tempColor =
640 GetPixel(hDrawingDC, GET_X_LPARAM(lParam) * 1000 / zoom, GET_Y_LPARAM(lParam) * 1000 / zoom);
641 if (tempColor != CLR_INVALID)
642 bgColor = tempColor;
643 InvalidateRect(hPalWin, NULL, FALSE);
644 }
645 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) "");
646 }
647 break;
648
649 case WM_KEYDOWN:
650 if (wParam == VK_ESCAPE)
651 {
652 if (!drawing)
653 {
654 /* Deselect */
655 if ((activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL))
656 {
657 startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
658 whilePaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
659 endPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
660 ShowWindow(hSelection, SW_HIDE);
661 }
662 }
663 /* FIXME: also cancel current drawing underway */
664 }
665 break;
666
667 case WM_MOUSEMOVE:
668 if (hwnd == hImageArea)
669 {
670 LONG xNow = GET_X_LPARAM(lParam) * 1000 / zoom;
671 LONG yNow = GET_Y_LPARAM(lParam) * 1000 / zoom;
672 if ((!drawing) || (activeTool <= TOOL_AIRBRUSH))
673 {
674 TRACKMOUSEEVENT tme;
675
676 if (activeTool == TOOL_ZOOM)
677 {
678 InvalidateRect(hImageArea, NULL, FALSE);
679 UpdateWindow(hImageArea);
680 drawZoomFrame(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
681 }
682
683 tme.cbSize = sizeof(TRACKMOUSEEVENT);
684 tme.dwFlags = TME_LEAVE;
685 tme.hwndTrack = hImageArea;
686 tme.dwHoverTime = 0;
687 TrackMouseEvent(&tme);
688
689 if (!drawing)
690 {
691 TCHAR coordStr[100];
692 _stprintf(coordStr, _T("%d, %d"), xNow, yNow);
693 SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
694 }
695 }
696 if (drawing)
697 {
698 /* values displayed in statusbar */
699 LONG xRel = xNow - start.x;
700 LONG yRel = yNow - start.y;
701 /* freesel, rectsel and text tools always show numbers limited to fit into image area */
702 if ((activeTool == TOOL_FREESEL) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_TEXT))
703 {
704 if (xRel < 0)
705 xRel = (xNow < 0) ? -start.x : xRel;
706 else if (xNow > imgXRes)
707 xRel = imgXRes-start.x;
708 if (yRel < 0)
709 yRel = (yNow < 0) ? -start.y : yRel;
710 else if (yNow > imgYRes)
711 yRel = imgYRes-start.y;
712 }
713 /* rectsel and shape tools always show non-negative numbers when drawing */
714 if ((activeTool == TOOL_RECTSEL) || (activeTool == TOOL_SHAPE))
715 {
716 if (xRel < 0)
717 xRel = -xRel;
718 if (yRel < 0)
719 yRel = -yRel;
720 }
721 /* while drawing, update cursor coordinates only for tools 3, 7, 8, 9, 14 */
722 switch(activeTool)
723 {
724 case TOOL_RUBBER:
725 case TOOL_PEN:
726 case TOOL_BRUSH:
727 case TOOL_AIRBRUSH:
728 case TOOL_SHAPE:
729 {
730 TCHAR coordStr[100];
731 _stprintf(coordStr, _T("%d, %d"), xNow, yNow);
732 SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
733 break;
734 }
735 }
736 if ((wParam & MK_LBUTTON) != 0)
737 {
738 whilePaintingL(hDrawingDC, xNow, yNow, fgColor, bgColor);
739 InvalidateRect(hImageArea, NULL, FALSE);
740 if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL))
741 {
742 TCHAR sizeStr[100];
743 if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0))
744 yRel = xRel;
745 _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
746 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
747 }
748 }
749 if ((wParam & MK_RBUTTON) != 0)
750 {
751 whilePaintingR(hDrawingDC, xNow, yNow, fgColor, bgColor);
752 InvalidateRect(hImageArea, NULL, FALSE);
753 if (activeTool >= TOOL_TEXT)
754 {
755 TCHAR sizeStr[100];
756 if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0))
757 yRel = xRel;
758 _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
759 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
760 }
761 }
762 }
763 }
764 break;
765
766 case WM_MOUSELEAVE:
767 SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) _T(""));
768 if (activeTool == TOOL_ZOOM)
769 InvalidateRect(hImageArea, NULL, FALSE);
770 break;
771
772 // menu and button events
773
774 case WM_SYSCOLORCHANGE:
775 {
776 /* Redirect message to common controls */
777 HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL);
778 SendMessage(hToolbar, WM_SYSCOLORCHANGE, 0, 0);
779 break;
780 }
781
782 case WM_COMMAND:
783 switch (LOWORD(wParam))
784 {
785 case IDM_HELPINFO:
786 {
787 HICON paintIcon = LoadIcon(hProgInstance, MAKEINTRESOURCE(IDI_APPICON));
788 TCHAR infotitle[100];
789 TCHAR infotext[200];
790 LoadString(hProgInstance, IDS_INFOTITLE, infotitle, SIZEOF(infotitle));
791 LoadString(hProgInstance, IDS_INFOTEXT, infotext, SIZEOF(infotext));
792 ShellAbout(hMainWnd, infotitle, infotext, paintIcon);
793 DeleteObject(paintIcon);
794 break;
795 }
796 case IDM_HELPHELPTOPICS:
797 //HtmlHelp(hMainWnd, "help\\Paint.chm", 0, 0);
798 break;
799 case IDM_FILEEXIT:
800 SendMessage(hwnd, WM_CLOSE, wParam, lParam);
801 break;
802 case IDM_FILENEW:
803 {
804 BOOL reset = TRUE;
805 if (!imageSaved)
806 {
807 TCHAR programname[20];
808 TCHAR saveprompttext[100];
809 TCHAR temptext[500];
810 LoadString(hProgInstance, IDS_PROGRAMNAME, programname, SIZEOF(programname));
811 LoadString(hProgInstance, IDS_SAVEPROMPTTEXT, saveprompttext, SIZEOF(saveprompttext));
812 _stprintf(temptext, saveprompttext, filename);
813 switch (MessageBox(hwnd, temptext, programname, MB_YESNOCANCEL | MB_ICONQUESTION))
814 {
815 case IDNO:
816 imageSaved = TRUE;
817 break;
818 case IDYES:
819 saveImage(FALSE);
820 break;
821 case IDCANCEL:
822 reset = FALSE;
823 break;
824 }
825 }
826 if (reset && imageSaved)
827 {
828 Rectangle(hDrawingDC, 0 - 1, 0 - 1, imgXRes + 1, imgYRes + 1);
829 InvalidateRect(hImageArea, NULL, FALSE);
830 updateCanvasAndScrollbars();
831 clearHistory();
832 }
833 break;
834 }
835 case IDM_FILEOPEN:
836 if (GetOpenFileName(&ofn) != 0)
837 {
838 HBITMAP bmNew = NULL;
839 LoadDIBFromFile(&bmNew, ofn.lpstrFile, &fileTime, &fileSize, &fileHPPM, &fileVPPM);
840 if (bmNew != NULL)
841 {
842 UpdateApplicationProperties(bmNew, ofn.lpstrFileTitle, ofn.lpstrFileTitle);
843 }
844 }
845 break;
846 case IDM_FILESAVE:
847 saveImage(TRUE);
848 break;
849 case IDM_FILESAVEAS:
850 saveImage(FALSE);
851 break;
852 case IDM_FILEASWALLPAPERPLANE:
853 SetWallpaper(filepathname, 1, 1);
854 break;
855 case IDM_FILEASWALLPAPERCENTERED:
856 SetWallpaper(filepathname, 1, 0);
857 break;
858 case IDM_FILEASWALLPAPERSTRETCHED:
859 SetWallpaper(filepathname, 2, 0);
860 break;
861 case IDM_EDITUNDO:
862 undo();
863 InvalidateRect(hImageArea, NULL, FALSE);
864 break;
865 case IDM_EDITREDO:
866 redo();
867 InvalidateRect(hImageArea, NULL, FALSE);
868 break;
869 case IDM_EDITCOPY:
870 OpenClipboard(hMainWnd);
871 EmptyClipboard();
872 SetClipboardData(CF_BITMAP, CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
873 CloseClipboard();
874 break;
875 case IDM_EDITCUT:
876 /* Copy */
877 SendMessage(hwnd, WM_COMMAND, IDM_EDITCOPY, 0);
878 /* Delete selection */
879 SendMessage(hwnd, WM_COMMAND, IDM_EDITDELETESELECTION, 0);
880 break;
881 case IDM_EDITPASTE:
882 OpenClipboard(hMainWnd);
883 if (GetClipboardData(CF_BITMAP) != NULL)
884 {
885 InsertSelectionFromHBITMAP(GetClipboardData(CF_BITMAP), hwnd);
886 }
887 CloseClipboard();
888 break;
889 case IDM_EDITDELETESELECTION:
890 {
891 /* remove selection window and already painted content using undo(),
892 paint Rect for rectangular selections and Poly for freeform selections */
893 undo();
894 if (activeTool == TOOL_RECTSEL)
895 {
896 newReversible();
897 Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0],
898 rectSel_dest[3] + rectSel_dest[1], bgColor, bgColor, 0, TRUE);
899 }
900 if (activeTool == TOOL_FREESEL)
901 {
902 newReversible();
903 Poly(hDrawingDC, ptStack, ptSP + 1, 0, 0, 2, 0, FALSE);
904 }
905 break;
906 }
907 case IDM_EDITSELECTALL:
908 {
909 HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL);
910 SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0));
911 SendMessage(hwnd, WM_COMMAND, ID_RECTSEL, 0);
912 startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
913 whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
914 endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
915 break;
916 }
917 case IDM_EDITCOPYTO:
918 if (GetSaveFileName(&ofn) != 0)
919 SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM);
920 break;
921 case IDM_EDITPASTEFROM:
922 if (GetOpenFileName(&ofn) != 0)
923 {
924 HBITMAP bmNew = NULL;
925 LoadDIBFromFile(&bmNew, ofn.lpstrFile, &fileTime, &fileSize, &fileHPPM, &fileVPPM);
926 if (bmNew != NULL)
927 {
928 InsertSelectionFromHBITMAP(bmNew, hwnd);
929 DeleteObject(bmNew);
930 }
931 }
932 break;
933 case IDM_COLORSEDITPALETTE:
934 if (ChooseColor(&choosecolor))
935 {
936 fgColor = choosecolor.rgbResult;
937 InvalidateRect(hPalWin, NULL, FALSE);
938 }
939 break;
940 case IDM_COLORSMODERNPALETTE:
941 selectedPalette = 1;
942 CopyMemory(palColors, modernPalColors, sizeof(palColors));
943 InvalidateRect(hPalWin, NULL, FALSE);
944 break;
945 case IDM_COLORSOLDPALETTE:
946 selectedPalette = 2;
947 CopyMemory(palColors, oldPalColors, sizeof(palColors));
948 InvalidateRect(hPalWin, NULL, FALSE);
949 break;
950 case IDM_IMAGEINVERTCOLORS:
951 {
952 RECT tempRect;
953 newReversible();
954 SetRect(&tempRect, 0, 0, imgXRes, imgYRes);
955 InvertRect(hDrawingDC, &tempRect);
956 InvalidateRect(hImageArea, NULL, FALSE);
957 break;
958 }
959 case IDM_IMAGEDELETEIMAGE:
960 newReversible();
961 Rect(hDrawingDC, 0, 0, imgXRes, imgYRes, bgColor, bgColor, 0, TRUE);
962 InvalidateRect(hImageArea, NULL, FALSE);
963 break;
964 case IDM_IMAGEROTATEMIRROR:
965 switch (mirrorRotateDlg())
966 {
967 case 1: /* flip horizontally */
968 if (IsWindowVisible(hSelection))
969 {
970 SelectObject(hSelDC, hSelMask);
971 StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC,
972 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
973 SelectObject(hSelDC, hSelBm);
974 StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC,
975 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
976 /* force refresh of selection contents, used also in case 2 and case 4 */
977 SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
978 SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
979 SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
980 }
981 else
982 {
983 newReversible();
984 StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0,
985 imgXRes, imgYRes, SRCCOPY);
986 InvalidateRect(hImageArea, NULL, FALSE);
987 }
988 break;
989 case 2: /* flip vertically */
990 if (IsWindowVisible(hSelection))
991 {
992 SelectObject(hSelDC, hSelMask);
993 StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC,
994 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
995 SelectObject(hSelDC, hSelBm);
996 StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC,
997 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
998 SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
999 SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
1000 SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
1001 }
1002 else
1003 {
1004 newReversible();
1005 StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0,
1006 imgXRes, imgYRes, SRCCOPY);
1007 InvalidateRect(hImageArea, NULL, FALSE);
1008 }
1009 break;
1010 case 3: /* rotate 90 degrees */
1011 break;
1012 case 4: /* rotate 180 degrees */
1013 if (IsWindowVisible(hSelection))
1014 {
1015 SelectObject(hSelDC, hSelMask);
1016 StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC,
1017 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
1018 SelectObject(hSelDC, hSelBm);
1019 StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC,
1020 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
1021 SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
1022 SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
1023 SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
1024 }
1025 else
1026 {
1027 newReversible();
1028 StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC,
1029 0, 0, imgXRes, imgYRes, SRCCOPY);
1030 InvalidateRect(hImageArea, NULL, FALSE);
1031 }
1032 break;
1033 case 5: /* rotate 270 degrees */
1034 break;
1035 }
1036 break;
1037 case IDM_IMAGEATTRIBUTES:
1038 {
1039 if (attributesDlg())
1040 {
1041 cropReversible(widthSetInDlg, heightSetInDlg, 0, 0);
1042 updateCanvasAndScrollbars();
1043 }
1044 break;
1045 }
1046 case IDM_IMAGESTRETCHSKEW:
1047 {
1048 if (changeSizeDlg())
1049 {
1050 insertReversible(CopyImage(hBms[currInd], IMAGE_BITMAP,
1051 imgXRes * stretchSkew.percentage.x / 100,
1052 imgYRes * stretchSkew.percentage.y / 100, 0));
1053 updateCanvasAndScrollbars();
1054 }
1055 break;
1056 }
1057 case IDM_IMAGEDRAWOPAQUE:
1058 transpBg = 1 - transpBg;
1059 InvalidateRect(hToolSettings, NULL, TRUE);
1060 break;
1061 case IDM_IMAGECROP:
1062 insertReversible(CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
1063 updateCanvasAndScrollbars();
1064 break;
1065
1066 case IDM_VIEWTOOLBOX:
1067 ShowWindow(hToolBoxContainer, IsWindowVisible(hToolBoxContainer) ? SW_HIDE : SW_SHOW);
1068 alignChildrenToMainWindow();
1069 break;
1070 case IDM_VIEWCOLORPALETTE:
1071 ShowWindow(hPalWin, IsWindowVisible(hPalWin) ? SW_HIDE : SW_SHOW);
1072 alignChildrenToMainWindow();
1073 break;
1074 case IDM_VIEWSTATUSBAR:
1075 ShowWindow(hStatusBar, IsWindowVisible(hStatusBar) ? SW_HIDE : SW_SHOW);
1076 alignChildrenToMainWindow();
1077 break;
1078
1079 case IDM_VIEWSHOWGRID:
1080 showGrid = !showGrid;
1081 InvalidateRect(hImageArea, NULL, FALSE);
1082 break;
1083 case IDM_VIEWSHOWMINIATURE:
1084 showMiniature = !showMiniature;
1085 ShowWindow(hwndMiniature, showMiniature ? SW_SHOW : SW_HIDE);
1086 break;
1087
1088 case IDM_VIEWZOOM125:
1089 zoomTo(125, 0, 0);
1090 break;
1091 case IDM_VIEWZOOM25:
1092 zoomTo(250, 0, 0);
1093 break;
1094 case IDM_VIEWZOOM50:
1095 zoomTo(500, 0, 0);
1096 break;
1097 case IDM_VIEWZOOM100:
1098 zoomTo(1000, 0, 0);
1099 break;
1100 case IDM_VIEWZOOM200:
1101 zoomTo(2000, 0, 0);
1102 break;
1103 case IDM_VIEWZOOM400:
1104 zoomTo(4000, 0, 0);
1105 break;
1106 case IDM_VIEWZOOM800:
1107 zoomTo(8000, 0, 0);
1108 break;
1109 case ID_FREESEL:
1110 selectTool(1);
1111 break;
1112 case ID_RECTSEL:
1113 selectTool(2);
1114 break;
1115 case ID_RUBBER:
1116 selectTool(3);
1117 break;
1118 case ID_FILL:
1119 selectTool(4);
1120 break;
1121 case ID_COLOR:
1122 selectTool(5);
1123 break;
1124 case ID_ZOOM:
1125 selectTool(6);
1126 break;
1127 case ID_PEN:
1128 selectTool(7);
1129 break;
1130 case ID_BRUSH:
1131 selectTool(8);
1132 break;
1133 case ID_AIRBRUSH:
1134 selectTool(9);
1135 break;
1136 case ID_TEXT:
1137 selectTool(10);
1138 break;
1139 case ID_LINE:
1140 selectTool(11);
1141 break;
1142 case ID_BEZIER:
1143 selectTool(12);
1144 break;
1145 case ID_RECT:
1146 selectTool(13);
1147 break;
1148 case ID_SHAPE:
1149 selectTool(14);
1150 break;
1151 case ID_ELLIPSE:
1152 selectTool(15);
1153 break;
1154 case ID_RRECT:
1155 selectTool(16);
1156 break;
1157 }
1158 break;
1159 default:
1160 return DefWindowProc(hwnd, message, wParam, lParam);
1161 }
1162
1163 return 0;
1164 }