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