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
12 static const TCHAR szPreviewWndClass
[] = TEXT("PreviewWndClass");
14 typedef struct _PREVIEW_DATA
18 DWORD clrSysColor
[COLOR_MENUBAR
];
36 RECT rcInactiveCaption
;
37 RECT rcInactiveCaptionButtons
;
41 RECT rcActiveCaptionButtons
;
43 RECT rcSelectedMenuItem
;
49 RECT rcDialogCaptionButtons
;
61 LOGFONT lfCaptionFont
;
63 LOGFONT lfMessageFont
;
71 } PREVIEW_DATA
, *PPREVIEW_DATA
;
76 DrawCaptionButtons(HDC hdc
, LPRECT lpRect
, BOOL bMinMax
, int x
)
82 rc3
.left
= lpRect
->right
- 2 - x
;
83 rc3
.top
= lpRect
->top
+ 2;
84 rc3
.right
= lpRect
->right
- 2;
85 rc3
.bottom
= lpRect
->bottom
- 2;
87 DrawFrameControl(hdc
, &rc3
, DFC_CAPTION
, DFCS_CAPTIONCLOSE
);
91 rc4
.left
= rc3
.left
- x
- 2;
93 rc4
.right
= rc3
.right
- x
- 2;
94 rc4
.bottom
= rc3
.bottom
;
96 DrawFrameControl(hdc
, &rc4
, DFC_CAPTION
, DFCS_CAPTIONMAX
);
98 rc5
.left
= rc4
.left
- x
;
100 rc5
.right
= rc4
.right
- x
;
101 rc5
.bottom
= rc4
.bottom
;
103 DrawFrameControl(hdc
, &rc5
, DFC_CAPTION
, DFCS_CAPTIONMIN
);
109 DrawScrollbar(HDC hdc
, LPRECT rc
, HBRUSH hbrScrollbar
)
116 width
= rc
->right
- rc
->left
;
118 rcTop
.left
= rc
->left
;
119 rcTop
.right
= rc
->right
;
121 rcTop
.bottom
= rc
->top
+ width
;
123 rcMiddle
.left
= rc
->left
;
124 rcMiddle
.right
= rc
->right
;
125 rcMiddle
.top
= rc
->top
+ width
;
126 rcMiddle
.bottom
= rc
->bottom
- width
;
128 rcBottom
.left
= rc
->left
;
129 rcBottom
.right
= rc
->right
;
130 rcBottom
.top
= rc
->bottom
- width
;
131 rcBottom
.bottom
= rc
->bottom
;
133 DrawFrameControl(hdc
, &rcTop
, DFC_SCROLL
, DFCS_SCROLLUP
);
134 DrawFrameControl(hdc
, &rcBottom
, DFC_SCROLL
, DFCS_SCROLLDOWN
);
136 FillRect(hdc
, &rcMiddle
, hbrScrollbar
);
141 OnCreate(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
143 NONCLIENTMETRICS NonClientMetrics
;
146 for (i
= 0; i
< COLOR_MENUBAR
+ 1; i
++)
148 pPreviewData
->clrSysColor
[i
] = GetSysColor(i
);
151 pPreviewData
->hbrScrollbar
= CreateSolidBrush(pPreviewData
->clrSysColor
[COLOR_SCROLLBAR
]);
152 pPreviewData
->hbrDesktop
= CreateSolidBrush(pPreviewData
->clrSysColor
[COLOR_DESKTOP
]);
153 pPreviewData
->hbrWindow
= CreateSolidBrush(pPreviewData
->clrSysColor
[COLOR_WINDOW
]);
155 pPreviewData
->cxEdge
= GetSystemMetrics(SM_CXEDGE
) - 2;
156 pPreviewData
->cyEdge
= GetSystemMetrics(SM_CXEDGE
) - 2;
158 pPreviewData
->cySizeFrame
= GetSystemMetrics(SM_CYSIZEFRAME
) - 1;
160 pPreviewData
->cyCaption
= GetSystemMetrics(SM_CYCAPTION
);
161 pPreviewData
->cyMenu
= GetSystemMetrics(SM_CYMENU
);
162 pPreviewData
->cxScrollbar
= GetSystemMetrics(SM_CXVSCROLL
);
163 pPreviewData
->cyBorder
= GetSystemMetrics(SM_CYBORDER
);
166 NonClientMetrics
.cbSize
= sizeof(NONCLIENTMETRICS
);
167 SystemParametersInfo(SPI_GETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICS
), &NonClientMetrics
, 0);
169 pPreviewData
->lfCaptionFont
= NonClientMetrics
.lfCaptionFont
;
170 pPreviewData
->hCaptionFont
= CreateFontIndirect(&pPreviewData
->lfCaptionFont
);
172 pPreviewData
->lfMenuFont
= NonClientMetrics
.lfMenuFont
;
173 pPreviewData
->hMenuFont
= CreateFontIndirect(&pPreviewData
->lfMenuFont
);
175 pPreviewData
->lfMessageFont
= NonClientMetrics
.lfMessageFont
;
176 pPreviewData
->hMessageFont
= CreateFontIndirect(&pPreviewData
->lfMessageFont
);
178 /* Load and modify the menu */
179 pPreviewData
->hMenu
= LoadMenu(hApplet
, MAKEINTRESOURCE(IDR_PREVIEW_MENU
));
180 EnableMenuItem(pPreviewData
->hMenu
,
181 1, MF_BYPOSITION
| MF_GRAYED
);
182 HiliteMenuItem(hwnd
, pPreviewData
->hMenu
,
183 2, MF_BYPOSITION
| MF_HILITE
);
185 // GetMenuItemRect(hwnd, pPreviewData->hMenu,
186 // 2, &pPreviewData->rcSelectedMenuItem);
188 AllocAndLoadString(&pPreviewData
->lpInAct
, hApplet
, IDS_INACTWIN
);
189 AllocAndLoadString(&pPreviewData
->lpAct
, hApplet
, IDS_ACTWIN
);
190 AllocAndLoadString(&pPreviewData
->lpWinTxt
, hApplet
, IDS_WINTEXT
);
191 AllocAndLoadString(&pPreviewData
->lpMessBox
, hApplet
, IDS_MESSBOX
);
192 AllocAndLoadString(&pPreviewData
->lpMessText
, hApplet
, IDS_MESSTEXT
);
193 AllocAndLoadString(&pPreviewData
->lpButText
, hApplet
, IDS_BUTTEXT
);
198 CalculateItemSize(PPREVIEW_DATA pPreviewData
)
202 /* Calculate the inactive window rectangle */
203 pPreviewData
->rcInactiveFrame
.left
= pPreviewData
->rcDesktop
.left
+ 8;
204 pPreviewData
->rcInactiveFrame
.top
= pPreviewData
->rcDesktop
.top
+ 8;
205 pPreviewData
->rcInactiveFrame
.right
= pPreviewData
->rcDesktop
.right
- 25;
206 pPreviewData
->rcInactiveFrame
.bottom
= pPreviewData
->rcDesktop
.bottom
- 30;
208 /* Calculate the inactive caption rectangle */
209 pPreviewData
->rcInactiveCaption
.left
= pPreviewData
->rcInactiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
210 pPreviewData
->rcInactiveCaption
.top
= pPreviewData
->rcInactiveFrame
.top
+ pPreviewData
->cyEdge
+ pPreviewData
->cySizeFrame
+ 1;
211 pPreviewData
->rcInactiveCaption
.right
= pPreviewData
->rcInactiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
212 pPreviewData
->rcInactiveCaption
.bottom
= pPreviewData
->rcInactiveCaption
.top
+ pPreviewData
->cyCaption
- pPreviewData
->cyBorder
;
214 /* Calculate the inactive caption buttons rectangle */
215 pPreviewData
->rcInactiveCaptionButtons
.left
= pPreviewData
->rcInactiveCaption
.right
- 2 - 2 - 3 * 16;
216 pPreviewData
->rcInactiveCaptionButtons
.top
= pPreviewData
->rcInactiveCaption
.top
+ 2;
217 pPreviewData
->rcInactiveCaptionButtons
.right
= pPreviewData
->rcInactiveCaption
.right
- 2;
218 pPreviewData
->rcInactiveCaptionButtons
.bottom
= pPreviewData
->rcInactiveCaption
.bottom
- 2;
220 /* Calculate the active window rectangle */
221 pPreviewData
->rcActiveFrame
.left
= pPreviewData
->rcInactiveFrame
.left
+ 3 + pPreviewData
->cySizeFrame
;
222 pPreviewData
->rcActiveFrame
.top
= pPreviewData
->rcInactiveCaption
.bottom
+ 1;
223 pPreviewData
->rcActiveFrame
.right
= pPreviewData
->rcDesktop
.right
- 10;
224 pPreviewData
->rcActiveFrame
.bottom
= pPreviewData
->rcDesktop
.bottom
- 25;
226 /* Calculate the active caption rectangle */
227 pPreviewData
->rcActiveCaption
.left
= pPreviewData
->rcActiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
228 pPreviewData
->rcActiveCaption
.top
= pPreviewData
->rcActiveFrame
.top
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
229 pPreviewData
->rcActiveCaption
.right
= pPreviewData
->rcActiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
230 pPreviewData
->rcActiveCaption
.bottom
= pPreviewData
->rcActiveCaption
.top
+ pPreviewData
->cyCaption
- pPreviewData
->cyBorder
;
232 /* Calculate the active caption buttons rectangle */
233 pPreviewData
->rcActiveCaptionButtons
.left
= pPreviewData
->rcActiveCaption
.right
- 2 - 2 - 3 * 16;
234 pPreviewData
->rcActiveCaptionButtons
.top
= pPreviewData
->rcActiveCaption
.top
+ 2;
235 pPreviewData
->rcActiveCaptionButtons
.right
= pPreviewData
->rcActiveCaption
.right
- 2;
236 pPreviewData
->rcActiveCaptionButtons
.bottom
= pPreviewData
->rcActiveCaption
.bottom
- 2;
238 /* Calculate the active menu bar rectangle */
239 pPreviewData
->rcActiveMenuBar
.left
= pPreviewData
->rcActiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
240 pPreviewData
->rcActiveMenuBar
.top
= pPreviewData
->rcActiveCaption
.bottom
+ 1;
241 pPreviewData
->rcActiveMenuBar
.right
= pPreviewData
->rcActiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
242 pPreviewData
->rcActiveMenuBar
.bottom
= pPreviewData
->rcActiveMenuBar
.top
+ pPreviewData
->cyMenu
+ 1;
244 /* Calculate the active client rectangle */
245 pPreviewData
->rcActiveClient
.left
= pPreviewData
->rcActiveFrame
.left
+ pPreviewData
->cxEdge
+ pPreviewData
->cySizeFrame
+ 1;
246 pPreviewData
->rcActiveClient
.top
= pPreviewData
->rcActiveMenuBar
.bottom
;
247 pPreviewData
->rcActiveClient
.right
= pPreviewData
->rcActiveFrame
.right
- pPreviewData
->cxEdge
- pPreviewData
->cySizeFrame
- 1;
248 pPreviewData
->rcActiveClient
.bottom
= pPreviewData
->rcActiveFrame
.bottom
- pPreviewData
->cyEdge
- pPreviewData
->cySizeFrame
- 1;
250 /* Calculate the active scroll rectangle */
251 pPreviewData
->rcActiveScroll
.left
= pPreviewData
->rcActiveClient
.right
- 2 - pPreviewData
->cxScrollbar
;
252 pPreviewData
->rcActiveScroll
.top
= pPreviewData
->rcActiveClient
.top
+ 2;
253 pPreviewData
->rcActiveScroll
.right
= pPreviewData
->rcActiveClient
.right
- 2;
254 pPreviewData
->rcActiveScroll
.bottom
= pPreviewData
->rcActiveClient
.bottom
- 2;
258 pPreviewData
->rcDialogFrame
.left
= pPreviewData
->rcActiveClient
.left
+ 4;
259 pPreviewData
->rcDialogFrame
.top
= (pPreviewData
->rcDesktop
.bottom
* 60) / 100;
260 pPreviewData
->rcDialogFrame
.right
= (pPreviewData
->rcDesktop
.right
* 65) / 100;
261 pPreviewData
->rcDialogFrame
.bottom
= pPreviewData
->rcDesktop
.bottom
- 5;
263 /* Calculate the dialog caption rectangle */
264 pPreviewData
->rcDialogCaption
.left
= pPreviewData
->rcDialogFrame
.left
+ 3;
265 pPreviewData
->rcDialogCaption
.top
= pPreviewData
->rcDialogFrame
.top
+ 3;
266 pPreviewData
->rcDialogCaption
.right
= pPreviewData
->rcDialogFrame
.right
- 3;
267 pPreviewData
->rcDialogCaption
.bottom
= pPreviewData
->rcDialogFrame
.top
+ pPreviewData
->cyCaption
+ 1 + 1;
269 /* Calculate the inactive caption buttons rectangle */
270 pPreviewData
->rcDialogCaptionButtons
.left
= pPreviewData
->rcDialogCaption
.right
- 2 - 16;
271 pPreviewData
->rcDialogCaptionButtons
.top
= pPreviewData
->rcDialogCaption
.top
+ 2;
272 pPreviewData
->rcDialogCaptionButtons
.right
= pPreviewData
->rcDialogCaption
.right
- 2;
273 pPreviewData
->rcDialogCaptionButtons
.bottom
= pPreviewData
->rcDialogCaption
.bottom
- 2;
275 /* Calculate the dialog client rectangle */
276 pPreviewData
->rcDialogClient
.left
= pPreviewData
->rcDialogFrame
.left
+ 3;
277 pPreviewData
->rcDialogClient
.top
= pPreviewData
->rcDialogCaption
.bottom
+ 1;
278 pPreviewData
->rcDialogClient
.right
= pPreviewData
->rcDialogFrame
.right
- 3;
279 pPreviewData
->rcDialogClient
.bottom
= pPreviewData
->rcDialogFrame
.bottom
- 3;
281 /* Calculate the dialog button rectangle */
285 pPreviewData
->rcDialogButton
.left
=
286 (pPreviewData
->rcDialogClient
.right
+ pPreviewData
->rcDialogClient
.left
- width
) / 2;
287 pPreviewData
->rcDialogButton
.right
= pPreviewData
->rcDialogButton
.left
+ width
;
288 pPreviewData
->rcDialogButton
.bottom
= pPreviewData
->rcDialogClient
.bottom
- 2;
289 pPreviewData
->rcDialogButton
.top
= pPreviewData
->rcDialogButton
.bottom
- height
;
294 OnSize(INT cx
, INT cy
, PPREVIEW_DATA pPreviewData
)
296 /* Get Desktop rectangle */
297 pPreviewData
->rcDesktop
.left
= 0;
298 pPreviewData
->rcDesktop
.top
= 0;
299 pPreviewData
->rcDesktop
.right
= cx
;
300 pPreviewData
->rcDesktop
.bottom
= cy
;
302 CalculateItemSize(pPreviewData
);
308 typedef BOOL (WINAPI
* DCT_PROC
)(HWND hwnd
, HDC hdc
, const RECT
*rect
, HFONT hFont
, HICON hIcon
, LPCWSTR str
, UINT uFlags
);
311 typedef BOOL (WINAPI
* DCT_PROC
)(HWND hwnd
, HDC hdc
, const RECT
*rect
, HFONT hFont
, HICON hIcon
, LPCSTR str
, UINT uFlags
);
315 typedef DWORD (WINAPI
* DMBT_PROC
)(HWND hwnd
, HDC hDC
, LPRECT lprect
, HMENU hMenu
, HFONT hFont
);
321 OnPaint(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
329 DCT_PROC DrawCaptionTemp
;
330 DMBT_PROC DrawMenuBarTemp
;
333 hUser32
= LoadLibrary(_T("user32.dll"));
337 DrawCaptionTemp
= (DCT_PROC
)GetProcAddress(hUser32
, (LPCSTR
)DCT_ORD
);
338 DrawMenuBarTemp
= (DMBT_PROC
)GetProcAddress(hUser32
, (LPCSTR
)DMBT_ORD
);
341 hdc
= BeginPaint(hwnd
, &ps
);
344 FillRect(hdc
, &pPreviewData
->rcDesktop
, pPreviewData
->hbrDesktop
);
346 /* Inactive Window */
347 DrawEdge(hdc
, &pPreviewData
->rcInactiveFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
);
348 SetTextColor(hdc
, pPreviewData
->clrSysColor
[COLOR_INACTIVECAPTIONTEXT
]);
349 DrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcInactiveCaption
, pPreviewData
->hCaptionFont
,
350 NULL
, pPreviewData
->lpInAct
, DC_GRADIENT
| DC_ICON
| DC_TEXT
);
351 DrawCaptionButtons(hdc
, &pPreviewData
->rcInactiveCaption
, TRUE
, pPreviewData
->cyCaption
- 2);
354 DrawEdge(hdc
, &pPreviewData
->rcActiveFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
);
355 SetTextColor(hdc
, pPreviewData
->clrSysColor
[COLOR_CAPTIONTEXT
]);
356 DrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcActiveCaption
, pPreviewData
->hCaptionFont
,
357 NULL
, pPreviewData
->lpAct
, DC_ACTIVE
| DC_GRADIENT
| DC_ICON
| DC_TEXT
);
358 DrawCaptionButtons(hdc
, &pPreviewData
->rcActiveCaption
, TRUE
, pPreviewData
->cyCaption
- 2);
360 /* Draw the menu bar */
361 DrawMenuBarTemp(hwnd
, hdc
, &pPreviewData
->rcActiveMenuBar
,
363 pPreviewData
->hMenuFont
);
365 /* Draw the client area */
366 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
367 DrawEdge(hdc
, &rc
, EDGE_SUNKEN
, BF_RECT
| BF_ADJUST
);
368 FillRect(hdc
, &rc
, pPreviewData
->hbrWindow
);
370 /* Draw the client text */
371 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
374 SetTextColor(hdc
, pPreviewData
->clrSysColor
[COLOR_WINDOWTEXT
]);
375 hOldFont
= SelectObject(hdc
, pPreviewData
->hCaptionFont
);
376 DrawText(hdc
, pPreviewData
->lpWinTxt
, lstrlen(pPreviewData
->lpWinTxt
), &rc
, DT_LEFT
);
377 SelectObject(hdc
, hOldFont
);
379 /* Draw the scroll bar */
380 DrawScrollbar(hdc
, &pPreviewData
->rcActiveScroll
, pPreviewData
->hbrScrollbar
);
383 DrawEdge(hdc
, &pPreviewData
->rcDialogFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
);
384 SetTextColor(hdc
, pPreviewData
->clrSysColor
[COLOR_WINDOW
]);
385 DrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcDialogCaption
, pPreviewData
->hCaptionFont
,
386 NULL
, pPreviewData
->lpMessBox
, DC_ACTIVE
| DC_GRADIENT
| DC_ICON
| DC_TEXT
);
387 DrawCaptionButtons(hdc
, &pPreviewData
->rcDialogCaption
, FALSE
, pPreviewData
->cyCaption
- 2);
389 /* Draw the dialog text */
390 CopyRect(&rc
, &pPreviewData
->rcDialogClient
);
393 SetTextColor(hdc
, RGB(0,0,0));
394 hOldFont
= SelectObject(hdc
, pPreviewData
->hMessageFont
);
395 DrawText(hdc
, pPreviewData
->lpMessText
, lstrlen(pPreviewData
->lpMessText
), &rc
, DT_LEFT
);
396 SelectObject(hdc
, hOldFont
);
399 DrawFrameControl(hdc
, &pPreviewData
->rcDialogButton
, DFC_BUTTON
, DFCS_BUTTONPUSH
);
400 CopyRect(&rc
, &pPreviewData
->rcDialogButton
);
401 SetTextColor(hdc
, pPreviewData
->clrSysColor
[COLOR_BTNTEXT
]);
402 hOldFont
= SelectObject(hdc
, pPreviewData
->hMessageFont
);
403 DrawText(hdc
, pPreviewData
->lpButText
, lstrlen(pPreviewData
->lpButText
), &rc
, DT_VCENTER
| DT_CENTER
| DT_SINGLELINE
);
404 SelectObject(hdc
, hOldFont
);
411 OnLButtonDown(HWND hwnd
, int xPos
, int yPos
, PPREVIEW_DATA pPreviewData
)
413 UINT type
= IDX_DESKTOP
;
419 if (PtInRect(&pPreviewData
->rcInactiveFrame
, pt
))
420 type
= IDX_INACTIVE_BORDER
;
422 if (PtInRect(&pPreviewData
->rcInactiveCaption
, pt
))
423 type
= IDX_INACTIVE_CAPTION
;
425 if (PtInRect(&pPreviewData
->rcInactiveCaptionButtons
, pt
))
426 type
= IDX_CAPTION_BUTTON
;
428 if (PtInRect(&pPreviewData
->rcActiveFrame
, pt
))
429 type
= IDX_ACTIVE_BORDER
;
431 if (PtInRect(&pPreviewData
->rcActiveCaption
, pt
))
432 type
= IDX_ACTIVE_CAPTION
;
434 if (PtInRect(&pPreviewData
->rcActiveCaptionButtons
, pt
))
435 type
= IDX_CAPTION_BUTTON
;
437 // if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
438 // type = IDX_SELECTION;
440 if (PtInRect(&pPreviewData
->rcActiveMenuBar
, pt
))
443 if (PtInRect(&pPreviewData
->rcActiveClient
, pt
))
446 if (PtInRect(&pPreviewData
->rcActiveScroll
, pt
))
447 type
= IDX_SCROLLBAR
;
449 if (PtInRect(&pPreviewData
->rcDialogFrame
, pt
))
452 if (PtInRect(&pPreviewData
->rcDialogCaption
, pt
))
453 type
= IDX_ACTIVE_CAPTION
;
455 if (PtInRect(&pPreviewData
->rcDialogCaptionButtons
, pt
))
456 type
= IDX_CAPTION_BUTTON
;
458 if (PtInRect(&pPreviewData
->rcDialogButton
, pt
))
459 type
= IDX_3D_OBJECTS
;
461 SendMessage(GetParent(hwnd
),
463 MAKEWPARAM(GetWindowLongPtrW(hwnd
, GWLP_ID
), 0),
469 OnDestroy(PPREVIEW_DATA pPreviewData
)
471 DeleteObject(pPreviewData
->hbrScrollbar
);
472 DeleteObject(pPreviewData
->hbrDesktop
);
473 DeleteObject(pPreviewData
->hbrWindow
);
475 DeleteObject(pPreviewData
->hCaptionFont
);
476 DeleteObject(pPreviewData
->hMenuFont
);
477 DeleteObject(pPreviewData
->hMessageFont
);
479 DestroyMenu(pPreviewData
->hMenu
);
481 LocalFree((HLOCAL
)pPreviewData
->lpInAct
);
482 LocalFree((HLOCAL
)pPreviewData
->lpAct
);
483 LocalFree((HLOCAL
)pPreviewData
->lpWinTxt
);
484 LocalFree((HLOCAL
)pPreviewData
->lpMessBox
);
485 LocalFree((HLOCAL
)pPreviewData
->lpMessText
);
486 LocalFree((HLOCAL
)pPreviewData
->lpButText
);
490 static LRESULT CALLBACK
491 PreviewWndProc(HWND hwnd
,
496 PPREVIEW_DATA pPreviewData
;
498 pPreviewData
= (PPREVIEW_DATA
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
503 pPreviewData
= (PPREVIEW_DATA
)HeapAlloc(GetProcessHeap(),
505 sizeof(PREVIEW_DATA
));
509 SetWindowLongPtr(hwnd
, GWLP_USERDATA
, (LONG_PTR
)pPreviewData
);
510 OnCreate(hwnd
, pPreviewData
);
514 OnSize(LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
518 OnPaint(hwnd
, pPreviewData
);
522 OnLButtonDown(hwnd
, LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
526 OnDestroy(pPreviewData
);
527 HeapFree(GetProcessHeap(), 0, pPreviewData
);
530 case PVM_GETCYCAPTION
:
531 return pPreviewData
->cyCaption
;
533 case PVM_SETCYCAPTION
:
536 pPreviewData
->cyCaption
= (INT
)lParam
;
537 CalculateItemSize(pPreviewData
);
538 InvalidateRect(hwnd
, NULL
, FALSE
);
543 return pPreviewData
->cyMenu
;
548 pPreviewData
->cyMenu
= (INT
)lParam
;
549 CalculateItemSize(pPreviewData
);
550 InvalidateRect(hwnd
, NULL
, FALSE
);
554 case PVM_GETCXSCROLLBAR
:
555 return pPreviewData
->cxScrollbar
;
557 case PVM_SETCXSCROLLBAR
:
560 pPreviewData
->cxScrollbar
= (INT
)lParam
;
561 CalculateItemSize(pPreviewData
);
562 InvalidateRect(hwnd
, NULL
, FALSE
);
566 case PVM_GETCYSIZEFRAME
:
567 return pPreviewData
->cySizeFrame
;
569 case PVM_SETCYSIZEFRAME
:
572 pPreviewData
->cySizeFrame
= (INT
)lParam
;
573 CalculateItemSize(pPreviewData
);
574 InvalidateRect(hwnd
, NULL
, FALSE
);
578 case PVM_SETCAPTIONFONT
:
579 CopyMemory(&pPreviewData
->lfCaptionFont
, (LOGFONT
*)lParam
, sizeof(LOGFONT
));
580 DeleteObject(pPreviewData
->hCaptionFont
);
581 pPreviewData
->hCaptionFont
= CreateFontIndirect(&pPreviewData
->lfCaptionFont
);
582 CalculateItemSize(pPreviewData
);
583 InvalidateRect(hwnd
, NULL
, FALSE
);
586 case PVM_SETMENUFONT
:
587 CopyMemory(&pPreviewData
->lfMenuFont
, (LOGFONT
*)lParam
, sizeof(LOGFONT
));
588 DeleteObject(pPreviewData
->hMenuFont
);
589 pPreviewData
->hMenuFont
= CreateFontIndirect(&pPreviewData
->lfMenuFont
);
590 CalculateItemSize(pPreviewData
);
591 InvalidateRect(hwnd
, NULL
, FALSE
);
594 case PVM_SETDIALOGFONT
:
595 CopyMemory(&pPreviewData
->lfMessageFont
, (LOGFONT
*)lParam
, sizeof(LOGFONT
));
596 DeleteObject(pPreviewData
->hMessageFont
);
597 pPreviewData
->hMessageFont
= CreateFontIndirect(&pPreviewData
->lfMessageFont
);
598 CalculateItemSize(pPreviewData
);
599 InvalidateRect(hwnd
, NULL
, FALSE
);
603 pPreviewData
->clrSysColor
[(INT
)wParam
] = (DWORD
)lParam
;
606 case COLOR_SCROLLBAR
:
607 DeleteObject(pPreviewData
->hbrScrollbar
);
608 pPreviewData
->hbrScrollbar
= CreateSolidBrush(pPreviewData
->clrSysColor
[COLOR_SCROLLBAR
]);
612 DeleteObject(pPreviewData
->hbrDesktop
);
613 pPreviewData
->hbrDesktop
= CreateSolidBrush(pPreviewData
->clrSysColor
[COLOR_DESKTOP
]);
617 DeleteObject(pPreviewData
->hbrWindow
);
618 pPreviewData
->hbrWindow
= CreateSolidBrush(pPreviewData
->clrSysColor
[COLOR_WINDOW
]);
621 InvalidateRect(hwnd
, NULL
, FALSE
);
636 RegisterPreviewControl(IN HINSTANCE hInstance
)
640 wc
.cbSize
= sizeof(WNDCLASSEX
);
641 wc
.lpfnWndProc
= PreviewWndProc
;
642 wc
.hInstance
= hInstance
;
643 wc
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
644 wc
.hbrBackground
= (HBRUSH
)NULL
;
645 wc
.lpszClassName
= szPreviewWndClass
;
647 return RegisterClassEx(&wc
) != (ATOM
)0;
652 UnregisterPreviewControl(IN HINSTANCE hInstance
)
654 UnregisterClass(szPreviewWndClass
,