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
);
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
]);
86 pPreviewData
->cxEdge
= theme
->Size
[SIZE_EDGE_X
] - 2; /* SM_CXEDGE */
87 pPreviewData
->cyEdge
= theme
->Size
[SIZE_EDGE_Y
] - 2; /* SM_CYEDGE */
89 pPreviewData
->cySizeFrame
= theme
->Size
[SIZE_FRAME_Y
] - 1; /* SM_CYSIZEFRAME */
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 */
96 if (pPreviewData
->hCaptionFont
!= NULL
)
97 DeleteObject(pPreviewData
->hCaptionFont
);
98 pPreviewData
->hCaptionFont
= CreateFontIndirect(&theme
->lfFont
[FONT_CAPTION
]);
100 if (pPreviewData
->hMenuFont
!= NULL
)
101 DeleteObject(pPreviewData
->hMenuFont
);
102 pPreviewData
->hMenuFont
= CreateFontIndirect(&theme
->lfFont
[FONT_MENU
]);
104 if (pPreviewData
->hMessageFont
!= NULL
)
105 DeleteObject(pPreviewData
->hMessageFont
);
106 pPreviewData
->hMessageFont
= CreateFontIndirect(&theme
->lfFont
[FONT_DIALOG
]);
108 pPreviewData
->Theme
= *theme
;
109 InvalidateRect(hwnd
, NULL
, FALSE
);
113 OnCreate(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
117 pPreviewData
->hClientFont
= (HFONT
)GetStockObject(DEFAULT_GUI_FONT
);
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
);
126 // GetMenuItemRect(hwnd, pPreviewData->hMenu,
127 // 2, &pPreviewData->rcSelectedMenuItem);
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
);
136 theme
= &pPreviewData
->Theme
;
137 LoadCurrentTheme(theme
);
139 UpdatePreviewTheme(hwnd
, pPreviewData
, theme
);
144 CalculateItemSize(PPREVIEW_DATA pPreviewData
)
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;
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
;
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;
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;
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
;
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;
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;
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;
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;
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;
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;
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;
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;
227 /* Calculate the dialog button rectangle */
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
;
240 OnSize(INT cx
, INT cy
, PPREVIEW_DATA pPreviewData
)
242 /* Get Desktop rectangle */
243 pPreviewData
->rcDesktop
.left
= 0;
244 pPreviewData
->rcDesktop
.top
= 0;
245 pPreviewData
->rcDesktop
.right
= cx
;
246 pPreviewData
->rcDesktop
.bottom
= cy
;
248 CalculateItemSize(pPreviewData
);
252 OnPaint(HWND hwnd
, PPREVIEW_DATA pPreviewData
)
260 theme
= &pPreviewData
->Theme
;
262 hdc
= BeginPaint(hwnd
, &ps
);
265 FillRect(hdc
, &pPreviewData
->rcDesktop
, pPreviewData
->hbrDesktop
);
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
);
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
);
281 /* Draw the menu bar */
282 MyDrawMenuBarTemp(hwnd
, hdc
, &pPreviewData
->rcActiveMenuBar
,
284 pPreviewData
->hMenuFont
, theme
);
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
);
291 /* Draw the client text */
292 CopyRect(&rc
, &pPreviewData
->rcActiveClient
);
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
);
300 /* Draw the scroll bar */
301 MyDrawScrollbar(hdc
, &pPreviewData
->rcActiveScroll
, pPreviewData
->hbrScrollbar
, theme
);
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
);
310 /* Draw the dialog text */
311 CopyRect(&rc
, &pPreviewData
->rcDialogClient
);
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
);
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
);
332 OnLButtonDown(HWND hwnd
, int xPos
, int yPos
, PPREVIEW_DATA pPreviewData
)
334 UINT type
= IDX_DESKTOP
;
340 if (PtInRect(&pPreviewData
->rcInactiveFrame
, pt
))
341 type
= IDX_INACTIVE_BORDER
;
343 if (PtInRect(&pPreviewData
->rcInactiveCaption
, pt
))
344 type
= IDX_INACTIVE_CAPTION
;
346 if (PtInRect(&pPreviewData
->rcInactiveCaptionButtons
, pt
))
347 type
= IDX_CAPTION_BUTTON
;
349 if (PtInRect(&pPreviewData
->rcActiveFrame
, pt
))
350 type
= IDX_ACTIVE_BORDER
;
352 if (PtInRect(&pPreviewData
->rcActiveCaption
, pt
))
353 type
= IDX_ACTIVE_CAPTION
;
355 if (PtInRect(&pPreviewData
->rcActiveCaptionButtons
, pt
))
356 type
= IDX_CAPTION_BUTTON
;
358 // if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
359 // type = IDX_SELECTION;
361 if (PtInRect(&pPreviewData
->rcActiveMenuBar
, pt
))
364 if (PtInRect(&pPreviewData
->rcActiveClient
, pt
))
367 if (PtInRect(&pPreviewData
->rcActiveScroll
, pt
))
368 type
= IDX_SCROLLBAR
;
370 if (PtInRect(&pPreviewData
->rcDialogFrame
, pt
))
373 if (PtInRect(&pPreviewData
->rcDialogCaption
, pt
))
374 type
= IDX_ACTIVE_CAPTION
;
376 if (PtInRect(&pPreviewData
->rcDialogCaptionButtons
, pt
))
377 type
= IDX_CAPTION_BUTTON
;
379 if (PtInRect(&pPreviewData
->rcDialogButton
, pt
))
380 type
= IDX_3D_OBJECTS
;
382 SendMessage(GetParent(hwnd
),
384 MAKEWPARAM(GetWindowLongPtrW(hwnd
, GWLP_ID
), 0),
390 OnDestroy(PPREVIEW_DATA pPreviewData
)
392 DeleteObject(pPreviewData
->hbrScrollbar
);
393 DeleteObject(pPreviewData
->hbrDesktop
);
394 DeleteObject(pPreviewData
->hbrWindow
);
396 DeleteObject(pPreviewData
->hCaptionFont
);
397 DeleteObject(pPreviewData
->hMenuFont
);
398 DeleteObject(pPreviewData
->hMessageFont
);
400 DestroyMenu(pPreviewData
->hMenu
);
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
);
411 static LRESULT CALLBACK
412 PreviewWndProc(HWND hwnd
,
417 PPREVIEW_DATA pPreviewData
;
419 pPreviewData
= (PPREVIEW_DATA
)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
424 pPreviewData
= (PPREVIEW_DATA
)HeapAlloc(GetProcessHeap(),
426 sizeof(PREVIEW_DATA
));
430 SetWindowLongPtr(hwnd
, GWLP_USERDATA
, (LONG_PTR
)pPreviewData
);
431 OnCreate(hwnd
, pPreviewData
);
435 OnSize(LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
439 OnPaint(hwnd
, pPreviewData
);
443 OnLButtonDown(hwnd
, LOWORD(lParam
), HIWORD(lParam
), pPreviewData
);
447 OnDestroy(pPreviewData
);
448 HeapFree(GetProcessHeap(), 0, pPreviewData
);
451 case PVM_GETCYCAPTION
:
452 return pPreviewData
->cyCaption
;
454 case PVM_SETCYCAPTION
:
457 pPreviewData
->cyCaption
= (INT
)lParam
;
458 CalculateItemSize(pPreviewData
);
459 InvalidateRect(hwnd
, NULL
, FALSE
);
464 return pPreviewData
->cyMenu
;
469 pPreviewData
->cyMenu
= (INT
)lParam
;
470 CalculateItemSize(pPreviewData
);
471 InvalidateRect(hwnd
, NULL
, FALSE
);
475 case PVM_GETCXSCROLLBAR
:
476 return pPreviewData
->cxScrollbar
;
478 case PVM_SETCXSCROLLBAR
:
481 pPreviewData
->cxScrollbar
= (INT
)lParam
;
482 CalculateItemSize(pPreviewData
);
483 InvalidateRect(hwnd
, NULL
, FALSE
);
487 case PVM_GETCYSIZEFRAME
:
488 return pPreviewData
->cySizeFrame
;
490 case PVM_SETCYSIZEFRAME
:
493 pPreviewData
->cySizeFrame
= (INT
)lParam
;
494 CalculateItemSize(pPreviewData
);
495 InvalidateRect(hwnd
, NULL
, FALSE
);
499 case PVM_UPDATETHEME
:
500 UpdatePreviewTheme(hwnd
, pPreviewData
, (THEME
*)lParam
);
504 return DefWindowProc(hwnd
, uMsg
, wParam
, lParam
);
511 RegisterPreviewControl(IN HINSTANCE hInstance
)
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
;
522 return RegisterClassEx(&wc
) != (ATOM
)0;
527 UnregisterPreviewControl(IN HINSTANCE hInstance
)
529 UnregisterClass(szPreviewWndClass
, hInstance
);