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
14 static const TCHAR szPreviewWndClass
[] = TEXT("PreviewWndClass");
16 typedef struct _PREVIEW_DATA
38 RECT rcInactiveCaption
;
39 RECT rcInactiveCaptionButtons
;
43 RECT rcActiveCaptionButtons
;
45 RECT rcSelectedMenuItem
;
51 RECT rcDialogCaptionButtons
;
70 } PREVIEW_DATA
, *PPREVIEW_DATA
;
73 static VOID
UpdatePreviewTheme(HWND hwnd
, PPREVIEW_DATA pPreviewData
, THEME
*theme
)
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 pPreviewData
->hbrDesktop
= CreateSolidBrush(theme
->crColor
[COLOR_DESKTOP
]);
81 if (pPreviewData
->hbrWindow
!= NULL
)
82 DeleteObject(pPreviewData
->hbrWindow
);
83 pPreviewData
->hbrWindow
= CreateSolidBrush(theme
->crColor
[COLOR_WINDOW
]);
85 pPreviewData
->cxEdge
= theme
->Size
[SIZE_EDGE_X
] - 2; /* SM_CXEDGE */
86 pPreviewData
->cyEdge
= theme
->Size
[SIZE_EDGE_Y
] - 2; /* SM_CYEDGE */
88 pPreviewData
->cySizeFrame
= theme
->Size
[SIZE_FRAME_Y
] - 1; /* SM_CYSIZEFRAME */
90 pPreviewData
->cyCaption
= theme
->Size
[SIZE_CAPTION_Y
]; /* SM_CYCAPTION */
91 pPreviewData
->cyMenu
= theme
->Size
[SIZE_MENU_Y
]; /* SM_CYMENU */
92 pPreviewData
->cxScrollbar
= theme
->Size
[SIZE_SCROLL_X
]; /* SM_CXVSCROLL */
93 pPreviewData
->cyBorder
= theme
->Size
[SIZE_BORDER_Y
]; /* SM_CYBORDER */
95 if (pPreviewData
->hCaptionFont
!= NULL
)
96 DeleteObject(pPreviewData
->hCaptionFont
);
97 pPreviewData
->hCaptionFont
= CreateFontIndirect(&theme
->lfFont
[FONT_CAPTION
]);
99 if (pPreviewData
->hMenuFont
!= NULL
)
100 DeleteObject(pPreviewData
->hMenuFont
);
101 pPreviewData
->hMenuFont
= CreateFontIndirect(&theme
->lfFont
[FONT_MENU
]);
103 if (pPreviewData
->hMessageFont
!= NULL
)
104 DeleteObject(pPreviewData
->hMessageFont
);
105 pPreviewData
->hMessageFont
= CreateFontIndirect(&theme
->lfFont
[FONT_DIALOG
]);
107 pPreviewData
->Theme
= *theme
;
108 InvalidateRect(hwnd
, NULL
, FALSE
);
112 OnCreate(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
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 theme
= &pPreviewData
->Theme
;
136 LoadCurrentTheme(theme
);
138 UpdatePreviewTheme(hwnd
, pPreviewData
, theme
);
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
)
259 theme
= &pPreviewData
->Theme
;
261 hdc
= BeginPaint(hwnd
, &ps
);
264 FillRect(hdc
, &pPreviewData
->rcDesktop
, pPreviewData
->hbrDesktop
);
266 /* Inactive Window */
267 MyDrawEdge(hdc
, &pPreviewData
->rcInactiveFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
, theme
);
268 SetTextColor(hdc
, theme
->crColor
[COLOR_INACTIVECAPTIONTEXT
]);
269 MyDrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcInactiveCaption
, pPreviewData
->hCaptionFont
,
270 NULL
, pPreviewData
->lpInAct
, DC_GRADIENT
| DC_ICON
| DC_TEXT
, theme
);
271 MyDrawCaptionButtons(hdc
, &pPreviewData
->rcInactiveCaption
, TRUE
, pPreviewData
->cyCaption
- 2, theme
);
274 MyDrawEdge(hdc
, &pPreviewData
->rcActiveFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
, theme
);
275 SetTextColor(hdc
, theme
->crColor
[COLOR_CAPTIONTEXT
]);
276 MyDrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcActiveCaption
, pPreviewData
->hCaptionFont
,
277 NULL
, pPreviewData
->lpAct
, DC_ACTIVE
| DC_GRADIENT
| DC_ICON
| DC_TEXT
, theme
);
278 MyDrawCaptionButtons(hdc
, &pPreviewData
->rcActiveCaption
, TRUE
, pPreviewData
->cyCaption
- 2, theme
);
280 /* Draw the menu bar */
281 MyDrawMenuBarTemp(hwnd
, hdc
, &pPreviewData
->rcActiveMenuBar
,
283 pPreviewData
->hMenuFont
, theme
);
285 /* Draw the client area */
286 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
287 MyDrawEdge(hdc
, &rc
, EDGE_SUNKEN
, BF_RECT
| BF_ADJUST
, theme
);
288 FillRect(hdc
, &rc
, pPreviewData
->hbrWindow
);
290 /* Draw the client text */
291 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
294 SetTextColor(hdc
, theme
->crColor
[COLOR_WINDOWTEXT
]);
295 hOldFont
= SelectObject(hdc
, pPreviewData
->hClientFont
);
296 DrawText(hdc
, pPreviewData
->lpWinTxt
, -1, &rc
, DT_LEFT
);
297 SelectObject(hdc
, hOldFont
);
299 /* Draw the scroll bar */
300 MyDrawScrollbar(hdc
, &pPreviewData
->rcActiveScroll
, pPreviewData
->hbrScrollbar
, theme
);
303 MyDrawEdge(hdc
, &pPreviewData
->rcDialogFrame
, EDGE_RAISED
, BF_RECT
| BF_MIDDLE
, theme
);
304 SetTextColor(hdc
, theme
->crColor
[COLOR_WINDOW
]);
305 MyDrawCaptionTemp(NULL
, hdc
, &pPreviewData
->rcDialogCaption
, pPreviewData
->hCaptionFont
,
306 NULL
, pPreviewData
->lpMessBox
, DC_ACTIVE
| DC_GRADIENT
| DC_ICON
| DC_TEXT
, theme
);
307 MyDrawCaptionButtons(hdc
, &pPreviewData
->rcDialogCaption
, FALSE
, pPreviewData
->cyCaption
- 2, theme
);
309 /* Draw the dialog text */
310 CopyRect(&rc
, &pPreviewData
->rcDialogClient
);
313 SetTextColor(hdc
, theme
->crColor
[COLOR_BTNTEXT
]);
314 hOldFont
= SelectObject(hdc
, pPreviewData
->hMessageFont
);
315 DrawText(hdc
, pPreviewData
->lpMessText
, -1, &rc
, DT_LEFT
);
316 SelectObject(hdc
, hOldFont
);
319 MyDrawFrameControl(hdc
, &pPreviewData
->rcDialogButton
, DFC_BUTTON
, DFCS_BUTTONPUSH
, theme
);
320 CopyRect(&rc
, &pPreviewData
->rcDialogButton
);
321 SetTextColor(hdc
, theme
->crColor
[COLOR_BTNTEXT
]);
322 hOldFont
= SelectObject(hdc
, pPreviewData
->hMessageFont
);
323 DrawText(hdc
, pPreviewData
->lpButText
, -1, &rc
, DT_VCENTER
| DT_CENTER
| DT_SINGLELINE
);
324 SelectObject(hdc
, hOldFont
);
331 OnLButtonDown(HWND hwnd
, int xPos
, int yPos
, PPREVIEW_DATA pPreviewData
)
333 UINT type
= IDX_DESKTOP
;
339 if (PtInRect(&pPreviewData
->rcInactiveFrame
, pt
))
340 type
= IDX_INACTIVE_BORDER
;
342 if (PtInRect(&pPreviewData
->rcInactiveCaption
, pt
))
343 type
= IDX_INACTIVE_CAPTION
;
345 if (PtInRect(&pPreviewData
->rcInactiveCaptionButtons
, pt
))
346 type
= IDX_CAPTION_BUTTON
;
348 if (PtInRect(&pPreviewData
->rcActiveFrame
, pt
))
349 type
= IDX_ACTIVE_BORDER
;
351 if (PtInRect(&pPreviewData
->rcActiveCaption
, pt
))
352 type
= IDX_ACTIVE_CAPTION
;
354 if (PtInRect(&pPreviewData
->rcActiveCaptionButtons
, pt
))
355 type
= IDX_CAPTION_BUTTON
;
357 // if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
358 // type = IDX_SELECTION;
360 if (PtInRect(&pPreviewData
->rcActiveMenuBar
, pt
))
363 if (PtInRect(&pPreviewData
->rcActiveClient
, pt
))
366 if (PtInRect(&pPreviewData
->rcActiveScroll
, pt
))
367 type
= IDX_SCROLLBAR
;
369 if (PtInRect(&pPreviewData
->rcDialogFrame
, pt
))
372 if (PtInRect(&pPreviewData
->rcDialogCaption
, pt
))
373 type
= IDX_ACTIVE_CAPTION
;
375 if (PtInRect(&pPreviewData
->rcDialogCaptionButtons
, pt
))
376 type
= IDX_CAPTION_BUTTON
;
378 if (PtInRect(&pPreviewData
->rcDialogButton
, pt
))
379 type
= IDX_3D_OBJECTS
;
381 SendMessage(GetParent(hwnd
),
383 MAKEWPARAM(GetWindowLongPtrW(hwnd
, GWLP_ID
), 0),
389 OnDestroy(PPREVIEW_DATA pPreviewData
)
391 DeleteObject(pPreviewData
->hbrScrollbar
);
392 DeleteObject(pPreviewData
->hbrDesktop
);
393 DeleteObject(pPreviewData
->hbrWindow
);
395 DeleteObject(pPreviewData
->hCaptionFont
);
396 DeleteObject(pPreviewData
->hMenuFont
);
397 DeleteObject(pPreviewData
->hMessageFont
);
399 DestroyMenu(pPreviewData
->hMenu
);
401 LocalFree((HLOCAL
)pPreviewData
->lpInAct
);
402 LocalFree((HLOCAL
)pPreviewData
->lpAct
);
403 LocalFree((HLOCAL
)pPreviewData
->lpWinTxt
);
404 LocalFree((HLOCAL
)pPreviewData
->lpMessBox
);
405 LocalFree((HLOCAL
)pPreviewData
->lpMessText
);
406 LocalFree((HLOCAL
)pPreviewData
->lpButText
);
410 static LRESULT CALLBACK
411 PreviewWndProc(HWND hwnd
,
416 PPREVIEW_DATA pPreviewData
;
418 pPreviewData
= (PPREVIEW_DATA
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
423 pPreviewData
= (PPREVIEW_DATA
)HeapAlloc(GetProcessHeap(),
425 sizeof(PREVIEW_DATA
));
429 SetWindowLongPtr(hwnd
, GWLP_USERDATA
, (LONG_PTR
)pPreviewData
);
430 OnCreate(hwnd
, pPreviewData
);
434 OnSize(LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
438 OnPaint(hwnd
, pPreviewData
);
442 OnLButtonDown(hwnd
, LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
446 OnDestroy(pPreviewData
);
447 HeapFree(GetProcessHeap(), 0, pPreviewData
);
450 case PVM_GETCYCAPTION
:
451 return pPreviewData
->cyCaption
;
453 case PVM_SETCYCAPTION
:
456 pPreviewData
->cyCaption
= (INT
)lParam
;
457 CalculateItemSize(pPreviewData
);
458 InvalidateRect(hwnd
, NULL
, FALSE
);
463 return pPreviewData
->cyMenu
;
468 pPreviewData
->cyMenu
= (INT
)lParam
;
469 CalculateItemSize(pPreviewData
);
470 InvalidateRect(hwnd
, NULL
, FALSE
);
474 case PVM_GETCXSCROLLBAR
:
475 return pPreviewData
->cxScrollbar
;
477 case PVM_SETCXSCROLLBAR
:
480 pPreviewData
->cxScrollbar
= (INT
)lParam
;
481 CalculateItemSize(pPreviewData
);
482 InvalidateRect(hwnd
, NULL
, FALSE
);
486 case PVM_GETCYSIZEFRAME
:
487 return pPreviewData
->cySizeFrame
;
489 case PVM_SETCYSIZEFRAME
:
492 pPreviewData
->cySizeFrame
= (INT
)lParam
;
493 CalculateItemSize(pPreviewData
);
494 InvalidateRect(hwnd
, NULL
, FALSE
);
498 case PVM_UPDATETHEME
:
499 UpdatePreviewTheme(hwnd
, pPreviewData
, (THEME
*)lParam
);
503 return DefWindowProc(hwnd
, uMsg
, wParam
, lParam
);
510 RegisterPreviewControl(IN HINSTANCE hInstance
)
514 wc
.cbSize
= sizeof(WNDCLASSEX
);
515 wc
.lpfnWndProc
= PreviewWndProc
;
516 wc
.hInstance
= hInstance
;
517 wc
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
518 wc
.hbrBackground
= (HBRUSH
)NULL
;
519 wc
.lpszClassName
= szPreviewWndClass
;
521 return RegisterClassEx(&wc
) != (ATOM
)0;
526 UnregisterPreviewControl(IN HINSTANCE hInstance
)
528 UnregisterClass(szPreviewWndClass
, hInstance
);