Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpreview.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Desktop Control Panel 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: dll/cpl/desk/preview.c 00005 * PURPOSE: Draws the preview control 00006 * COPYRIGHT: Copyright 2006, 2007 Eric Kohl 00007 */ 00008 00009 #include "desk.h" 00010 00011 static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass"); 00012 00013 typedef struct _PREVIEW_DATA 00014 { 00015 HWND hwndParent; 00016 00017 COLOR_SCHEME Scheme; 00018 00019 HBRUSH hbrScrollbar; 00020 HBRUSH hbrDesktop; 00021 HBRUSH hbrWindow; 00022 00023 INT cxEdge; 00024 INT cyEdge; 00025 00026 INT cySizeFrame; 00027 00028 INT cyCaption; 00029 INT cyBorder; 00030 INT cyMenu; 00031 INT cxScrollbar; 00032 00033 RECT rcDesktop; 00034 RECT rcInactiveFrame; 00035 RECT rcInactiveCaption; 00036 RECT rcInactiveCaptionButtons; 00037 00038 RECT rcActiveFrame; 00039 RECT rcActiveCaption; 00040 RECT rcActiveCaptionButtons; 00041 RECT rcActiveMenuBar; 00042 RECT rcSelectedMenuItem; 00043 RECT rcActiveClient; 00044 RECT rcActiveScroll; 00045 00046 RECT rcDialogFrame; 00047 RECT rcDialogCaption; 00048 RECT rcDialogCaptionButtons; 00049 RECT rcDialogClient; 00050 00051 RECT rcDialogButton; 00052 00053 LPTSTR lpInAct; 00054 LPTSTR lpAct; 00055 LPTSTR lpWinTxt; 00056 LPTSTR lpMessBox; 00057 LPTSTR lpMessText; 00058 LPTSTR lpButText; 00059 00060 HFONT hCaptionFont; 00061 HFONT hMenuFont; 00062 HFONT hMessageFont; 00063 HFONT hClientFont; 00064 00065 HMENU hMenu; 00066 00067 } PREVIEW_DATA, *PPREVIEW_DATA; 00068 00069 00070 static VOID UpdatePreviewTheme(HWND hwnd, PPREVIEW_DATA pPreviewData, COLOR_SCHEME *scheme) 00071 { 00072 if (pPreviewData->hbrScrollbar != NULL) 00073 DeleteObject(pPreviewData->hbrScrollbar); 00074 pPreviewData->hbrScrollbar = CreateSolidBrush(scheme->crColor[COLOR_SCROLLBAR]); 00075 if (pPreviewData->hbrDesktop != NULL) 00076 DeleteObject(pPreviewData->hbrDesktop); 00077 00078 pPreviewData->hbrDesktop = CreateSolidBrush(scheme->crColor[COLOR_DESKTOP]); 00079 if (pPreviewData->hbrWindow != NULL) 00080 DeleteObject(pPreviewData->hbrWindow); 00081 pPreviewData->hbrWindow = CreateSolidBrush(scheme->crColor[COLOR_WINDOW]); 00082 00083 pPreviewData->cxEdge = scheme->Size[SIZE_EDGE_X] - 2; /* SM_CXEDGE */ 00084 pPreviewData->cyEdge = scheme->Size[SIZE_EDGE_Y] - 2; /* SM_CYEDGE */ 00085 00086 pPreviewData->cySizeFrame = scheme->Size[SIZE_FRAME_Y] - 1; /* SM_CYSIZEFRAME */ 00087 00088 pPreviewData->cyCaption = scheme->Size[SIZE_CAPTION_Y]; /* SM_CYCAPTION */ 00089 pPreviewData->cyMenu = scheme->Size[SIZE_MENU_Y]; /* SM_CYMENU */ 00090 pPreviewData->cxScrollbar = scheme->Size[SIZE_SCROLL_X]; /* SM_CXVSCROLL */ 00091 pPreviewData->cyBorder = scheme->Size[SIZE_BORDER_Y]; /* SM_CYBORDER */ 00092 00093 if (pPreviewData->hCaptionFont != NULL) 00094 DeleteObject(pPreviewData->hCaptionFont); 00095 pPreviewData->hCaptionFont = CreateFontIndirect(&scheme->lfFont[FONT_CAPTION]); 00096 00097 if (pPreviewData->hMenuFont != NULL) 00098 DeleteObject(pPreviewData->hMenuFont); 00099 pPreviewData->hMenuFont = CreateFontIndirect(&scheme->lfFont[FONT_MENU]); 00100 00101 if (pPreviewData->hMessageFont != NULL) 00102 DeleteObject(pPreviewData->hMessageFont); 00103 pPreviewData->hMessageFont = CreateFontIndirect(&scheme->lfFont[FONT_DIALOG]); 00104 00105 pPreviewData->Scheme = *scheme; 00106 InvalidateRect(hwnd, NULL, FALSE); 00107 } 00108 00109 static VOID 00110 OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData) 00111 { 00112 COLOR_SCHEME *scheme; 00113 00114 pPreviewData->hClientFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); 00115 00116 /* Load and modify the menu */ 00117 pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU)); 00118 EnableMenuItem(pPreviewData->hMenu, 00119 1, MF_BYPOSITION | MF_GRAYED); 00120 HiliteMenuItem(hwnd, pPreviewData->hMenu, 00121 2, MF_BYPOSITION | MF_HILITE); 00122 00123 // GetMenuItemRect(hwnd, pPreviewData->hMenu, 00124 // 2, &pPreviewData->rcSelectedMenuItem); 00125 00126 AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN); 00127 AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN); 00128 AllocAndLoadString(&pPreviewData->lpWinTxt, hApplet, IDS_WINTEXT); 00129 AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX); 00130 AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT); 00131 AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT); 00132 00133 scheme = &pPreviewData->Scheme; 00134 LoadCurrentScheme(scheme); 00135 00136 UpdatePreviewTheme(hwnd, pPreviewData, scheme); 00137 } 00138 00139 00140 static VOID 00141 CalculateItemSize(PPREVIEW_DATA pPreviewData) 00142 { 00143 int width, height; 00144 00145 /* Calculate the inactive window rectangle */ 00146 pPreviewData->rcInactiveFrame.left = pPreviewData->rcDesktop.left + 8; 00147 pPreviewData->rcInactiveFrame.top = pPreviewData->rcDesktop.top + 8; 00148 pPreviewData->rcInactiveFrame.right = pPreviewData->rcDesktop.right - 25; 00149 pPreviewData->rcInactiveFrame.bottom = pPreviewData->rcDesktop.bottom - 30; 00150 00151 /* Calculate the inactive caption rectangle */ 00152 pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1; 00153 pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + pPreviewData->cySizeFrame + 1; 00154 pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1; 00155 pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder; 00156 00157 /* Calculate the inactive caption buttons rectangle */ 00158 pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16; 00159 pPreviewData->rcInactiveCaptionButtons.top = pPreviewData->rcInactiveCaption.top + 2; 00160 pPreviewData->rcInactiveCaptionButtons.right = pPreviewData->rcInactiveCaption.right - 2; 00161 pPreviewData->rcInactiveCaptionButtons.bottom = pPreviewData->rcInactiveCaption.bottom - 2; 00162 00163 /* Calculate the active window rectangle */ 00164 pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + pPreviewData->cySizeFrame; 00165 pPreviewData->rcActiveFrame.top = pPreviewData->rcInactiveCaption.bottom + 1; 00166 pPreviewData->rcActiveFrame.right = pPreviewData->rcDesktop.right - 10; 00167 pPreviewData->rcActiveFrame.bottom = pPreviewData->rcDesktop.bottom - 25; 00168 00169 /* Calculate the active caption rectangle */ 00170 pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1; 00171 pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1; 00172 pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1; 00173 pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder; 00174 00175 /* Calculate the active caption buttons rectangle */ 00176 pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16; 00177 pPreviewData->rcActiveCaptionButtons.top = pPreviewData->rcActiveCaption.top + 2; 00178 pPreviewData->rcActiveCaptionButtons.right = pPreviewData->rcActiveCaption.right - 2; 00179 pPreviewData->rcActiveCaptionButtons.bottom = pPreviewData->rcActiveCaption.bottom - 2; 00180 00181 /* Calculate the active menu bar rectangle */ 00182 pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1; 00183 pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 1; 00184 pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1; 00185 pPreviewData->rcActiveMenuBar.bottom = pPreviewData->rcActiveMenuBar.top + pPreviewData->cyMenu + 1; 00186 00187 /* Calculate the active client rectangle */ 00188 pPreviewData->rcActiveClient.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1; 00189 pPreviewData->rcActiveClient.top = pPreviewData->rcActiveMenuBar.bottom; 00190 pPreviewData->rcActiveClient.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1; 00191 pPreviewData->rcActiveClient.bottom = pPreviewData->rcActiveFrame.bottom - pPreviewData->cyEdge - pPreviewData->cySizeFrame - 1; 00192 00193 /* Calculate the active scroll rectangle */ 00194 pPreviewData->rcActiveScroll.left = pPreviewData->rcActiveClient.right - 2 - pPreviewData->cxScrollbar; 00195 pPreviewData->rcActiveScroll.top = pPreviewData->rcActiveClient.top + 2; 00196 pPreviewData->rcActiveScroll.right = pPreviewData->rcActiveClient.right - 2; 00197 pPreviewData->rcActiveScroll.bottom = pPreviewData->rcActiveClient.bottom - 2; 00198 00199 00200 /* Dialog window */ 00201 pPreviewData->rcDialogFrame.left = pPreviewData->rcActiveClient.left + 4; 00202 pPreviewData->rcDialogFrame.top = (pPreviewData->rcDesktop.bottom * 60) / 100; 00203 pPreviewData->rcDialogFrame.right = (pPreviewData->rcDesktop.right * 65) / 100; 00204 pPreviewData->rcDialogFrame.bottom = pPreviewData->rcDesktop.bottom - 5; 00205 00206 /* Calculate the dialog caption rectangle */ 00207 pPreviewData->rcDialogCaption.left = pPreviewData->rcDialogFrame.left + 3; 00208 pPreviewData->rcDialogCaption.top = pPreviewData->rcDialogFrame.top + 3; 00209 pPreviewData->rcDialogCaption.right = pPreviewData->rcDialogFrame.right - 3; 00210 pPreviewData->rcDialogCaption.bottom = pPreviewData->rcDialogFrame.top + pPreviewData->cyCaption + 1 + 1; 00211 00212 /* Calculate the inactive caption buttons rectangle */ 00213 pPreviewData->rcDialogCaptionButtons.left = pPreviewData->rcDialogCaption.right - 2 - 16; 00214 pPreviewData->rcDialogCaptionButtons.top = pPreviewData->rcDialogCaption.top + 2; 00215 pPreviewData->rcDialogCaptionButtons.right = pPreviewData->rcDialogCaption.right - 2; 00216 pPreviewData->rcDialogCaptionButtons.bottom = pPreviewData->rcDialogCaption.bottom - 2; 00217 00218 /* Calculate the dialog client rectangle */ 00219 pPreviewData->rcDialogClient.left = pPreviewData->rcDialogFrame.left + 3; 00220 pPreviewData->rcDialogClient.top = pPreviewData->rcDialogCaption.bottom + 1; 00221 pPreviewData->rcDialogClient.right = pPreviewData->rcDialogFrame.right - 3; 00222 pPreviewData->rcDialogClient.bottom = pPreviewData->rcDialogFrame.bottom - 3; 00223 00224 /* Calculate the dialog button rectangle */ 00225 width = 80; 00226 height = 28; 00227 00228 pPreviewData->rcDialogButton.left = 00229 (pPreviewData->rcDialogClient.right + pPreviewData->rcDialogClient.left - width) / 2; 00230 pPreviewData->rcDialogButton.right = pPreviewData->rcDialogButton.left + width; 00231 pPreviewData->rcDialogButton.bottom = pPreviewData->rcDialogClient.bottom - 2; 00232 pPreviewData->rcDialogButton.top = pPreviewData->rcDialogButton.bottom - height; 00233 } 00234 00235 00236 static VOID 00237 OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData) 00238 { 00239 /* Get Desktop rectangle */ 00240 pPreviewData->rcDesktop.left = 0; 00241 pPreviewData->rcDesktop.top = 0; 00242 pPreviewData->rcDesktop.right = cx; 00243 pPreviewData->rcDesktop.bottom = cy; 00244 00245 CalculateItemSize(pPreviewData); 00246 } 00247 00248 static VOID 00249 OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) 00250 { 00251 PAINTSTRUCT ps; 00252 HFONT hOldFont; 00253 HDC hdc; 00254 RECT rc; 00255 COLOR_SCHEME *scheme; 00256 00257 scheme = &pPreviewData->Scheme; 00258 00259 hdc = BeginPaint(hwnd, &ps); 00260 00261 /* Desktop */ 00262 FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop); 00263 00264 /* Inactive Window */ 00265 MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, scheme); 00266 SetTextColor(hdc, scheme->crColor[COLOR_INACTIVECAPTIONTEXT]); 00267 MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont, 00268 NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT, scheme); 00269 MyDrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2, scheme); 00270 00271 /* Active Window */ 00272 MyDrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, scheme); 00273 SetTextColor(hdc, scheme->crColor[COLOR_CAPTIONTEXT]); 00274 MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont, 00275 NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, scheme); 00276 MyDrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2, scheme); 00277 00278 /* Draw the menu bar */ 00279 MyDrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar, 00280 pPreviewData->hMenu, 00281 pPreviewData->hMenuFont, scheme); 00282 00283 /* Draw the client area */ 00284 CopyRect(&rc, &pPreviewData->rcActiveClient); 00285 MyDrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST, scheme); 00286 FillRect(hdc, &rc, pPreviewData->hbrWindow); 00287 00288 /* Draw the client text */ 00289 CopyRect(&rc, &pPreviewData->rcActiveClient); 00290 rc.left += 4; 00291 rc.top += 2; 00292 SetTextColor(hdc, scheme->crColor[COLOR_WINDOWTEXT]); 00293 hOldFont = SelectObject(hdc, pPreviewData->hClientFont); 00294 DrawText(hdc, pPreviewData->lpWinTxt, -1, &rc, DT_LEFT); 00295 SelectObject(hdc, hOldFont); 00296 00297 /* Draw the scroll bar */ 00298 MyDrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar, scheme); 00299 00300 /* Dialog Window */ 00301 MyDrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, scheme); 00302 SetTextColor(hdc, scheme->crColor[COLOR_WINDOW]); 00303 MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont, 00304 NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, scheme); 00305 MyDrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2, scheme); 00306 00307 /* Draw the dialog text */ 00308 CopyRect(&rc, &pPreviewData->rcDialogClient); 00309 rc.left += 4; 00310 rc.top += 2; 00311 SetTextColor(hdc, scheme->crColor[COLOR_BTNTEXT]); 00312 hOldFont = SelectObject(hdc, pPreviewData->hMessageFont); 00313 DrawText(hdc, pPreviewData->lpMessText, -1, &rc, DT_LEFT); 00314 SelectObject(hdc, hOldFont); 00315 00316 /* Draw Button */ 00317 MyDrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH, scheme); 00318 CopyRect(&rc, &pPreviewData->rcDialogButton); 00319 SetTextColor(hdc, scheme->crColor[COLOR_BTNTEXT]); 00320 hOldFont = SelectObject(hdc, pPreviewData->hMessageFont); 00321 DrawText(hdc, pPreviewData->lpButText, -1, &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE); 00322 SelectObject(hdc, hOldFont); 00323 00324 EndPaint(hwnd, &ps); 00325 } 00326 00327 00328 static VOID 00329 OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData) 00330 { 00331 UINT type = IDX_DESKTOP; 00332 POINT pt; 00333 00334 pt.x = xPos; 00335 pt.y = yPos; 00336 00337 if (PtInRect(&pPreviewData->rcInactiveFrame, pt)) 00338 type = IDX_INACTIVE_BORDER; 00339 00340 if (PtInRect(&pPreviewData->rcInactiveCaption, pt)) 00341 type = IDX_INACTIVE_CAPTION; 00342 00343 if (PtInRect(&pPreviewData->rcInactiveCaptionButtons, pt)) 00344 type = IDX_CAPTION_BUTTON; 00345 00346 if (PtInRect(&pPreviewData->rcActiveFrame, pt)) 00347 type = IDX_ACTIVE_BORDER; 00348 00349 if (PtInRect(&pPreviewData->rcActiveCaption, pt)) 00350 type = IDX_ACTIVE_CAPTION; 00351 00352 if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt)) 00353 type = IDX_CAPTION_BUTTON; 00354 00355 // if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt)) 00356 // type = IDX_SELECTION; 00357 00358 if (PtInRect(&pPreviewData->rcActiveMenuBar, pt)) 00359 type = IDX_MENU; 00360 00361 if (PtInRect(&pPreviewData->rcActiveClient, pt)) 00362 type = IDX_WINDOW; 00363 00364 if (PtInRect(&pPreviewData->rcActiveScroll, pt)) 00365 type = IDX_SCROLLBAR; 00366 00367 if (PtInRect(&pPreviewData->rcDialogFrame, pt)) 00368 type = IDX_DIALOG; 00369 00370 if (PtInRect(&pPreviewData->rcDialogCaption, pt)) 00371 type = IDX_ACTIVE_CAPTION; 00372 00373 if (PtInRect(&pPreviewData->rcDialogCaptionButtons, pt)) 00374 type = IDX_CAPTION_BUTTON; 00375 00376 if (PtInRect(&pPreviewData->rcDialogButton, pt)) 00377 type = IDX_3D_OBJECTS; 00378 00379 SendMessage(GetParent(hwnd), 00380 WM_COMMAND, 00381 MAKEWPARAM(GetWindowLongPtrW(hwnd, GWLP_ID), 0), 00382 (LPARAM)type); 00383 } 00384 00385 00386 static VOID 00387 OnDestroy(PPREVIEW_DATA pPreviewData) 00388 { 00389 DeleteObject(pPreviewData->hbrScrollbar); 00390 DeleteObject(pPreviewData->hbrDesktop); 00391 DeleteObject(pPreviewData->hbrWindow); 00392 00393 DeleteObject(pPreviewData->hCaptionFont); 00394 DeleteObject(pPreviewData->hMenuFont); 00395 DeleteObject(pPreviewData->hMessageFont); 00396 00397 DestroyMenu(pPreviewData->hMenu); 00398 00399 LocalFree((HLOCAL)pPreviewData->lpInAct); 00400 LocalFree((HLOCAL)pPreviewData->lpAct); 00401 LocalFree((HLOCAL)pPreviewData->lpWinTxt); 00402 LocalFree((HLOCAL)pPreviewData->lpMessBox); 00403 LocalFree((HLOCAL)pPreviewData->lpMessText); 00404 LocalFree((HLOCAL)pPreviewData->lpButText); 00405 } 00406 00407 00408 static LRESULT CALLBACK 00409 PreviewWndProc(HWND hwnd, 00410 UINT uMsg, 00411 WPARAM wParam, 00412 LPARAM lParam) 00413 { 00414 PPREVIEW_DATA pPreviewData; 00415 00416 pPreviewData = (PPREVIEW_DATA)GetWindowLongPtr(hwnd, GWLP_USERDATA); 00417 00418 switch (uMsg) 00419 { 00420 case WM_CREATE: 00421 pPreviewData = (PPREVIEW_DATA)HeapAlloc(GetProcessHeap(), 00422 HEAP_ZERO_MEMORY, 00423 sizeof(PREVIEW_DATA)); 00424 if (!pPreviewData) 00425 return -1; 00426 00427 SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pPreviewData); 00428 OnCreate(hwnd, pPreviewData); 00429 break; 00430 00431 case WM_SIZE: 00432 OnSize(LOWORD(lParam), HIWORD(lParam), pPreviewData); 00433 break; 00434 00435 case WM_PAINT: 00436 OnPaint(hwnd, pPreviewData); 00437 break; 00438 00439 case WM_LBUTTONDOWN: 00440 OnLButtonDown(hwnd, LOWORD(lParam), HIWORD(lParam), pPreviewData); 00441 break; 00442 00443 case WM_DESTROY: 00444 OnDestroy(pPreviewData); 00445 HeapFree(GetProcessHeap(), 0, pPreviewData); 00446 break; 00447 00448 case PVM_GETCYCAPTION: 00449 return pPreviewData->cyCaption; 00450 00451 case PVM_SETCYCAPTION: 00452 if ((INT)lParam > 0) 00453 { 00454 pPreviewData->cyCaption = (INT)lParam; 00455 CalculateItemSize(pPreviewData); 00456 InvalidateRect(hwnd, NULL, FALSE); 00457 } 00458 break; 00459 00460 case PVM_GETCYMENU: 00461 return pPreviewData->cyMenu; 00462 00463 case PVM_SETCYMENU: 00464 if ((INT)lParam > 0) 00465 { 00466 pPreviewData->cyMenu = (INT)lParam; 00467 CalculateItemSize(pPreviewData); 00468 InvalidateRect(hwnd, NULL, FALSE); 00469 } 00470 break; 00471 00472 case PVM_GETCXSCROLLBAR: 00473 return pPreviewData->cxScrollbar; 00474 00475 case PVM_SETCXSCROLLBAR: 00476 if ((INT)lParam > 0) 00477 { 00478 pPreviewData->cxScrollbar = (INT)lParam; 00479 CalculateItemSize(pPreviewData); 00480 InvalidateRect(hwnd, NULL, FALSE); 00481 } 00482 break; 00483 00484 case PVM_GETCYSIZEFRAME: 00485 return pPreviewData->cySizeFrame; 00486 00487 case PVM_SETCYSIZEFRAME: 00488 if ((INT)lParam > 0) 00489 { 00490 pPreviewData->cySizeFrame = (INT)lParam; 00491 CalculateItemSize(pPreviewData); 00492 InvalidateRect(hwnd, NULL, FALSE); 00493 } 00494 break; 00495 00496 case PVM_UPDATETHEME: 00497 UpdatePreviewTheme(hwnd, pPreviewData, (COLOR_SCHEME *)lParam); 00498 break; 00499 00500 default: 00501 return DefWindowProc(hwnd, uMsg, wParam, lParam); 00502 } 00503 return FALSE; 00504 } 00505 00506 00507 BOOL 00508 RegisterPreviewControl(IN HINSTANCE hInstance) 00509 { 00510 WNDCLASSEX wc = {0}; 00511 00512 wc.cbSize = sizeof(WNDCLASSEX); 00513 wc.lpfnWndProc = PreviewWndProc; 00514 wc.hInstance = hInstance; 00515 wc.hCursor = LoadCursor(NULL, IDC_ARROW); 00516 wc.hbrBackground = (HBRUSH)NULL; 00517 wc.lpszClassName = szPreviewWndClass; 00518 00519 return RegisterClassEx(&wc) != (ATOM)0; 00520 } 00521 00522 00523 VOID 00524 UnregisterPreviewControl(IN HINSTANCE hInstance) 00525 { 00526 UnregisterClass(szPreviewWndClass, hInstance); 00527 } Generated on Sat May 26 2012 04:19:44 for ReactOS by
1.7.6.1
|