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