Add hit-testing for caption buttons.
[reactos.git] / reactos / dll / cpl / desk / preview.c
1 /*
2 * PROJECT: ReactOS Timedate Control Panel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/cpl/desk/preview.c
5 * PURPOSE: Draws the preview control
6 * COPYRIGHT: Copyright 2006, 2007 Eric Kohl
7 */
8
9 #include "desk.h"
10 #include "preview.h"
11
12 static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
13
14 typedef struct _PREVIEW_DATA
15 {
16 HWND hwndParent;
17
18 DWORD clrDesktop;
19 HBRUSH hbrDesktop;
20
21 DWORD clrWindow;
22 HBRUSH hbrWindow;
23
24 DWORD clrScrollbar;
25 HBRUSH hbrScrollbar;
26
27 DWORD clrActiveCaptionText;
28 DWORD clrInactiveCaptionText;
29 DWORD clrWindowText;
30 DWORD clrButtonText;
31
32 INT cxEdge;
33 INT cyEdge;
34
35 INT cyCaption;
36
37 RECT rcDesktop;
38 RECT rcInactiveFrame;
39 RECT rcInactiveCaption;
40 RECT rcInactiveCaptionButtons;
41
42 RECT rcActiveFrame;
43 RECT rcActiveCaption;
44 RECT rcActiveCaptionButtons;
45 RECT rcActiveMenuBar;
46 RECT rcSelectedMenuItem;
47 RECT rcActiveClient;
48 RECT rcActiveScroll;
49
50 RECT rcDialogFrame;
51 RECT rcDialogCaption;
52 RECT rcDialogCaptionButtons;
53 RECT rcDialogClient;
54
55 RECT rcDialogButton;
56
57 LPTSTR lpInAct;
58 LPTSTR lpAct;
59 LPTSTR lpWinTxt;
60 LPTSTR lpMessBox;
61 LPTSTR lpMessText;
62 LPTSTR lpButText;
63
64 LOGFONT lfCaptionFont;
65 LOGFONT lfMenuFont;
66 LOGFONT lfMessageFont;
67
68 HFONT hCaptionFont;
69 HFONT hMenuFont;
70 HFONT hMessageFont;
71
72 HMENU hMenu;
73
74 } PREVIEW_DATA, *PPREVIEW_DATA;
75
76
77
78 static VOID
79 DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax)
80 {
81 RECT rc3;
82 RECT rc4;
83 RECT rc5;
84
85 rc3.left = lpRect->right - 2 - 16;
86 rc3.top = lpRect->top + 2;
87 rc3.right = lpRect->right - 2;
88 rc3.bottom = lpRect->bottom - 2;
89
90 DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);
91
92 if (bMinMax)
93 {
94 rc4.left = rc3.left - 16 - 2;
95 rc4.top = rc3.top;
96 rc4.right = rc3.right - 16 - 2;
97 rc4.bottom = rc3.bottom;
98
99 DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);
100
101 rc5.left = rc4.left - 16;
102 rc5.top = rc4.top;
103 rc5.right = rc4.right - 16;
104 rc5.bottom = rc4.bottom;
105
106 DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);
107 }
108 }
109
110 static VOID
111 DrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar)
112 {
113 RECT rcTop;
114 RECT rcBottom;
115 RECT rcMiddle;
116 int width;
117
118 width = rc->right - rc->left;
119
120 rcTop.left = rc->left;
121 rcTop.right = rc->right;
122 rcTop.top = rc->top;
123 rcTop.bottom = rc->top + width;
124
125 rcMiddle.left = rc->left;
126 rcMiddle.right = rc->right;
127 rcMiddle.top = rc->top + width;
128 rcMiddle.bottom = rc->bottom - width;
129
130 rcBottom.left = rc->left;
131 rcBottom.right = rc->right;
132 rcBottom.top = rc->bottom - width;
133 rcBottom.bottom = rc->bottom;
134
135 DrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP);
136 DrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN);
137
138 FillRect(hdc, &rcMiddle, hbrScrollbar);
139 }
140
141
142 static VOID
143 OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
144 {
145 NONCLIENTMETRICS NonClientMetrics;
146
147 pPreviewData->clrScrollbar = GetSysColor(COLOR_SCROLLBAR);
148 pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrScrollbar);
149
150 pPreviewData->clrDesktop = GetSysColor(COLOR_DESKTOP);
151 pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrDesktop);
152 pPreviewData->clrWindow = GetSysColor(COLOR_WINDOW);
153 pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrWindow);
154
155 pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);
156 pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
157 pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);
158 pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);
159
160 pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE);
161 pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE);
162
163 pPreviewData->cyCaption = 20; //GetSystemMetrics(SM_CYCAPTION);
164
165 /* load font info */
166 NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
167 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
168
169 pPreviewData->lfCaptionFont = NonClientMetrics.lfCaptionFont;
170 pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
171
172 pPreviewData->lfMenuFont = NonClientMetrics.lfMenuFont;
173 pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
174
175 pPreviewData->lfMessageFont = NonClientMetrics.lfMessageFont;
176 pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
177
178 /* Load and modify the menu */
179 pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
180 EnableMenuItem(pPreviewData->hMenu, ID_MENU_DISABLED,
181 MF_BYCOMMAND | MF_DISABLED);
182 HiliteMenuItem(hwnd, pPreviewData->hMenu,
183 ID_MENU_SELECTED, MF_BYCOMMAND | MF_HILITE);
184
185 // GetMenuItemRect(hwnd, pPreviewData->hMenu,
186 // ID_MENU_SELECTED, &pPreviewData->rcSelectedMenuItem);
187
188
189 AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);
190 AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);
191 AllocAndLoadString(&pPreviewData->lpWinTxt, hApplet, IDS_WINTEXT);
192 AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);
193 AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);
194 AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);
195 }
196
197
198 static VOID
199 OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)
200 {
201 int width, height;
202
203 /* Get Desktop rectangle */
204 pPreviewData->rcDesktop.left = 0;
205 pPreviewData->rcDesktop.top = 0;
206 pPreviewData->rcDesktop.right = cx;
207 pPreviewData->rcDesktop.bottom = cy;
208
209 /* Calculate the inactive window rectangle */
210 pPreviewData->rcInactiveFrame.left = pPreviewData->rcDesktop.left + 8;
211 pPreviewData->rcInactiveFrame.top = pPreviewData->rcDesktop.top + 8;
212 pPreviewData->rcInactiveFrame.right = pPreviewData->rcDesktop.right - 25;
213 pPreviewData->rcInactiveFrame.bottom = pPreviewData->rcDesktop.bottom - 30;
214
215 /* Calculate the inactive caption rectangle */
216 pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + 1/*3*/ + 1;
217 pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + 1/*3*/ + 1;
218 pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - 1/*3*/ - 1;
219 pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveFrame.top + pPreviewData->cyCaption /*20*/ + 2;
220
221 /* Calculate the inactive caption buttons rectangle */
222 pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;
223 pPreviewData->rcInactiveCaptionButtons.top = pPreviewData->rcInactiveCaption.top + 2;
224 pPreviewData->rcInactiveCaptionButtons.right = pPreviewData->rcInactiveCaption.right - 2;
225 pPreviewData->rcInactiveCaptionButtons.bottom = pPreviewData->rcInactiveCaption.bottom - 2;
226
227 /* Calculate the active window rectangle */
228 pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + 1;
229 pPreviewData->rcActiveFrame.top = pPreviewData->rcInactiveCaption.bottom + 1;
230 pPreviewData->rcActiveFrame.right = pPreviewData->rcDesktop.right - 10;
231 pPreviewData->rcActiveFrame.bottom = pPreviewData->rcDesktop.bottom - 25;
232
233 /* Calculate the active caption rectangle */
234 pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + 3 + 1;
235 pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + 3 + 1;
236 pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - 3 - 1;
237 pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveFrame.top + pPreviewData->cyCaption/*20*/ + 2;
238
239 /* Calculate the active caption buttons rectangle */
240 pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;
241 pPreviewData->rcActiveCaptionButtons.top = pPreviewData->rcActiveCaption.top + 2;
242 pPreviewData->rcActiveCaptionButtons.right = pPreviewData->rcActiveCaption.right - 2;
243 pPreviewData->rcActiveCaptionButtons.bottom = pPreviewData->rcActiveCaption.bottom - 2;
244
245 /* Calculate the active menu bar rectangle */
246 pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + 3 + 1;
247 pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 1;
248 pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - 3 - 1;
249 pPreviewData->rcActiveMenuBar.bottom = pPreviewData->rcActiveMenuBar.top + 20;
250
251 /* Calculate the active client rectangle */
252 pPreviewData->rcActiveClient.left = pPreviewData->rcActiveFrame.left + 3 + 1;
253 pPreviewData->rcActiveClient.top = pPreviewData->rcActiveMenuBar.bottom; // + 1;
254 pPreviewData->rcActiveClient.right = pPreviewData->rcActiveFrame.right - 3 - 1;
255 pPreviewData->rcActiveClient.bottom = pPreviewData->rcActiveFrame.bottom - 3 - 1;
256
257 /* Calculate the active scroll rectangle */
258 pPreviewData->rcActiveScroll.left = pPreviewData->rcActiveClient.right - 2 - 16;
259 pPreviewData->rcActiveScroll.top = pPreviewData->rcActiveClient.top + 2;
260 pPreviewData->rcActiveScroll.right = pPreviewData->rcActiveClient.right - 2;
261 pPreviewData->rcActiveScroll.bottom = pPreviewData->rcActiveClient.bottom - 2;
262
263
264 /* Dialog window */
265 pPreviewData->rcDialogFrame.left = pPreviewData->rcActiveClient.left + 4;
266 pPreviewData->rcDialogFrame.top = (pPreviewData->rcDesktop.bottom * 60) / 100;
267 pPreviewData->rcDialogFrame.right = (pPreviewData->rcDesktop.right * 65) / 100;
268 pPreviewData->rcDialogFrame.bottom = pPreviewData->rcDesktop.bottom - 5;
269
270 /* Calculate the dialog caption rectangle */
271 pPreviewData->rcDialogCaption.left = pPreviewData->rcDialogFrame.left + 3;
272 pPreviewData->rcDialogCaption.top = pPreviewData->rcDialogFrame.top + 3;
273 pPreviewData->rcDialogCaption.right = pPreviewData->rcDialogFrame.right - 3;
274 pPreviewData->rcDialogCaption.bottom = pPreviewData->rcDialogFrame.top + 20 + 1;
275
276 /* Calculate the inactive caption buttons rectangle */
277 pPreviewData->rcDialogCaptionButtons.left = pPreviewData->rcDialogCaption.right - 2 - 16;
278 pPreviewData->rcDialogCaptionButtons.top = pPreviewData->rcDialogCaption.top + 2;
279 pPreviewData->rcDialogCaptionButtons.right = pPreviewData->rcDialogCaption.right - 2;
280 pPreviewData->rcDialogCaptionButtons.bottom = pPreviewData->rcDialogCaption.bottom - 2;
281
282 /* Calculate the dialog client rectangle */
283 pPreviewData->rcDialogClient.left = pPreviewData->rcDialogFrame.left + 3;
284 pPreviewData->rcDialogClient.top = pPreviewData->rcDialogCaption.bottom + 1;
285 pPreviewData->rcDialogClient.right = pPreviewData->rcDialogFrame.right - 3;
286 pPreviewData->rcDialogClient.bottom = pPreviewData->rcDialogFrame.bottom - 3;
287
288 /* Calculate the dialog button rectangle */
289 width = 80;
290 height = 28;
291
292 pPreviewData->rcDialogButton.left =
293 (pPreviewData->rcDialogClient.right + pPreviewData->rcDialogClient.left - width) / 2;
294 pPreviewData->rcDialogButton.right = pPreviewData->rcDialogButton.left + width;
295 pPreviewData->rcDialogButton.bottom = pPreviewData->rcDialogClient.bottom - 2;
296 pPreviewData->rcDialogButton.top = pPreviewData->rcDialogButton.bottom - height;
297 }
298
299
300 static VOID
301 OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
302 {
303 PAINTSTRUCT ps;
304 HFONT hOldFont;
305 HDC hdc;
306 RECT rc;
307
308 hdc = BeginPaint(hwnd, &ps);
309
310 /* Desktop */
311 FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
312
313 /* Inactive Window */
314 DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
315 SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);
316 DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont,
317 NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
318 DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE);
319
320 /* Active Window */
321 DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
322 SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
323 DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
324 NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
325 DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE);
326
327 /* FIXME: Draw the menu bar */
328 DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
329 pPreviewData->hMenu /*HMENU hMenu*/,
330 pPreviewData->hMessageFont /*HFONT hFont*/);
331
332 /* Draw the client area */
333 CopyRect(&rc, &pPreviewData->rcActiveClient);
334 DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
335 FillRect(hdc, &rc, pPreviewData->hbrWindow);
336
337 /* Draw the client text */
338 CopyRect(&rc, &pPreviewData->rcActiveClient);
339 rc.left += 4;
340 rc.top += 2;
341 SetTextColor(hdc, pPreviewData->clrWindowText);
342 hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
343 DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
344 SelectObject(hdc, hOldFont);
345
346 /* Draw the scroll bar */
347 DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);
348
349 /* Dialog Window */
350 DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
351 SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
352 DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
353 NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
354 DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE);
355
356 /* Draw the dialog text */
357 CopyRect(&rc, &pPreviewData->rcDialogClient);
358 rc.left += 4;
359 rc.top += 2;
360 SetTextColor(hdc, RGB(0,0,0));
361 hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
362 DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT);
363 SelectObject(hdc, hOldFont);
364
365 /* Draw Button */
366 DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
367 CopyRect(&rc, &pPreviewData->rcDialogButton);
368 SetTextColor(hdc, pPreviewData->clrButtonText);
369 hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
370 DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
371 SelectObject(hdc, hOldFont);
372
373 EndPaint(hwnd, &ps);
374 }
375
376
377 static VOID
378 OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)
379 {
380 UINT type = IDX_DESKTOP;
381 POINT pt;
382
383 pt.x = xPos;
384 pt.y = yPos;
385
386 if (PtInRect(&pPreviewData->rcInactiveFrame, pt))
387 type = IDX_INACTIVE_BORDER;
388
389 if (PtInRect(&pPreviewData->rcInactiveCaption, pt))
390 type = IDX_INACTIVE_CAPTION;
391
392 if (PtInRect(&pPreviewData->rcInactiveCaptionButtons, pt))
393 type = IDX_CAPTION_BUTTON;
394
395 if (PtInRect(&pPreviewData->rcActiveFrame, pt))
396 type = IDX_ACTIVE_BORDER;
397
398 if (PtInRect(&pPreviewData->rcActiveCaption, pt))
399 type = IDX_ACTIVE_CAPTION;
400
401 if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))
402 type = IDX_CAPTION_BUTTON;
403
404 if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
405 type = IDX_MENU;
406
407 // if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
408 // type = IDX_SELECTION;
409
410 if (PtInRect(&pPreviewData->rcActiveClient, pt))
411 type = IDX_WINDOW;
412
413 if (PtInRect(&pPreviewData->rcActiveScroll, pt))
414 type = IDX_SCROLLBAR;
415
416 if (PtInRect(&pPreviewData->rcDialogFrame, pt))
417 type = IDX_DIALOG;
418
419 if (PtInRect(&pPreviewData->rcDialogCaption, pt))
420 type = IDX_ACTIVE_CAPTION;
421
422 if (PtInRect(&pPreviewData->rcDialogCaptionButtons, pt))
423 type = IDX_CAPTION_BUTTON;
424
425 if (PtInRect(&pPreviewData->rcDialogButton, pt))
426 type = IDX_3D_OBJECTS;
427
428 SendMessage(GetParent(hwnd), WM_USER, 0, type);
429 }
430
431
432 static VOID
433 OnDestroy(PPREVIEW_DATA pPreviewData)
434 {
435 DeleteObject(pPreviewData->hbrScrollbar);
436 DeleteObject(pPreviewData->hbrDesktop);
437 DeleteObject(pPreviewData->hbrWindow);
438
439 DeleteObject(pPreviewData->hCaptionFont);
440 DeleteObject(pPreviewData->hMenuFont);
441 DeleteObject(pPreviewData->hMessageFont);
442
443 DestroyMenu(pPreviewData->hMenu);
444
445 LocalFree((HLOCAL)pPreviewData->lpInAct);
446 LocalFree((HLOCAL)pPreviewData->lpAct);
447 LocalFree((HLOCAL)pPreviewData->lpWinTxt);
448 LocalFree((HLOCAL)pPreviewData->lpMessBox);
449 LocalFree((HLOCAL)pPreviewData->lpMessText);
450 LocalFree((HLOCAL)pPreviewData->lpButText);
451 }
452
453
454 static LRESULT CALLBACK
455 PreviewWndProc(HWND hwnd,
456 UINT uMsg,
457 WPARAM wParam,
458 LPARAM lParam)
459 {
460 PPREVIEW_DATA pPreviewData;
461
462 pPreviewData = (PPREVIEW_DATA)GetWindowLongPtr(hwnd, GWLP_USERDATA);
463
464 switch (uMsg)
465 {
466 case WM_CREATE:
467 pPreviewData = (PPREVIEW_DATA)HeapAlloc(GetProcessHeap(),
468 HEAP_ZERO_MEMORY,
469 sizeof(PREVIEW_DATA));
470 if (!pPreviewData)
471 return -1;
472
473 SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pPreviewData);
474 OnCreate(hwnd, pPreviewData);
475 break;
476
477 case WM_SIZE:
478 OnSize(LOWORD(lParam), HIWORD(lParam), pPreviewData);
479 break;
480
481 case WM_PAINT:
482 OnPaint(hwnd, pPreviewData);
483 break;
484
485 case WM_LBUTTONDOWN:
486 OnLButtonDown(hwnd, LOWORD(lParam), HIWORD(lParam), pPreviewData);
487 break;
488
489 case WM_DESTROY:
490 OnDestroy(pPreviewData);
491 HeapFree(GetProcessHeap(), 0, pPreviewData);
492 break;
493
494 default:
495 DefWindowProc(hwnd,
496 uMsg,
497 wParam,
498 lParam);
499 }
500
501 return TRUE;
502 }
503
504
505 BOOL
506 RegisterPreviewControl(IN HINSTANCE hInstance)
507 {
508 WNDCLASSEX wc = {0};
509
510 wc.cbSize = sizeof(WNDCLASSEX);
511 wc.lpfnWndProc = PreviewWndProc;
512 wc.hInstance = hInstance;
513 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
514 wc.hbrBackground = (HBRUSH)NULL; //(COLOR_BTNFACE + 1);
515 wc.lpszClassName = szPreviewWndClass;
516
517 return RegisterClassEx(&wc) != (ATOM)0;
518 }
519
520
521 VOID
522 UnregisterPreviewControl(IN HINSTANCE hInstance)
523 {
524 UnregisterClass(szPreviewWndClass,
525 hInstance);
526 }