* Turkish translation update and improvements by Erdem Ersoy.
[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 }
797 break;
798 case IDM_FILESAVE:
799 saveImage(TRUE);
800 break;
801 case IDM_FILESAVEAS:
802 saveImage(FALSE);
803 break;
804 case IDM_FILEASWALLPAPERPLANE:
805 SetWallpaper(filepathname, 1, 1);
806 break;
807 case IDM_FILEASWALLPAPERCENTERED:
808 SetWallpaper(filepathname, 1, 0);
809 break;
810 case IDM_FILEASWALLPAPERSTRETCHED:
811 SetWallpaper(filepathname, 2, 0);
812 break;
813 case IDM_EDITUNDO:
814 undo();
815 InvalidateRect(hImageArea, NULL, FALSE);
816 break;
817 case IDM_EDITREDO:
818 redo();
819 InvalidateRect(hImageArea, NULL, FALSE);
820 break;
821 case IDM_EDITCOPY:
822 OpenClipboard(hMainWnd);
823 EmptyClipboard();
824 SetClipboardData(CF_BITMAP, CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
825 CloseClipboard();
826 break;
827 case IDM_EDITCUT:
828 /* Copy */
829 SendMessage(hwnd, WM_COMMAND, IDM_EDITCOPY, 0);
830 /* Delete selection */
831 SendMessage(hwnd, WM_COMMAND, IDM_EDITDELETESELECTION, 0);
832 break;
833 case IDM_EDITPASTE:
834 OpenClipboard(hMainWnd);
835 if (GetClipboardData(CF_BITMAP) != NULL)
836 {
837 HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL);
838 SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0));
839 SendMessage(hwnd, WM_COMMAND, ID_RECTSEL, 0);
840
841 DeleteObject(SelectObject(hSelDC, hSelBm = CopyImage(GetClipboardData(CF_BITMAP),
842 IMAGE_BITMAP, 0, 0,
843 LR_COPYRETURNORG)));
844 newReversible();
845 rectSel_src[0] = rectSel_src[1] = rectSel_src[2] = rectSel_src[3] = 0;
846 rectSel_dest[0] = rectSel_dest[1] = 0;
847 rectSel_dest[2] = GetDIBWidth(hSelBm);
848 rectSel_dest[3] = GetDIBHeight(hSelBm);
849 BitBlt(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3],
850 hSelDC, 0, 0, SRCCOPY);
851 placeSelWin();
852 ShowWindow(hSelection, SW_SHOW);
853 }
854 CloseClipboard();
855 break;
856 case IDM_EDITDELETESELECTION:
857 {
858 /* remove selection window and already painted content using undo(),
859 paint Rect for rectangular selections and Poly for freeform selections */
860 undo();
861 if (activeTool == TOOL_RECTSEL)
862 {
863 newReversible();
864 Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0],
865 rectSel_dest[3] + rectSel_dest[1], bgColor, bgColor, 0, TRUE);
866 }
867 if (activeTool == TOOL_FREESEL)
868 {
869 newReversible();
870 Poly(hDrawingDC, ptStack, ptSP + 1, 0, 0, 2, 0, FALSE);
871 }
872 break;
873 }
874 case IDM_EDITSELECTALL:
875 {
876 HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL);
877 SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0));
878 SendMessage(hwnd, WM_COMMAND, ID_RECTSEL, 0);
879 startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
880 whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
881 endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
882 break;
883 }
884 case IDM_EDITCOPYTO:
885 if (GetSaveFileName(&ofn) != 0)
886 SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM);
887 break;
888 case IDM_COLORSEDITPALETTE:
889 if (ChooseColor(&choosecolor))
890 {
891 fgColor = choosecolor.rgbResult;
892 InvalidateRect(hPalWin, NULL, FALSE);
893 }
894 break;
895 case IDM_COLORSMODERNPALETTE:
896 selectedPalette = 1;
897 CopyMemory(palColors, modernPalColors, sizeof(palColors));
898 InvalidateRect(hPalWin, NULL, FALSE);
899 break;
900 case IDM_COLORSOLDPALETTE:
901 selectedPalette = 2;
902 CopyMemory(palColors, oldPalColors, sizeof(palColors));
903 InvalidateRect(hPalWin, NULL, FALSE);
904 break;
905 case IDM_IMAGEINVERTCOLORS:
906 {
907 RECT tempRect;
908 newReversible();
909 SetRect(&tempRect, 0, 0, imgXRes, imgYRes);
910 InvertRect(hDrawingDC, &tempRect);
911 InvalidateRect(hImageArea, NULL, FALSE);
912 break;
913 }
914 case IDM_IMAGEDELETEIMAGE:
915 newReversible();
916 Rect(hDrawingDC, 0, 0, imgXRes, imgYRes, bgColor, bgColor, 0, TRUE);
917 InvalidateRect(hImageArea, NULL, FALSE);
918 break;
919 case IDM_IMAGEROTATEMIRROR:
920 switch (mirrorRotateDlg())
921 {
922 case 1: /* flip horizontally */
923 if (IsWindowVisible(hSelection))
924 {
925 SelectObject(hSelDC, hSelMask);
926 StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC,
927 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
928 SelectObject(hSelDC, hSelBm);
929 StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC,
930 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
931 /* force refresh of selection contents, used also in case 2 and case 4 */
932 SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
933 SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
934 SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
935 }
936 else
937 {
938 newReversible();
939 StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0,
940 imgXRes, imgYRes, SRCCOPY);
941 InvalidateRect(hImageArea, NULL, FALSE);
942 }
943 break;
944 case 2: /* flip vertically */
945 if (IsWindowVisible(hSelection))
946 {
947 SelectObject(hSelDC, hSelMask);
948 StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC,
949 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
950 SelectObject(hSelDC, hSelBm);
951 StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC,
952 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
953 SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
954 SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
955 SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
956 }
957 else
958 {
959 newReversible();
960 StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0,
961 imgXRes, imgYRes, SRCCOPY);
962 InvalidateRect(hImageArea, NULL, FALSE);
963 }
964 break;
965 case 3: /* rotate 90 degrees */
966 break;
967 case 4: /* rotate 180 degrees */
968 if (IsWindowVisible(hSelection))
969 {
970 SelectObject(hSelDC, hSelMask);
971 StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -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, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC,
975 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
976 SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
977 SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
978 SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
979 }
980 else
981 {
982 newReversible();
983 StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC,
984 0, 0, imgXRes, imgYRes, SRCCOPY);
985 InvalidateRect(hImageArea, NULL, FALSE);
986 }
987 break;
988 case 5: /* rotate 270 degrees */
989 break;
990 }
991 break;
992 case IDM_IMAGEATTRIBUTES:
993 {
994 if (attributesDlg())
995 {
996 cropReversible(widthSetInDlg, heightSetInDlg, 0, 0);
997 updateCanvasAndScrollbars();
998 }
999 break;
1000 }
1001 case IDM_IMAGESTRETCHSKEW:
1002 {
1003 if (changeSizeDlg())
1004 {
1005 insertReversible(CopyImage(hBms[currInd], IMAGE_BITMAP,
1006 imgXRes * stretchSkew.percentage.x / 100,
1007 imgYRes * stretchSkew.percentage.y / 100, 0));
1008 updateCanvasAndScrollbars();
1009 }
1010 break;
1011 }
1012 case IDM_IMAGEDRAWOPAQUE:
1013 transpBg = 1 - transpBg;
1014 InvalidateRect(hToolSettings, NULL, TRUE);
1015 break;
1016 case IDM_IMAGECROP:
1017 insertReversible(CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
1018 updateCanvasAndScrollbars();
1019 break;
1020
1021 case IDM_VIEWTOOLBOX:
1022 ShowWindow(hToolBoxContainer, IsWindowVisible(hToolBoxContainer) ? SW_HIDE : SW_SHOW);
1023 alignChildrenToMainWindow();
1024 break;
1025 case IDM_VIEWCOLORPALETTE:
1026 ShowWindow(hPalWin, IsWindowVisible(hPalWin) ? SW_HIDE : SW_SHOW);
1027 alignChildrenToMainWindow();
1028 break;
1029 case IDM_VIEWSTATUSBAR:
1030 ShowWindow(hStatusBar, IsWindowVisible(hStatusBar) ? SW_HIDE : SW_SHOW);
1031 alignChildrenToMainWindow();
1032 break;
1033
1034 case IDM_VIEWSHOWGRID:
1035 showGrid = !showGrid;
1036 InvalidateRect(hImageArea, NULL, FALSE);
1037 break;
1038 case IDM_VIEWSHOWMINIATURE:
1039 showMiniature = !showMiniature;
1040 ShowWindow(hwndMiniature, showMiniature ? SW_SHOW : SW_HIDE);
1041 break;
1042
1043 case IDM_VIEWZOOM125:
1044 zoomTo(125, 0, 0);
1045 break;
1046 case IDM_VIEWZOOM25:
1047 zoomTo(250, 0, 0);
1048 break;
1049 case IDM_VIEWZOOM50:
1050 zoomTo(500, 0, 0);
1051 break;
1052 case IDM_VIEWZOOM100:
1053 zoomTo(1000, 0, 0);
1054 break;
1055 case IDM_VIEWZOOM200:
1056 zoomTo(2000, 0, 0);
1057 break;
1058 case IDM_VIEWZOOM400:
1059 zoomTo(4000, 0, 0);
1060 break;
1061 case IDM_VIEWZOOM800:
1062 zoomTo(8000, 0, 0);
1063 break;
1064 case ID_FREESEL:
1065 selectTool(1);
1066 break;
1067 case ID_RECTSEL:
1068 selectTool(2);
1069 break;
1070 case ID_RUBBER:
1071 selectTool(3);
1072 break;
1073 case ID_FILL:
1074 selectTool(4);
1075 break;
1076 case ID_COLOR:
1077 selectTool(5);
1078 break;
1079 case ID_ZOOM:
1080 selectTool(6);
1081 break;
1082 case ID_PEN:
1083 selectTool(7);
1084 break;
1085 case ID_BRUSH:
1086 selectTool(8);
1087 break;
1088 case ID_AIRBRUSH:
1089 selectTool(9);
1090 break;
1091 case ID_TEXT:
1092 selectTool(10);
1093 break;
1094 case ID_LINE:
1095 selectTool(11);
1096 break;
1097 case ID_BEZIER:
1098 selectTool(12);
1099 break;
1100 case ID_RECT:
1101 selectTool(13);
1102 break;
1103 case ID_SHAPE:
1104 selectTool(14);
1105 break;
1106 case ID_ELLIPSE:
1107 selectTool(15);
1108 break;
1109 case ID_RRECT:
1110 selectTool(16);
1111 break;
1112 }
1113 break;
1114 default:
1115 return DefWindowProc(hwnd, message, wParam, lParam);
1116 }
1117
1118 return 0;
1119 }