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