2 * PROJECT: ReactOS Desktop Control Panel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/desk/preview.c
5 * PURPOSE: Draws the preview control
6 * COPYRIGHT: Copyright 2006, 2007 Eric Kohl
11 static const TCHAR szPreviewWndClass
[] = TEXT("PreviewWndClass");
13 typedef struct _PREVIEW_DATA
37 RECT rcInactiveCaption
;
38 RECT rcInactiveCaptionButtons
;
42 RECT rcActiveCaptionButtons
;
44 RECT rcSelectedMenuItem
;
50 RECT rcDialogCaptionButtons
;
69 } PREVIEW_DATA
, *PPREVIEW_DATA
;
72 static VOID
UpdatePreviewTheme(HWND hwnd
, PPREVIEW_DATA pPreviewData
, COLOR_SCHEME
*scheme
)
74 if (pPreviewData
->hbrScrollbar
!= NULL
)
75 DeleteObject(pPreviewData
->hbrScrollbar
);
76 pPreviewData
->hbrScrollbar
= CreateSolidBrush(scheme
->crColor
[COLOR_SCROLLBAR
]);
77 if (pPreviewData
->hbrDesktop
!= NULL
)
78 DeleteObject(pPreviewData
->hbrDesktop
);
80 pPreviewData
->hbrDesktop
= CreateSolidBrush(scheme
->crColor
[COLOR_DESKTOP
]);
81 if (pPreviewData
->hbrWindow
!= NULL
)
82 DeleteObject(pPreviewData
->hbrWindow
);
83 pPreviewData
->hbrWindow
= CreateSolidBrush(scheme
->crColor
[COLOR_WINDOW
]);
85 pPreviewData
->cxEdge
= 2; /* SM_CXEDGE */
86 pPreviewData
->cyEdge
= 2; /* SM_CYEDGE */
88 pPreviewData
->cySizeFrame
= scheme
->ncMetrics
.iBorderWidth
; /* SM_CYSIZEFRAME */
90 pPreviewData
->cyCaption
= scheme
->ncMetrics
.iCaptionHeight
+1; /* SM_CYCAPTION */
91 pPreviewData
->cyMenu
= scheme
->ncMetrics
.iMenuHeight
-1; /* SM_CYMENU */
92 pPreviewData
->cxScrollbar
= scheme
->ncMetrics
.iScrollWidth
; /* SM_CXVSCROLL */
93 pPreviewData
->cyBorder
= scheme
->ncMetrics
.iBorderWidth
; /* SM_CYBORDER */
95 if (pPreviewData
->hCaptionFont
!= NULL
)
96 DeleteObject(pPreviewData
->hCaptionFont
);
97 pPreviewData
->hCaptionFont
= CreateFontIndirect(&scheme
->ncMetrics
.lfCaptionFont
);
99 if (pPreviewData
->hMenuFont
!= NULL
)
100 DeleteObject(pPreviewData
->hMenuFont
);
101 pPreviewData
->hMenuFont
= CreateFontIndirect(&scheme
->ncMetrics
.lfMenuFont
);
103 if (pPreviewData
->hMessageFont
!= NULL
)
104 DeleteObject(pPreviewData
->hMessageFont
);
105 pPreviewData
->hMessageFont
= CreateFontIndirect(&scheme
->ncMetrics
.lfMessageFont
);
107 pPreviewData
->Scheme
= *scheme
;
108 InvalidateRect(hwnd
, NULL
, FALSE
);
112 OnCreate(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
114 COLOR_SCHEME
*scheme
;
116 pPreviewData
->hClientFont
= (HFONT
)GetStockObject(DEFAULT_GUI_FONT
);
118 /* Load and modify the menu */
119 pPreviewData
->hMenu
= LoadMenu(hApplet
, MAKEINTRESOURCE(IDR_PREVIEW_MENU
));
120 EnableMenuItem(pPreviewData
->hMenu
,
121 1, MF_BYPOSITION
| MF_GRAYED
);
122 HiliteMenuItem(hwnd
, pPreviewData
->hMenu
,
123 2, MF_BYPOSITION
| MF_HILITE
);
125 // GetMenuItemRect(hwnd, pPreviewData->hMenu,
126 // 2, &pPreviewData->rcSelectedMenuItem);
128 AllocAndLoadString(&pPreviewData
->lpInAct
, hApplet
, IDS_INACTWIN
);
129 AllocAndLoadString(&pPreviewData
->lpAct
, hApplet
, IDS_ACTWIN
);
130 AllocAndLoadString(&pPreviewData
->lpWinTxt
, hApplet
, IDS_WINTEXT
);
131 AllocAndLoadString(&pPreviewData
->lpMessBox
, hApplet
, IDS_MESSBOX
);
132 AllocAndLoadString(&pPreviewData
->lpMessText
, hApplet
, IDS_MESSTEXT
);
133 AllocAndLoadString(&pPreviewData
->lpButText
, hApplet
, IDS_BUTTEXT
);
135 scheme
= &pPreviewData
->Scheme
;
136 LoadCurrentScheme(scheme
);
138 UpdatePreviewTheme(hwnd
, pPreviewData
, scheme
);
143 CalculateItemSize(PPREVIEW_DATA pPreviewData
)
147 /* Calculate the inactive window rectangle */
148 pPreviewData
->rcInactiveFrame
.left
= pPreviewData
->rcDesktop
.left
+ 8;
149 pPreviewData
->rcInactiveFrame
.top
= pPreviewData
->rcDesktop
.top
+ 8;
150 pPreviewData
->rcInactiveFrame
.right
= pPreviewData
->rcDesktop
.right
- 25;
151 pPreviewData
->rcInactiveFrame
.bottom
= pPreviewData
->rcDesktop
.bottom
- 30;
153 /* Calculate the inactive caption rectangle */
154 pPreviewData
->rcInactiveCaption
.left
= pPreviewData
->rcInactiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
155 pPreviewData
->rcInactiveCaption
.top
= pPreviewData
->rcInactiveFrame
.top
+ pPreviewData
->cyEdge
+ pPreviewData
->cySizeFrame
+ 1;
156 pPreviewData
->rcInactiveCaption
.right
= pPreviewData
->rcInactiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
157 pPreviewData
->rcInactiveCaption
.bottom
= pPreviewData
->rcInactiveCaption
.top
+ pPreviewData
->cyCaption
- pPreviewData
->cyBorder
;
159 /* Calculate the inactive caption buttons rectangle */
160 pPreviewData
->rcInactiveCaptionButtons
.left
= pPreviewData
->rcInactiveCaption
.right
- 2 - 2 - 3 * 16;
161 pPreviewData
->rcInactiveCaptionButtons
.top
= pPreviewData
->rcInactiveCaption
.top
+ 2;
162 pPreviewData
->rcInactiveCaptionButtons
.right
= pPreviewData
->rcInactiveCaption
.right
- 2;
163 pPreviewData
->rcInactiveCaptionButtons
.bottom
= pPreviewData
->rcInactiveCaption
.bottom
- 2;
165 /* Calculate the active window rectangle */
166 pPreviewData
->rcActiveFrame
.left
= pPreviewData
->rcInactiveFrame
.left
+ 3 + pPreviewData
->cySizeFrame
;
167 pPreviewData
->rcActiveFrame
.top
= pPreviewData
->rcInactiveCaption
.bottom
+ 1;
168 pPreviewData
->rcActiveFrame
.right
= pPreviewData
->rcDesktop
.right
- 10;
169 pPreviewData
->rcActiveFrame
.bottom
= pPreviewData
->rcDesktop
.bottom
- 25;
171 /* Calculate the active caption rectangle */
172 pPreviewData
->rcActiveCaption
.left
= pPreviewData
->rcActiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
173 pPreviewData
->rcActiveCaption
.top
= pPreviewData
->rcActiveFrame
.top
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
174 pPreviewData
->rcActiveCaption
.right
= pPreviewData
->rcActiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
175 pPreviewData
->rcActiveCaption
.bottom
= pPreviewData
->rcActiveCaption
.top
+ pPreviewData
->cyCaption
- pPreviewData
->cyBorder
;
177 /* Calculate the active caption buttons rectangle */
178 pPreviewData
->rcActiveCaptionButtons
.left
= pPreviewData
->rcActiveCaption
.right
- 2 - 2 - 3 * 16;
179 pPreviewData
->rcActiveCaptionButtons
.top
= pPreviewData
->rcActiveCaption
.top
+ 2;
180 pPreviewData
->rcActiveCaptionButtons
.right
= pPreviewData
->rcActiveCaption
.right
- 2;
181 pPreviewData
->rcActiveCaptionButtons
.bottom
= pPreviewData
->rcActiveCaption
.bottom
- 2;
183 /* Calculate the active menu bar rectangle */
184 pPreviewData
->rcActiveMenuBar
.left
= pPreviewData
->rcActiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
185 pPreviewData
->rcActiveMenuBar
.top
= pPreviewData
->rcActiveCaption
.bottom
+ 1;
186 pPreviewData
->rcActiveMenuBar
.right
= pPreviewData
->rcActiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
187 pPreviewData
->rcActiveMenuBar
.bottom
= pPreviewData
->rcActiveMenuBar
.top
+ pPreviewData
->cyMenu
+ 1;
189 /* Calculate the active client rectangle */
190 pPreviewData
->rcActiveClient
.left
= pPreviewData
->rcActiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
191 pPreviewData
->rcActiveClient
.top
= pPreviewData
->rcActiveMenuBar
.bottom
;
192 pPreviewData
->rcActiveClient
.right
= pPreviewData
->rcActiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
193 pPreviewData
->rcActiveClient
.bottom
= pPreviewData
->rcActiveFrame
.bottom
- pPreviewData
->cyEdge
- pPreviewData
->cySizeFrame
- 1;
195 /* Calculate the active scroll rectangle */
196 pPreviewData
->rcActiveScroll
.left
= pPreviewData
->rcActiveClient
.right
- 2 - pPreviewData
->cxScrollbar
;
197 pPreviewData
->rcActiveScroll
.top
= pPreviewData
->rcActiveClient
.top
+ 2;
198 pPreviewData
->rcActiveScroll
.right
= pPreviewData
->rcActiveClient
.right
- 2;
199 pPreviewData
->rcActiveScroll
.bottom
= pPreviewData
->rcActiveClient
.bottom
- 2;
203 pPreviewData
->rcDialogFrame
.left
= pPreviewData
->rcActiveClient
.left
+ 4;
204 pPreviewData
->rcDialogFrame
.top
= (pPreviewData
->rcDesktop
.bottom
* 60) / 100;
205 pPreviewData
->rcDialogFrame
.right
= (pPreviewData
->rcDesktop
.right
* 65) / 100;
206 pPreviewData
->rcDialogFrame
.bottom
= pPreviewData
->rcDesktop
.bottom
- 5;
208 /* Calculate the dialog caption rectangle */
209 pPreviewData
->rcDialogCaption
.left
= pPreviewData
->rcDialogFrame
.left
+ 3;
210 pPreviewData
->rcDialogCaption
.top
= pPreviewData
->rcDialogFrame
.top
+ 3;
211 pPreviewData
->rcDialogCaption
.right
= pPreviewData
->rcDialogFrame
.right
- 3;
212 pPreviewData
->rcDialogCaption
.bottom
= pPreviewData
->rcDialogFrame
.top
+ pPreviewData
->cyCaption
+ 1 + 1;
214 /* Calculate the inactive caption buttons rectangle */
215 pPreviewData
->rcDialogCaptionButtons
.left
= pPreviewData
->rcDialogCaption
.right
- 2 - 16;
216 pPreviewData
->rcDialogCaptionButtons
.top
= pPreviewData
->rcDialogCaption
.top
+ 2;
217 pPreviewData
->rcDialogCaptionButtons
.right
= pPreviewData
->rcDialogCaption
.right
- 2;
218 pPreviewData
->rcDialogCaptionButtons
.bottom
= pPreviewData
->rcDialogCaption
.bottom
- 2;
220 /* Calculate the dialog client rectangle */
221 pPreviewData
->rcDialogClient
.left
= pPreviewData
->rcDialogFrame
.left
+ 3;
222 pPreviewData
->rcDialogClient
.top
= pPreviewData
->rcDialogCaption
.bottom
+ 1;
223 pPreviewData
->rcDialogClient
.right
= pPreviewData
->rcDialogFrame
.right
- 3;
224 pPreviewData
->rcDialogClient
.bottom
= pPreviewData
->rcDialogFrame
.bottom
- 3;
226 /* Calculate the dialog button rectangle */
230 pPreviewData
->rcDialogButton
.left
=
231 (pPreviewData
->rcDialogClient
.right
+ pPreviewData
->rcDialogClient
.left
- width
) / 2;
232 pPreviewData
->rcDialogButton
.right
= pPreviewData
->rcDialogButton
.left
+ width
;
233 pPreviewData
->rcDialogButton
.bottom
= pPreviewData
->rcDialogClient
.bottom
- 2;
234 pPreviewData
->rcDialogButton
.top
= pPreviewData
->rcDialogButton
.bottom
- height
;
239 OnSize(INT cx
, INT cy
, PPREVIEW_DATA pPreviewData
)
241 /* Get Desktop rectangle */
242 pPreviewData
->rcDesktop
.left
= 0;
243 pPreviewData
->rcDesktop
.top
= 0;
244 pPreviewData
->rcDesktop
.right
= cx
;
245 pPreviewData
->rcDesktop
.bottom
= cy
;
247 CalculateItemSize(pPreviewData
);
251 OnPaint(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
257 COLOR_SCHEME
*scheme
;
259 scheme
= &pPreviewData
->Scheme
;
261 hdc
= BeginPaint(hwnd
, &ps
);
263 if(pPreviewData
->hdcPreview
)
265 BitBlt(hdc
,0,0, pPreviewData
->rcDesktop
.right
, pPreviewData
->rcDesktop
.bottom
, pPreviewData
->hdcPreview
, 0,0, SRCCOPY
);
271 FillRect(hdc
, &pPreviewData
->rcDesktop
, pPreviewData
->hbrDesktop
);
273 /* Inactive Window */
274 MyDrawEdge(hdc
, &pPreviewData
->rcInactiveFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
| MY_BF_INACTIVEBORDER
, scheme
);
275 SetTextColor(hdc
, scheme
->crColor
[COLOR_INACTIVECAPTIONTEXT
]);
276 MyDrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcInactiveCaption
, pPreviewData
->hCaptionFont
,
277 NULL
, pPreviewData
->lpInAct
, DC_GRADIENT
| DC_ICON
| DC_TEXT
, scheme
);
278 MyDrawCaptionButtons(hdc
, &pPreviewData
->rcInactiveCaption
, TRUE
, pPreviewData
->cyCaption
- 2, scheme
);
281 MyDrawEdge(hdc
, &pPreviewData
->rcActiveFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
| MY_BF_ACTIVEBORDER
, scheme
);
282 SetTextColor(hdc
, scheme
->crColor
[COLOR_CAPTIONTEXT
]);
283 MyDrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcActiveCaption
, pPreviewData
->hCaptionFont
,
284 NULL
, pPreviewData
->lpAct
, DC_ACTIVE
| DC_GRADIENT
| DC_ICON
| DC_TEXT
, scheme
);
285 MyDrawCaptionButtons(hdc
, &pPreviewData
->rcActiveCaption
, TRUE
, pPreviewData
->cyCaption
- 2, scheme
);
287 /* Draw the menu bar */
288 MyDrawMenuBarTemp(hwnd
, hdc
, &pPreviewData
->rcActiveMenuBar
,
290 pPreviewData
->hMenuFont
, scheme
);
292 /* Draw the client area */
293 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
294 MyDrawEdge(hdc
, &rc
, EDGE_SUNKEN
, BF_RECT
| BF_ADJUST
, scheme
);
295 FillRect(hdc
, &rc
, pPreviewData
->hbrWindow
);
297 /* Draw the client text */
298 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
301 SetTextColor(hdc
, scheme
->crColor
[COLOR_WINDOWTEXT
]);
302 hOldFont
= SelectObject(hdc
, pPreviewData
->hClientFont
);
303 DrawText(hdc
, pPreviewData
->lpWinTxt
, -1, &rc
, DT_LEFT
);
304 SelectObject(hdc
, hOldFont
);
306 /* Draw the scroll bar */
307 MyDrawScrollbar(hdc
, &pPreviewData
->rcActiveScroll
, pPreviewData
->hbrScrollbar
, scheme
);
310 MyDrawEdge(hdc
, &pPreviewData
->rcDialogFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
, scheme
);
311 SetTextColor(hdc
, scheme
->crColor
[COLOR_WINDOW
]);
312 MyDrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcDialogCaption
, pPreviewData
->hCaptionFont
,
313 NULL
, pPreviewData
->lpMessBox
, DC_ACTIVE
| DC_GRADIENT
| DC_ICON
| DC_TEXT
, scheme
);
314 MyDrawCaptionButtons(hdc
, &pPreviewData
->rcDialogCaption
, FALSE
, pPreviewData
->cyCaption
- 2, scheme
);
316 /* Draw the dialog text */
317 CopyRect(&rc
, &pPreviewData
->rcDialogClient
);
320 SetTextColor(hdc
, scheme
->crColor
[COLOR_WINDOWTEXT
]);
321 hOldFont
= SelectObject(hdc
, pPreviewData
->hMessageFont
);
322 DrawText(hdc
, pPreviewData
->lpMessText
, -1, &rc
, DT_LEFT
);
323 SelectObject(hdc
, hOldFont
);
326 MyDrawFrameControl(hdc
, &pPreviewData
->rcDialogButton
, DFC_BUTTON
, DFCS_BUTTONPUSH
, scheme
);
327 CopyRect(&rc
, &pPreviewData
->rcDialogButton
);
328 SetTextColor(hdc
, scheme
->crColor
[COLOR_BTNTEXT
]);
329 hOldFont
= SelectObject(hdc
, pPreviewData
->hMessageFont
);
330 DrawText(hdc
, pPreviewData
->lpButText
, -1, &rc
, DT_VCENTER
| DT_CENTER
| DT_SINGLELINE
);
331 SelectObject(hdc
, hOldFont
);
338 OnLButtonDown(HWND hwnd
, int xPos
, int yPos
, PPREVIEW_DATA pPreviewData
)
340 UINT type
= IDX_DESKTOP
;
346 if (PtInRect(&pPreviewData
->rcInactiveFrame
, pt
))
347 type
= IDX_INACTIVE_BORDER
;
349 if (PtInRect(&pPreviewData
->rcInactiveCaption
, pt
))
350 type
= IDX_INACTIVE_CAPTION
;
352 if (PtInRect(&pPreviewData
->rcInactiveCaptionButtons
, pt
))
353 type
= IDX_CAPTION_BUTTON
;
355 if (PtInRect(&pPreviewData
->rcActiveFrame
, pt
))
356 type
= IDX_ACTIVE_BORDER
;
358 if (PtInRect(&pPreviewData
->rcActiveCaption
, pt
))
359 type
= IDX_ACTIVE_CAPTION
;
361 if (PtInRect(&pPreviewData
->rcActiveCaptionButtons
, pt
))
362 type
= IDX_CAPTION_BUTTON
;
364 // if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
365 // type = IDX_SELECTION;
367 if (PtInRect(&pPreviewData
->rcActiveMenuBar
, pt
))
370 if (PtInRect(&pPreviewData
->rcActiveClient
, pt
))
373 if (PtInRect(&pPreviewData
->rcActiveScroll
, pt
))
374 type
= IDX_SCROLLBAR
;
376 if (PtInRect(&pPreviewData
->rcDialogFrame
, pt
))
379 if (PtInRect(&pPreviewData
->rcDialogCaption
, pt
))
380 type
= IDX_ACTIVE_CAPTION
;
382 if (PtInRect(&pPreviewData
->rcDialogCaptionButtons
, pt
))
383 type
= IDX_CAPTION_BUTTON
;
385 if (PtInRect(&pPreviewData
->rcDialogButton
, pt
))
386 type
= IDX_3D_OBJECTS
;
388 SendMessage(GetParent(hwnd
),
390 MAKEWPARAM(GetWindowLongPtrW(hwnd
, GWLP_ID
), 0),
396 OnDestroy(PPREVIEW_DATA pPreviewData
)
398 DeleteObject(pPreviewData
->hbrScrollbar
);
399 DeleteObject(pPreviewData
->hbrDesktop
);
400 DeleteObject(pPreviewData
->hbrWindow
);
402 DeleteObject(pPreviewData
->hCaptionFont
);
403 DeleteObject(pPreviewData
->hMenuFont
);
404 DeleteObject(pPreviewData
->hMessageFont
);
406 DestroyMenu(pPreviewData
->hMenu
);
408 LocalFree((HLOCAL
)pPreviewData
->lpInAct
);
409 LocalFree((HLOCAL
)pPreviewData
->lpAct
);
410 LocalFree((HLOCAL
)pPreviewData
->lpWinTxt
);
411 LocalFree((HLOCAL
)pPreviewData
->lpMessBox
);
412 LocalFree((HLOCAL
)pPreviewData
->lpMessText
);
413 LocalFree((HLOCAL
)pPreviewData
->lpButText
);
417 static LRESULT CALLBACK
418 PreviewWndProc(HWND hwnd
,
423 PPREVIEW_DATA pPreviewData
;
425 pPreviewData
= (PPREVIEW_DATA
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
430 pPreviewData
= (PPREVIEW_DATA
)HeapAlloc(GetProcessHeap(),
432 sizeof(PREVIEW_DATA
));
436 SetWindowLongPtr(hwnd
, GWLP_USERDATA
, (LONG_PTR
)pPreviewData
);
437 OnCreate(hwnd
, pPreviewData
);
441 OnSize(LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
445 OnPaint(hwnd
, pPreviewData
);
449 OnLButtonDown(hwnd
, LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
453 OnDestroy(pPreviewData
);
454 HeapFree(GetProcessHeap(), 0, pPreviewData
);
457 case PVM_UPDATETHEME
:
458 UpdatePreviewTheme(hwnd
, pPreviewData
, (COLOR_SCHEME
*)lParam
);
459 CalculateItemSize(pPreviewData
);
460 InvalidateRect(hwnd
, NULL
, FALSE
);
464 SchemeSetMetric(&pPreviewData
->Scheme
, wParam
, lParam
);
465 pPreviewData
->cySizeFrame
= pPreviewData
->Scheme
.ncMetrics
.iBorderWidth
; /* SM_CYSIZEFRAME */
466 pPreviewData
->cyCaption
= pPreviewData
->Scheme
.ncMetrics
.iCaptionHeight
+1; /* SM_CYCAPTION */
467 pPreviewData
->cyMenu
= pPreviewData
->Scheme
.ncMetrics
.iMenuHeight
-1; /* SM_CYMENU */
468 pPreviewData
->cxScrollbar
= pPreviewData
->Scheme
.ncMetrics
.iScrollWidth
; /* SM_CXVSCROLL */
469 pPreviewData
->cyBorder
= pPreviewData
->Scheme
.ncMetrics
.iBorderWidth
; /* SM_CYBORDER */
470 CalculateItemSize(pPreviewData
);
471 InvalidateRect(hwnd
, NULL
, FALSE
);
481 case FONT_CAPTION
: phFont
= &pPreviewData
->hCaptionFont
; break;
482 case FONT_MENU
: phFont
= &pPreviewData
->hMenuFont
; break;
483 case FONT_MESSAGE
: phFont
= &pPreviewData
->hMessageFont
; break;
484 default: return TRUE
;
487 plfFont
= SchemeGetFont(&pPreviewData
->Scheme
, wParam
);
488 memcpy(plfFont
, (PVOID
)lParam
, sizeof(LOGFONTW
));
490 DeleteObject(*phFont
);
491 *phFont
= CreateFontIndirect(plfFont
);
493 InvalidateRect(hwnd
, NULL
, FALSE
);
498 pPreviewData
->Scheme
.crColor
[wParam
] = lParam
;
501 case COLOR_SCROLLBAR
:
502 DeleteObject(pPreviewData
->hbrScrollbar
);
503 pPreviewData
->hbrScrollbar
= CreateSolidBrush(pPreviewData
->Scheme
.crColor
[wParam
]);
506 DeleteObject(pPreviewData
->hbrDesktop
);
507 pPreviewData
->hbrDesktop
= CreateSolidBrush(pPreviewData
->Scheme
.crColor
[wParam
]);
510 DeleteObject(pPreviewData
->hbrWindow
);
511 pPreviewData
->hbrWindow
= CreateSolidBrush(pPreviewData
->Scheme
.crColor
[wParam
]);
515 CalculateItemSize(pPreviewData
);
516 InvalidateRect(hwnd
, NULL
, FALSE
);
520 return SchemeGetMetric(&pPreviewData
->Scheme
, wParam
);
522 return (LRESULT
)SchemeGetFont(&pPreviewData
->Scheme
, wParam
);
524 return pPreviewData
->Scheme
.crColor
[wParam
];
526 case PVM_SET_HDC_PREVIEW
:
527 pPreviewData
->hdcPreview
= (HDC
)lParam
;
528 InvalidateRect(hwnd
, NULL
, FALSE
);
532 return DefWindowProc(hwnd
, uMsg
, wParam
, lParam
);
539 RegisterPreviewControl(IN HINSTANCE hInstance
)
543 wc
.cbSize
= sizeof(WNDCLASSEX
);
544 wc
.lpfnWndProc
= PreviewWndProc
;
545 wc
.hInstance
= hInstance
;
546 wc
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
547 wc
.hbrBackground
= (HBRUSH
)NULL
;
548 wc
.lpszClassName
= szPreviewWndClass
;
550 return RegisterClassEx(&wc
) != (ATOM
)0;
555 UnregisterPreviewControl(IN HINSTANCE hInstance
)
557 UnregisterClass(szPreviewWndClass
, hInstance
);