Added Paint for ReactOS source folder
[reactos.git] / reactos / base / applications / paint / winproc.c
1 /*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL
4 * FILE: 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 <windows.h>
13 #include <commctrl.h>
14 //#include <htmlhelp.h>
15 #include <stdio.h>
16 #include "definitions.h"
17 #include "globalvar.h"
18 #include "dialogs.h"
19 #include "history.h"
20
21 /* FUNCTIONS ********************************************************/
22
23 void selectTool(int tool)
24 {
25 ShowWindow(hSelection, SW_HIDE);
26 activeTool = tool;
27 SendMessage(hToolSettings, WM_PAINT, 0, 0);
28 }
29
30 void updateCanvasAndScrollbars()
31 {
32 ShowWindow(hSelection, SW_HIDE);
33 MoveWindow(hImageArea, 3, 3, imgXRes*zoom/1000, imgYRes*zoom/1000, FALSE);
34 InvalidateRect(hScrollbox, NULL, TRUE);
35 InvalidateRect(hImageArea, NULL, FALSE);
36
37 SetScrollPos(hScrollbox, SB_HORZ, 0, TRUE);
38 SetScrollPos(hScrollbox, SB_VERT, 0, TRUE);
39 }
40
41 void ZoomTo(int newZoom)
42 {
43 zoom = newZoom;
44 updateCanvasAndScrollbars();
45 }
46
47 HDC hdc;
48 BOOL drawing;
49
50 LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
51 {
52 switch (message) /* handle the messages */
53 {
54 case WM_DESTROY:
55 PostQuitMessage (0); /* send a WM_QUIT to the message queue */
56 break;
57 case WM_CLOSE:
58 if (undoSteps>0)
59 {
60 char programname[20];
61 char saveprompttext[100];
62 LoadString(hProgInstance, IDS_PROGRAMNAME, (LPTSTR)&programname, 20);
63 LoadString(hProgInstance, IDS_SAVEPROMPTTEXT, (LPTSTR)&saveprompttext, 100);
64 char temptext[500];
65 sprintf(temptext, saveprompttext, filename);
66 switch (MessageBox(hwnd, (LPTSTR)&temptext, (LPTSTR)&programname, MB_YESNOCANCEL | MB_ICONQUESTION))
67 {
68 case IDNO:
69 DestroyWindow(hwnd);
70 break;
71 case IDYES:
72 SendMessage(hwnd, WM_COMMAND, IDM_FILESAVEAS, 0);
73 DestroyWindow(hwnd);
74 break;
75 }
76 }
77 else
78 {
79 DestroyWindow(hwnd);
80 }
81 break;
82 case WM_INITMENUPOPUP:
83 switch (lParam)
84 {
85 case 0:
86 if (FALSE)
87 {
88 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERPLANE, MF_ENABLED | MF_BYCOMMAND);
89 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERCENTERED, MF_ENABLED | MF_BYCOMMAND);
90 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERSTRETCHED, MF_ENABLED | MF_BYCOMMAND);
91 }
92 else
93 {
94 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERPLANE, MF_GRAYED | MF_BYCOMMAND);
95 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERCENTERED, MF_GRAYED | MF_BYCOMMAND);
96 EnableMenuItem(GetMenu(hMainWnd), IDM_FILEASWALLPAPERSTRETCHED, MF_GRAYED | MF_BYCOMMAND);
97 }
98 break;
99 case 1:
100 if (undoSteps>0)
101 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITUNDO, MF_ENABLED | MF_BYCOMMAND);
102 else
103 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITUNDO, MF_GRAYED | MF_BYCOMMAND);
104 if (redoSteps>0)
105 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITREDO, MF_ENABLED | MF_BYCOMMAND);
106 else
107 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITREDO, MF_GRAYED | MF_BYCOMMAND);
108 if (IsWindowVisible(hSelection))
109 {
110 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCUT, MF_ENABLED | MF_BYCOMMAND);
111 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPY, MF_ENABLED | MF_BYCOMMAND);
112 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITDELETESELECTION, MF_ENABLED | MF_BYCOMMAND);
113 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITINVERTSELECTION, MF_ENABLED | MF_BYCOMMAND);
114 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPYTO, MF_ENABLED | MF_BYCOMMAND);
115 }
116 else
117 {
118 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCUT, MF_GRAYED | MF_BYCOMMAND);
119 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPY, MF_GRAYED | MF_BYCOMMAND);
120 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITDELETESELECTION, MF_GRAYED | MF_BYCOMMAND);
121 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITINVERTSELECTION, MF_GRAYED | MF_BYCOMMAND);
122 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITCOPYTO, MF_GRAYED | MF_BYCOMMAND);
123 }
124 OpenClipboard(hMainWnd);
125 if (GetClipboardData(CF_BITMAP)!=NULL)
126 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITPASTE, MF_ENABLED | MF_BYCOMMAND);
127 else
128 EnableMenuItem(GetMenu(hMainWnd), IDM_EDITPASTE, MF_GRAYED | MF_BYCOMMAND);
129 CloseClipboard();
130 break;
131 case 3:
132 if (IsWindowVisible(hSelection))
133 EnableMenuItem(GetMenu(hMainWnd), IDM_IMAGECROP, MF_ENABLED | MF_BYCOMMAND);
134 else
135 EnableMenuItem(GetMenu(hMainWnd), IDM_IMAGECROP, MF_GRAYED | MF_BYCOMMAND);
136 if (transpBg==0)
137 CheckMenuItem(GetMenu(hMainWnd), IDM_IMAGEDRAWOPAQUE, MF_CHECKED | MF_BYCOMMAND);
138 else
139 CheckMenuItem(GetMenu(hMainWnd), IDM_IMAGEDRAWOPAQUE, MF_UNCHECKED | MF_BYCOMMAND);
140 break;
141 }
142 break;
143 case WM_SIZE:
144 if (hwnd==hMainWnd)
145 {
146 int test[] = {LOWORD(lParam)-260, LOWORD(lParam)-140, LOWORD(lParam)-20};
147 SendMessage(hStatusBar, WM_SIZE, wParam, lParam);
148 SendMessage(hStatusBar, SB_SETPARTS, 3, (int)&test);
149 MoveWindow(hScrollbox, 56, 49,LOWORD(lParam)-56, HIWORD(lParam)-72, TRUE);
150 //InvalidateRect(hwnd, NULL, TRUE);
151 }
152 if ((hwnd==hImageArea)||(hwnd==hScrollbox))
153 {
154 long clientRectScrollbox[4];
155 GetClientRect(hScrollbox, (LPRECT)&clientRectScrollbox);
156 long clientRectImageArea[4];
157 GetClientRect(hImageArea, (LPRECT)&clientRectImageArea);
158 MoveWindow(hScrlClient, 0, 0, max(clientRectImageArea[2]+6, clientRectScrollbox[2]), max(clientRectImageArea[3]+6, clientRectScrollbox[3]), TRUE);
159 SCROLLINFO horzScroll;
160 horzScroll.cbSize = sizeof(SCROLLINFO);
161 horzScroll.fMask = SIF_PAGE | SIF_RANGE;
162 horzScroll.nMax = 10000;
163 horzScroll.nMin = 0;
164 horzScroll.nPage = clientRectScrollbox[2]*10000/(clientRectImageArea[2]+6);
165 horzScroll.nPos = 0;
166 horzScroll.nTrackPos = 0;
167 SetScrollInfo(hScrollbox, SB_HORZ, &horzScroll, TRUE);
168 GetClientRect(hScrollbox, (LPRECT)clientRectScrollbox);
169 SCROLLINFO vertScroll;
170 vertScroll.cbSize = sizeof(SCROLLINFO);
171 vertScroll.fMask = SIF_PAGE | SIF_RANGE;
172 vertScroll.nMax = 10000;
173 vertScroll.nMin = 0;
174 vertScroll.nPage = clientRectScrollbox[3]*10000/(clientRectImageArea[3]+6);
175 vertScroll.nPos = 0;
176 vertScroll.nTrackPos = 0;
177 SetScrollInfo(hScrollbox, SB_VERT, &vertScroll, TRUE);
178 }
179 break;
180 case WM_HSCROLL:
181 if (hwnd==hScrollbox)
182 {
183 if ((LOWORD(wParam)==SB_THUMBPOSITION)||(LOWORD(wParam)==SB_THUMBTRACK))
184 {
185 SetScrollPos(hScrollbox, SB_HORZ, HIWORD(wParam), TRUE);
186 MoveWindow(hScrlClient, -(imgXRes*zoom/1000+6)*GetScrollPos(hScrollbox, SB_HORZ)/10000,
187 -(imgYRes*zoom/1000+6)*GetScrollPos(hScrollbox, SB_VERT)/10000, imgXRes*zoom/1000+6, imgYRes*zoom/1000+6, TRUE);
188 }
189 }
190 break;
191 case WM_VSCROLL:
192 if (hwnd==hScrollbox)
193 {
194 if ((LOWORD(wParam)==SB_THUMBPOSITION)||(LOWORD(wParam)==SB_THUMBTRACK))
195 {
196 SetScrollPos(hScrollbox, SB_VERT, HIWORD(wParam), TRUE);
197 MoveWindow(hScrlClient, -(imgXRes*zoom/1000+6)*GetScrollPos(hScrollbox, SB_HORZ)/10000,
198 -(imgYRes*zoom/1000+6)*GetScrollPos(hScrollbox, SB_VERT)/10000, imgXRes*zoom/1000+6, imgYRes*zoom/1000+6, TRUE);
199 }
200 }
201 break;
202 case WM_GETMINMAXINFO:
203 if (hwnd==hMainWnd)
204 {
205 MINMAXINFO *mm = (LPMINMAXINFO)lParam;
206 (*mm).ptMinTrackSize.x = 330;
207 (*mm).ptMinTrackSize.y = 430;
208 }
209 break;
210 case WM_PAINT:
211 DefWindowProc (hwnd, message, wParam, lParam);
212 if (hwnd==hImageArea)
213 {
214 HDC hdc = GetDC(hImageArea);
215 StretchBlt(hdc, 0, 0, imgXRes*zoom/1000, imgYRes*zoom/1000, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY);
216 ReleaseDC(hImageArea, hdc);
217 SendMessage(hSelection, WM_PAINT, 0, 0);
218 }
219 break;
220
221 // mouse events used for drawing
222
223 case WM_SETCURSOR:
224 if (hwnd==hImageArea)
225 {
226 switch (activeTool)
227 {
228 case 4:
229 SetCursor(hCurFill);
230 break;
231 case 5:
232 SetCursor(hCurColor);
233 break;
234 case 6:
235 SetCursor(hCurZoom);
236 break;
237 case 7:
238 SetCursor(hCurPen);
239 break;
240 case 9:
241 SetCursor(hCurAirbrush);
242 break;
243 default:
244 SetCursor(LoadCursor(NULL, IDC_CROSS));
245 }
246 } else DefWindowProc(hwnd, message, wParam, lParam);
247 break;
248 case WM_LBUTTONDOWN:
249 if (hwnd==hImageArea)
250 {
251 if ((!drawing)||(activeTool==5))
252 {
253 SetCapture(hImageArea);
254 drawing = TRUE;
255 startPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
256 }else
257 {
258 SendMessage(hwnd, WM_LBUTTONUP, wParam, lParam);
259 undo();
260 }
261 SendMessage(hImageArea, WM_PAINT, 0, 0);
262 if ((activeTool==6)&&(zoom<8000)) ZoomTo(zoom*2);
263 }
264 break;
265 case WM_RBUTTONDOWN:
266 if (hwnd==hImageArea)
267 {
268 if ((!drawing)||(activeTool==5))
269 {
270 SetCapture(hImageArea);
271 drawing = TRUE;
272 startPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor);
273 }else
274 {
275 SendMessage(hwnd, WM_RBUTTONUP, wParam, lParam);
276 undo();
277 }
278 SendMessage(hImageArea, WM_PAINT, 0, 0);
279 if ((activeTool==6)&&(zoom>125)) ZoomTo(zoom/2);
280 }
281 break;
282 case WM_LBUTTONUP:
283 if ((hwnd==hImageArea)&&drawing)
284 {
285 ReleaseCapture();
286 drawing = FALSE;
287 endPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
288 SendMessage(hImageArea, WM_PAINT, 0, 0);
289 if (activeTool==5)
290 {
291 int tempColor = GetPixel(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom);
292 if (tempColor!=CLR_INVALID) fgColor = tempColor;
293 SendMessage(hPalWin, WM_PAINT, 0, 0);
294 }
295 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)"");
296 }
297 break;
298 case WM_RBUTTONUP:
299 if ((hwnd==hImageArea)&&drawing)
300 {
301 ReleaseCapture();
302 drawing = FALSE;
303 endPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor);
304 SendMessage(hImageArea, WM_PAINT, 0, 0);
305 if (activeTool==5)
306 {
307 int tempColor = GetPixel(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom);
308 if (tempColor!=CLR_INVALID) bgColor = tempColor;
309 SendMessage(hPalWin, WM_PAINT, 0, 0);
310 }
311 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)"");
312 }
313 break;
314 case WM_MOUSEMOVE:
315 if (hwnd==hImageArea)
316 {
317 if ((!drawing)||(activeTool<=9))
318 {
319 char coordStr[100];
320 sprintf(coordStr, "%d, %d", (short)LOWORD(lParam)*1000/zoom, (short)HIWORD(lParam)*1000/zoom);
321 SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM)coordStr);
322 }
323 if (drawing)
324 {
325 if ((wParam&MK_LBUTTON)!=0)
326 {
327 whilePainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor);
328 SendMessage(hImageArea, WM_PAINT, 0, 0);
329 if ((activeTool>=10)||(activeTool==2))
330 {
331 char sizeStr[100];
332 sprintf(sizeStr, "%d x %d", (short)LOWORD(lParam)*1000/zoom-startX, (short)HIWORD(lParam)*1000/zoom-startY);
333 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)sizeStr);
334 }
335 }
336 if ((wParam&MK_RBUTTON)!=0)
337 {
338 whilePainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor);
339 SendMessage(hImageArea, WM_PAINT, 0, 0);
340 if (activeTool>=10)
341 {
342 char sizeStr[100];
343 sprintf(sizeStr, "%d x %d", (short)LOWORD(lParam)*1000/zoom-startX, (short)HIWORD(lParam)*1000/zoom-startY);
344 SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)sizeStr);
345 }
346 }
347 }
348 } else
349 {
350 SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM)"");
351 }
352 break;
353
354 // menu and button events
355
356 case WM_COMMAND:
357 switch (LOWORD(wParam))
358 {
359 case IDM_HELPINFO:
360 {
361 HICON paintIcon = LoadIcon(hProgInstance, MAKEINTRESOURCE(IDI_APPICON));
362 char infotitle[100];
363 char infotext[200];
364 LoadString(hProgInstance, IDS_INFOTITLE, (LPTSTR)&infotitle, 100);
365 LoadString(hProgInstance, IDS_INFOTEXT, (LPTSTR)&infotext, 200);
366 ShellAbout(hMainWnd, (LPTSTR)&infotitle, (LPTSTR)&infotext, paintIcon);
367 DeleteObject(paintIcon);
368 }
369 break;
370 case IDM_HELPHELPTOPICS:
371 //HtmlHelp(hMainWnd, "help\\Paint.chm", 0, 0);
372 break;
373 case IDM_FILEEXIT:
374 SendMessage(hwnd, WM_CLOSE, wParam, lParam);
375 break;
376 case IDM_FILENEW:
377 Rectangle(hDrawingDC, 0-1, 0-1, imgXRes+1, imgYRes+1);
378 SendMessage(hImageArea, WM_PAINT, 0, 0);
379 break;
380 case IDM_FILEOPEN:
381 if (GetOpenFileName(&ofn)!=0)
382 {
383 HBITMAP bmNew = (HBITMAP)LoadDIBFromFile(ofn.lpstrFile);
384 if (bmNew!=NULL)
385 {
386 insertReversible(bmNew);
387 updateCanvasAndScrollbars();
388 char tempstr[1000];
389 char resstr[100];
390 CopyMemory(&filename, ofn.lpstrFileTitle, 256);
391 CopyMemory(&filepathname, ofn.lpstrFileTitle, 1000);
392 LoadString(hProgInstance, IDS_WINDOWTITLE, (LPTSTR)&resstr, 100);
393 sprintf(tempstr, resstr, &filename);
394 SetWindowText(hMainWnd, tempstr);
395 clearHistory();
396 isAFile = TRUE;
397 }
398 }
399 break;
400 case IDM_FILESAVE:
401 if (isAFile)
402 SaveDIBToFile(hBms[currInd], &filepathname, hDrawingDC);
403 else
404 SendMessage(hwnd, WM_COMMAND, IDM_FILESAVEAS, 0);
405 break;
406 case IDM_FILESAVEAS:
407 if (GetSaveFileName(&sfn)!=0)
408 {
409 SaveDIBToFile(hBms[currInd], sfn.lpstrFile, hDrawingDC);
410 char tempstr[1000];
411 char resstr[100];
412 CopyMemory(&filename, sfn.lpstrFileTitle, 256);
413 CopyMemory(&filepathname, sfn.lpstrFileTitle, 1000);
414 LoadString(hProgInstance, IDS_WINDOWTITLE, (LPTSTR)&resstr, 100);
415 sprintf(tempstr, resstr, &filename);
416 SetWindowText(hMainWnd, tempstr);
417 isAFile = TRUE;
418 }
419 break;
420 case IDM_EDITUNDO:
421 undo();
422 SendMessage(hImageArea, WM_PAINT, 0, 0);
423 break;
424 case IDM_EDITREDO:
425 redo();
426 SendMessage(hImageArea, WM_PAINT, 0, 0);
427 break;
428 case IDM_EDITCOPY:
429 OpenClipboard(hMainWnd);
430 EmptyClipboard();
431 SetClipboardData(CF_BITMAP, CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
432 CloseClipboard();
433 break;
434 case IDM_EDITPASTE:
435 OpenClipboard(hMainWnd);
436 if (GetClipboardData(CF_BITMAP)!=NULL)
437 {
438 DeleteObject(SelectObject(hSelDC, hSelBm = CopyImage(GetClipboardData(CF_BITMAP), IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)));
439 newReversible();
440 rectSel_src[0] = rectSel_src[1] = rectSel_src[2] = rectSel_src[3] = 0;
441 rectSel_dest[0] = rectSel_dest[1] = 0;
442 rectSel_dest[2] = GetDIBWidth(hSelBm);
443 rectSel_dest[3] = GetDIBHeight(hSelBm);
444 BitBlt(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], hSelDC, 0, 0, SRCCOPY);
445 placeSelWin();
446 ShowWindow(hSelection, SW_SHOW);
447 }
448 CloseClipboard();
449 break;
450 case IDM_EDITDELETESELECTION:
451 ShowWindow(hSelection, SW_HIDE);
452 break;
453 case IDM_EDITSELECTALL:
454 if (activeTool==2)
455 {
456 startPainting(hDrawingDC, 0, 0, fgColor, bgColor);
457 whilePainting(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
458 endPainting(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
459 }
460 break;
461 case IDM_EDITCOPYTO:
462 if (GetSaveFileName(&ofn)!=0) SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC);
463 break;
464 case IDM_COLORSEDITPALETTE:
465 if (ChooseColor(&choosecolor))
466 {
467 fgColor = choosecolor.rgbResult;
468 SendMessage(hPalWin, WM_PAINT, 0, 0);
469 }
470 break;
471 case IDM_IMAGEINVERTCOLORS:
472 {
473 newReversible();
474 int tempRect[4] = {0, 0, imgXRes, imgYRes};
475 InvertRect(hDrawingDC, (LPRECT)tempRect);
476 SendMessage(hImageArea, WM_PAINT, 0, 0);
477 }
478 break;
479 case IDM_IMAGEDELETEIMAGE:
480 newReversible();
481 Rect(hDrawingDC, 0, 0, imgXRes, imgYRes, bgColor, bgColor, 0, TRUE);
482 SendMessage(hImageArea, WM_PAINT, 0, 0);
483 break;
484 case IDM_IMAGEROTATEMIRROR:
485 switch (mirrorRotateDlg())
486 {
487 case 1:
488 newReversible();
489 StretchBlt(hDrawingDC, imgXRes-1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY);
490 SendMessage(hImageArea, WM_PAINT, 0, 0);
491 break;
492 case 2:
493 newReversible();
494 StretchBlt(hDrawingDC, 0, imgYRes-1, imgXRes, -imgYRes, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY);
495 SendMessage(hImageArea, WM_PAINT, 0, 0);
496 break;
497 case 4:
498 newReversible();
499 StretchBlt(hDrawingDC, imgXRes-1, imgYRes-1, -imgXRes, -imgYRes, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY);
500 SendMessage(hImageArea, WM_PAINT, 0, 0);
501 break;
502 }
503 break;
504 case IDM_IMAGEATTRIBUTES:
505 {
506 int attrdata[8] = {0, 0, 0, 0, 0, 0, 0, 0};
507 attributesDlg();
508 //cropReversible(640, 200);
509 //ZoomTo(zoom);
510 }
511 break;
512 case IDM_IMAGECHANGESIZE:
513 {
514 int retVal = changeSizeDlg();
515 if ((LOWORD(retVal)!=0)&&(HIWORD(retVal)!=0))
516 {
517 insertReversible(CopyImage(hBms[currInd], IMAGE_BITMAP, imgXRes*LOWORD(retVal)/100, imgYRes*HIWORD(retVal)/100, 0));
518 updateCanvasAndScrollbars();
519 }
520 }
521 break;
522 case IDM_IMAGEDRAWOPAQUE:
523 transpBg = 1-transpBg;
524 SendMessage(hToolSettings, WM_PAINT, 0, 0);
525 break;
526 case IDM_IMAGECROP:
527 insertReversible(CopyImage(hSelBm, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG));
528 updateCanvasAndScrollbars();
529 break;
530
531 case IDM_VIEWZOOM125:
532 ZoomTo(125);
533 break;
534 case IDM_VIEWZOOM25:
535 ZoomTo(250);
536 break;
537 case IDM_VIEWZOOM50:
538 ZoomTo(500);
539 break;
540 case IDM_VIEWZOOM100:
541 ZoomTo(1000);
542 break;
543 case IDM_VIEWZOOM200:
544 ZoomTo(2000);
545 break;
546 case IDM_VIEWZOOM400:
547 ZoomTo(4000);
548 break;
549 case IDM_VIEWZOOM800:
550 ZoomTo(8000);
551 break;
552 case ID_FREESEL:
553 selectTool(1);
554 break;
555 case ID_RECTSEL:
556 selectTool(2);
557 break;
558 case ID_RUBBER:
559 selectTool(3);
560 break;
561 case ID_FILL:
562 selectTool(4);
563 break;
564 case ID_COLOR:
565 selectTool(5);
566 break;
567 case ID_ZOOM:
568 selectTool(6);
569 break;
570 case ID_PEN:
571 selectTool(7);
572 break;
573 case ID_BRUSH:
574 selectTool(8);
575 break;
576 case ID_AIRBRUSH:
577 selectTool(9);
578 break;
579 case ID_TEXT:
580 selectTool(10);
581 break;
582 case ID_LINE:
583 selectTool(11);
584 break;
585 case ID_BEZIER:
586 selectTool(12);
587 break;
588 case ID_RECT:
589 selectTool(13);
590 break;
591 case ID_SHAPE:
592 selectTool(14);
593 break;
594 case ID_ELLIPSE:
595 selectTool(15);
596 break;
597 case ID_RRECT:
598 selectTool(16);
599 break;
600 }
601 break;
602 default:
603 return DefWindowProc (hwnd, message, wParam, lParam);
604 }
605
606 return 0;
607 }
608