1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Display Control Panel 4 * FILE: dll/cpl/desk/advappdlg.c 5 * PURPOSE: Advanced appearance dialog 6 * 7 * PROGRAMMER: Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de) 8 * 9 */ 10 11 #include "desk.h" 12 13 /******************************************************************************/ 14 15 typedef struct 16 { 17 int Size; 18 int Size2; 19 int Color1; 20 int Color2; 21 int Font; 22 int FontColor; 23 } ASSIGNMENT; 24 25 /* This const assigns the color and metric numbers to the elements from the elements list */ 26 27 /* Size 1 (width) Size 2 (height) Color 1 Color 2 Font Fontcolor */ 28 const ASSIGNMENT g_Assignment[NUM_ELEMENTS] = 29 { 30 {-1, -1, COLOR_DESKTOP, -1, -1, -1}, /* Desktop */ 31 {SIZE_CAPTION_HEIGHT, -1, COLOR_INACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION, FONT_CAPTION, COLOR_INACTIVECAPTIONTEXT},/* inactive window caption */ 32 {SIZE_BORDER_WIDTH, -1, COLOR_INACTIVEBORDER, -1, -1, -1}, /* inactive window border */ 33 {SIZE_CAPTION_HEIGHT, -1, COLOR_ACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION, FONT_CAPTION, COLOR_CAPTIONTEXT}, /* active window caption */ 34 {SIZE_BORDER_WIDTH, -1, COLOR_ACTIVEBORDER, -1, -1, -1}, /* active window border */ 35 {SIZE_MENU_HEIGHT, SIZE_MENU_WIDTH, COLOR_MENU, COLOR_MENUHILIGHT, FONT_MENU, COLOR_MENUTEXT}, /* menu */ 36 {SIZE_MENU_HEIGHT, SIZE_MENU_WIDTH, COLOR_HIGHLIGHT, -1, -1, COLOR_HIGHLIGHTTEXT},/* marked element */ 37 {-1, -1, COLOR_WINDOW, -1 /*COLOR_WINDOWFRAME*/, -1, COLOR_WINDOWTEXT}, /* window */ 38 {SIZE_SCROLL_WIDTH, SIZE_SCROLL_HEIGHT, COLOR_SCROLLBAR, -1, -1, -1}, /* scroll bar */ 39 {-1, -1, COLOR_3DFACE, -1, -1, COLOR_BTNTEXT}, /* 3d objects */ 40 {SIZE_SM_CAPTION_HEIGHT, -1, -1, -1, FONT_SMCAPTION, -1}, /* palette (small) window caption */ 41 {SIZE_CAPTION_HEIGHT, -1, -1, -1, -1, -1}, /* caption bar buttons */ 42 {-1, -1, -1, -1, FONT_MESSAGE, COLOR_WINDOWTEXT}, /* dialog */ 43 {-1, -1, COLOR_APPWORKSPACE, -1, -1, -1}, /* application background */ 44 {SIZE_ICON_SPACE_X, -1, -1, -1, -1, -1}, /* icon distance horiz. */ 45 {SIZE_ICON_SPACE_Y, -1, -1, -1, -1, -1}, /* icon distance vert. */ 46 {-1, -1, COLOR_INFOBK, -1, FONT_STATUS, COLOR_INFOTEXT}, /* quickinfo */ 47 {SIZE_ICON, -1, -1, -1, FONT_ICON, -1}, /* icon */ 48 // {-1, -1, -1, -1, -1, COLOR_GRAYTEXT}, /* inactive menu item -- FIXME: Access? */ 49 }; 50 51 /******************************************************************************/ 52 53 /* Draw the current color on the color picker buttons */ 54 static VOID 55 UpdateButtonColor(HWND hwndDlg, GLOBALS* g, INT ID, INT nButton, INT nColor) 56 { 57 HDC hdcColorButton, hdcCompat; 58 RECT rect; 59 HBRUSH hbrush; 60 HWND hwndColorButton; 61 HGDIOBJ hgdiTmp; 62 63 if (nColor != -1) 64 { 65 /* Create a DC to draw on */ 66 hwndColorButton = GetDlgItem(hwndDlg, ID); 67 hdcColorButton = GetDC(hwndColorButton); 68 hdcCompat = CreateCompatibleDC(hdcColorButton); 69 ReleaseDC(hwndColorButton, hdcColorButton); 70 71 /* Select the button image to it */ 72 hgdiTmp = SelectObject(hdcCompat, g->hbmpColor[nButton]); 73 74 /* Create a brush and draw the rectangle */ 75 rect.left = 2; 76 rect.top = 2; 77 rect.right = 22; 78 rect.bottom = 13; 79 hbrush = CreateSolidBrush(g->SchemeAdv.crColor[nColor]); 80 FillRect(hdcCompat, &rect, hbrush); 81 DeleteObject(hbrush); 82 83 /* hdcCompat is not needed anymore */ 84 SelectObject(hdcCompat,hgdiTmp); 85 DeleteDC(hdcCompat); 86 87 SendDlgItemMessage(hwndDlg, ID, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[nButton]); 88 EnableWindow(GetDlgItem(hwndDlg, ID), TRUE); 89 } 90 else 91 { 92 SendDlgItemMessage(hwndDlg, ID, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)NULL); 93 EnableWindow(GetDlgItem(hwndDlg, ID), FALSE); 94 } 95 } 96 97 98 /* Create the basic bitmaps for the color picker buttons */ 99 static VOID 100 InitColorButtons(HWND hwndDlg, GLOBALS* g) 101 { 102 INT i; 103 HDC hdcColorButton, hdcCompat; 104 RECT rect; 105 HBRUSH hbrush; 106 HPEN hPen; 107 HWND hwndColorButton; 108 HGDIOBJ hgdiTemp; 109 COLOR_SCHEME *scheme = &g->SchemeAdv; 110 111 const POINT Points[3] = {{29,6},{33,6},{31,8}}; 112 113 hwndColorButton = GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_B); 114 hdcColorButton = GetDC(hwndColorButton); 115 for (i = 0; i <= 2; i++) 116 { 117 /* Create a DC to draw on */ 118 hdcCompat = CreateCompatibleDC(hdcColorButton); 119 120 /* Create the button image */ 121 g->hbmpColor[i] = CreateCompatibleBitmap(hdcColorButton, 36, 15); 122 123 /* Select the button image to the DC */ 124 hgdiTemp = SelectObject(hdcCompat, g->hbmpColor[i]); 125 126 /* Draw the buttons background color */ 127 rect.left = 0; 128 rect.top = 0; 129 rect.right = 36; 130 rect.bottom = 15; 131 hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNFACE]); 132 FillRect(hdcCompat, &rect, hbrush); 133 DeleteObject(hbrush); 134 135 /* Draw the rectangle */ 136 rect.left = 1; 137 rect.top = 1; 138 rect.right = 23; 139 rect.bottom = 14; 140 hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNTEXT]); 141 FillRect(hdcCompat, &rect, hbrush); 142 DeleteObject(hbrush); 143 144 /* Draw left side of line */ 145 hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNSHADOW]); 146 SelectObject(hdcCompat, hPen); 147 MoveToEx(hdcCompat, 26, 1, NULL); 148 LineTo(hdcCompat, 26, 14); 149 SelectObject(hdcCompat, GetStockObject(BLACK_PEN)); 150 DeleteObject(hPen); 151 152 /* Draw right side of line */ 153 hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNHIGHLIGHT]); 154 SelectObject(hdcCompat,hPen); 155 MoveToEx(hdcCompat, 27, 1, NULL); 156 LineTo(hdcCompat, 27, 14); 157 SelectObject(hdcCompat, GetStockObject(BLACK_PEN)); 158 DeleteObject(hPen); 159 160 /* Draw triangle */ 161 hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNTEXT]); 162 hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNTEXT]); 163 SelectObject(hdcCompat, hPen); 164 SelectObject(hdcCompat, hbrush); 165 SetPolyFillMode(hdcCompat, WINDING); 166 167 /* FIXME: HACK, see Points definition */ 168 Polygon(hdcCompat, Points, 3); 169 170 /* Cleanup */ 171 SelectObject(hdcCompat,hgdiTemp); 172 DeleteDC(hdcCompat); 173 DeleteObject(hPen); 174 DeleteObject(hbrush); 175 } 176 177 ReleaseDC(hwndColorButton, hdcColorButton); 178 179 /* Set the images of the buttons */ 180 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[0]); 181 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_COLOR2_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[1]); 182 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTCOLOR_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[2]); 183 } 184 185 186 /* This is the callback function to add the installed fonts to the font combo */ 187 static int CALLBACK 188 EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, DWORD dwFontType, LPARAM lParam) 189 { 190 /* Don't enumerate more than 100 fonts */ 191 if (SendMessage((HWND)lParam, CB_GETCOUNT, 0, 0) >= 100) 192 return 0; 193 194 /* Only add the string once */ 195 if (SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (WPARAM)&(lpelfe->elfLogFont.lfFaceName)) != CB_ERR) 196 return 2; 197 198 SendMessage((HWND)lParam, CB_ADDSTRING, 0, (WPARAM)&(lpelfe->elfLogFont.lfFaceName)); 199 200 return 1; 201 } 202 203 204 /* Update all the controls with the current values for the selected screen element */ 205 static VOID 206 UpdateControls(HWND hwndDlg, GLOBALS *g) 207 { 208 INT iElement; 209 HDC hdcDlg; 210 211 iElement = g->CurrentElement; 212 213 /* First enable / disable the controls */ 214 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E), (g_Assignment[iElement].Size != -1)); 215 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), (g_Assignment[iElement].Size != -1)); 216 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_T), (g_Assignment[iElement].Size != -1)); 217 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_T), (g_Assignment[iElement].Color1 != -1)); 218 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR2_T), (g_Assignment[iElement].Color2 != -1)); 219 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_T), (g_Assignment[iElement].Font != -1)); 220 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), (g_Assignment[iElement].Font != -1)); 221 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_T), (g_Assignment[iElement].Font != -1)); 222 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E), (g_Assignment[iElement].Font != -1)); 223 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTCOLOR_T), (g_Assignment[iElement].FontColor != -1)); 224 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD), (g_Assignment[iElement].Font != -1)); 225 EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC), (g_Assignment[iElement].Font != -1)); 226 227 /* Update the colors of the color buttons */ 228 UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_COLOR1_B, 0, g_Assignment[iElement].Color1); 229 UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_COLOR2_B, 1, g_Assignment[iElement].Color2); 230 UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_FONTCOLOR_B, 2, g_Assignment[iElement].FontColor); 231 232 if (g_Assignment[iElement].Size != -1) 233 SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, SchemeGetMetric(&g->SchemeAdv, g_Assignment[iElement].Size), FALSE); 234 else 235 SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, TEXT("")); 236 237 hdcDlg = GetDC(hwndDlg); 238 if (g_Assignment[iElement].Font != -1) 239 { 240 PLOGFONTW plfFont = SchemeGetFont(&g->SchemeAdv, g_Assignment[iElement].Font); 241 242 SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName); 243 SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, -MulDiv(plfFont->lfHeight, 72, GetDeviceCaps(hdcDlg, LOGPIXELSY)), FALSE); 244 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, CB_FINDSTRINGEXACT, -1, (WPARAM)plfFont->lfFaceName); 245 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, plfFont->lfWeight == FW_BOLD?1:0, 0); 246 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, plfFont->lfItalic, 0); 247 } 248 else 249 { 250 SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, NULL); 251 SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, NULL); 252 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, 0, 0); 253 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, 0, 0); 254 } 255 256 ReleaseDC(hwndDlg, hdcDlg); 257 } 258 259 260 static VOID 261 SaveCurrentValues(HWND hwndDlg, GLOBALS *g) 262 { 263 BOOL bTranslated; 264 HDC hdcDlg = GetDC(hwndDlg); 265 266 if (g_Assignment[g->CurrentElement].Size != -1) 267 { 268 SchemeSetMetric(&g->SchemeAdv, g_Assignment[g->CurrentElement].Size, GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, &bTranslated, FALSE)); 269 } 270 271 if (g_Assignment[g->CurrentElement].Font != -1) 272 { 273 PLOGFONTW plfFont = SchemeGetFont(&g->SchemeAdv, g_Assignment[g->CurrentElement].Font); 274 plfFont->lfHeight = -MulDiv(GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, &bTranslated, FALSE), GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); 275 plfFont->lfWeight = (SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0) == 1) ? FW_BOLD : FW_NORMAL; 276 plfFont->lfItalic = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); 277 GetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName, LF_FACESIZE); 278 } 279 280 ReleaseDC(hwndDlg, hdcDlg); 281 } 282 283 284 /* Select a color using a color picker */ 285 static BOOL 286 GetColor(HWND hwndDlg, GLOBALS* g, INT nButton) 287 { 288 CHOOSECOLOR cc; 289 COLORREF crColor; 290 INT ID = 0; 291 INT ColorIndex = 0; 292 293 /* Get the color index from the element index and button number */ 294 switch (nButton) 295 { 296 case 0: 297 ColorIndex = g_Assignment[g->CurrentElement].Color1; 298 ID = IDC_ADVAPPEARANCE_COLOR1_B; 299 break; 300 301 case 1: 302 ColorIndex = g_Assignment[g->CurrentElement].Color2; 303 ID = IDC_ADVAPPEARANCE_COLOR2_B; 304 break; 305 306 case 2: 307 ColorIndex = g_Assignment[g->CurrentElement].FontColor; 308 ID = IDC_ADVAPPEARANCE_FONTCOLOR_B; 309 break; 310 } 311 312 crColor = g->SchemeAdv.crColor[ColorIndex]; 313 314 /* Prepare cc structure */ 315 cc.lStructSize = sizeof(CHOOSECOLOR); 316 cc.hwndOwner = hwndDlg; 317 cc.hInstance = NULL; 318 cc.rgbResult = crColor; 319 cc.lpCustColors = g->crCustom; 320 cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT; 321 cc.lCustData = 0; 322 cc.lpfnHook = NULL; 323 cc.lpTemplateName = NULL; 324 325 /* Create the colorpicker */ 326 if (ChooseColor(&cc)) 327 { 328 g->SchemeAdv.crColor[ColorIndex] = cc.rgbResult; 329 if (crColor != cc.rgbResult) 330 { 331 UpdateButtonColor(hwndDlg, g, ID, nButton, ColorIndex); 332 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); 333 return TRUE; 334 } 335 } 336 337 return FALSE; 338 } 339 340 341 /* Initialize the advanced appearance dialog */ 342 static VOID 343 AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g) 344 { 345 INT i, iElement, iListIndex, iDeskIndex = 0; 346 TCHAR tstrText[80]; 347 LOGFONT lfFont; 348 LOGFONT lfButtonFont; 349 HFONT hMyFont; 350 HDC hScreenDC; 351 TCHAR Size[4]; 352 353 /* Copy the current theme values */ 354 g->SchemeAdv = g->Scheme; 355 356 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); 357 358 /* Add the elements to the combo */ 359 for (iElement = 0; iElement < NUM_ELEMENTS; iElement++) 360 { 361 LoadString(hApplet, IDS_ELEMENT_0 + iElement, (LPTSTR)&tstrText, 79); 362 iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_ADDSTRING, 0, (LPARAM)&tstrText); 363 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETITEMDATA, (WPARAM)iListIndex, (LPARAM)iElement); 364 } 365 366 /* Get the list index of the desktop element */ 367 for (iListIndex = 0; iListIndex < NUM_ELEMENTS; iListIndex++) 368 { 369 iElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0); 370 if (iElement == 0) 371 { 372 iDeskIndex = iListIndex; 373 break; 374 } 375 } 376 377 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETCURSEL, iDeskIndex, 0); 378 379 /* Create font for bold button */ 380 lfButtonFont = g->Scheme.ncMetrics.lfMessageFont; 381 lfButtonFont.lfWeight = FW_BOLD; 382 lfButtonFont.lfItalic = FALSE; 383 hMyFont = CreateFontIndirect(&lfButtonFont); 384 if (hMyFont) 385 { 386 if (g->hBoldFont) 387 DeleteObject(g->hBoldFont); 388 389 g->hBoldFont = hMyFont; 390 } 391 392 /* Create font for italic button */ 393 lfButtonFont.lfWeight = FW_REGULAR; 394 lfButtonFont.lfItalic = TRUE; 395 hMyFont = CreateFontIndirect(&lfButtonFont); 396 if (hMyFont) 397 { 398 if (g->hItalicFont) 399 DeleteObject(g->hItalicFont); 400 401 g->hItalicFont = hMyFont; 402 } 403 404 /* Set the fonts for the font style buttons */ 405 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, WM_SETFONT, (WPARAM)g->hBoldFont, (LPARAM)TRUE); 406 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, WM_SETFONT, (WPARAM)g->hItalicFont, (LPARAM)TRUE); 407 408 /* Draw Bitmaps for the colorbuttons */ 409 InitColorButtons(hwndDlg, g); 410 411 /* Make the UpDown control count correctly */ 412 SendMessage(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), UDM_SETRANGE, 0L, MAKELONG (200, 1)); 413 414 /* Fill font selection combo */ 415 lfFont.lfCharSet = DEFAULT_CHARSET; 416 lfFont.lfFaceName[0] = (TCHAR)0; 417 lfFont.lfPitchAndFamily = 0; 418 hScreenDC = GetDC(0); 419 EnumFontFamiliesEx(hScreenDC, &lfFont, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), 0); 420 ReleaseDC(0, hScreenDC); 421 422 /* Fill font size combo */ 423 for (i = 6; i <= 24; i++) 424 { 425 StringCbPrintf(Size, sizeof(Size), TEXT("%d"), i); 426 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, CB_ADDSTRING, 0, (LPARAM)&Size); 427 } 428 429 /* Update the controls */ 430 iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0); 431 g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0); 432 UpdateControls(hwndDlg, g); 433 } 434 435 436 static VOID 437 AdvAppearanceDlg_CleanUp(HWND hwndDlg, GLOBALS* g) 438 { 439 DeleteObject(g->hBoldFont); 440 DeleteObject(g->hItalicFont); 441 } 442 443 444 static VOID 445 SelectComboByElement(HWND hwnd, INT id, LPARAM lParam) 446 { 447 INT nCount; 448 INT i; 449 450 nCount = SendDlgItemMessage(hwnd, id, CB_GETCOUNT, 0, 0); 451 if (nCount == CB_ERR) 452 return; 453 454 for (i = 0; i < nCount; i++) 455 { 456 if (SendDlgItemMessage(hwnd, id, CB_GETITEMDATA, (WPARAM)i, 0) == lParam) 457 { 458 SendDlgItemMessage(hwnd, id, CB_SETCURSEL, (WPARAM)i, 0); 459 break; 460 } 461 } 462 } 463 464 465 static VOID 466 GetSelectedComboText(HWND hwnd, INT id, LPWSTR lpStr) 467 { 468 INT nCount; 469 470 nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0); 471 if (nCount == CB_ERR) 472 { 473 *lpStr = 0; 474 return; 475 } 476 477 nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)lpStr); 478 if (nCount == CB_ERR) 479 { 480 *lpStr = 0; 481 } 482 } 483 484 485 static INT 486 GetSelectedComboInt(HWND hwnd, INT id) 487 { 488 TCHAR szBuffer[80]; 489 INT nCount; 490 491 nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0); 492 if (nCount == CB_ERR) 493 return 0; 494 495 nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)szBuffer); 496 if (nCount == CB_ERR) 497 return 0; 498 499 return _ttoi(szBuffer); 500 } 501 502 INT_PTR CALLBACK 503 AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 504 { 505 INT iSelection, iProperty; 506 GLOBALS* g; 507 PLOGFONTW plfFont; 508 509 g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER); 510 511 switch (uMsg) 512 { 513 case WM_INITDIALOG: 514 g = (GLOBALS*)lParam; 515 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g); 516 AdvAppearanceDlg_Init(hwndDlg, g); 517 break; 518 519 case WM_DESTROY: 520 AdvAppearanceDlg_CleanUp(hwndDlg, g); 521 break; 522 523 case WM_COMMAND: 524 if (g == NULL) 525 return TRUE; 526 527 switch(LOWORD(wParam)) 528 { 529 case IDOK: 530 SaveCurrentValues(hwndDlg, g); 531 EndDialog(hwndDlg, IDOK); 532 break; 533 534 case IDCANCEL: 535 g->SchemeAdv = g->Scheme; 536 EndDialog(hwndDlg, IDCANCEL); 537 break; 538 539 case IDC_APPEARANCE_PREVIEW: 540 SaveCurrentValues(hwndDlg, g); 541 SelectComboByElement(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, lParam); 542 g->CurrentElement = (INT)lParam; 543 UpdateControls(hwndDlg, g); 544 break; 545 546 case IDC_ADVAPPEARANCE_ELEMENT: 547 if (HIWORD(wParam) == CBN_SELCHANGE) 548 { 549 SaveCurrentValues(hwndDlg, g); 550 iSelection = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0); 551 g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, iSelection, 0); 552 UpdateControls(hwndDlg, g); 553 } 554 break; 555 556 case IDC_ADVAPPEARANCE_SIZE_E: 557 if (HIWORD(wParam) == EN_CHANGE) 558 { 559 iProperty = g_Assignment[g->CurrentElement].Size; 560 if (iProperty == -1) 561 return TRUE; 562 563 iSelection = LOWORD(SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD, UDM_GETPOS,0,0L)); 564 SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection); 565 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETSIZE, iProperty, iSelection); 566 567 iProperty = g_Assignment[g->CurrentElement].Size2; 568 if (iProperty != -1) 569 SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection); 570 } 571 break; 572 573 case IDC_ADVAPPEARANCE_FONT_C: 574 if (HIWORD(wParam) == CBN_SELCHANGE) 575 { 576 iProperty = g_Assignment[g->CurrentElement].Font; 577 if (iProperty == -1) 578 return TRUE; 579 580 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); 581 GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName); 582 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont); 583 } 584 break; 585 586 case IDC_ADVAPPEARANCE_FONTSIZE_E: 587 if ((HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)) 588 { 589 HDC hdcDlg; 590 591 iProperty = g_Assignment[g->CurrentElement].Font; 592 if (iProperty == -1) 593 return TRUE; 594 595 hdcDlg = GetDC(hwndDlg); 596 597 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); 598 iSelection = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E); 599 plfFont->lfHeight = -MulDiv(iSelection , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72); 600 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv); 601 602 ReleaseDC(hwndDlg, hdcDlg); 603 } 604 break; 605 606 case IDC_ADVAPPEARANCE_FONTBOLD: 607 if (HIWORD(wParam) == BN_CLICKED) 608 { 609 iProperty = g_Assignment[g->CurrentElement].Font; 610 if (iProperty == -1) 611 return TRUE; 612 613 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); 614 iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0); 615 plfFont->lfWeight = (iSelection == BST_CHECKED) ? FW_BOLD : FW_NORMAL; 616 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont); 617 } 618 break; 619 620 case IDC_ADVAPPEARANCE_FONTITALIC: 621 if (HIWORD(wParam) == BN_CLICKED) 622 { 623 iProperty = g_Assignment[g->CurrentElement].Font; 624 if (iProperty == -1) 625 return TRUE; 626 627 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty); 628 iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0); 629 plfFont->lfItalic = (iSelection == BST_CHECKED) ? TRUE : FALSE; 630 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont); 631 } 632 break; 633 634 case IDC_ADVAPPEARANCE_COLOR1_B: 635 GetColor(hwndDlg, g, 0); 636 break; 637 638 case IDC_ADVAPPEARANCE_COLOR2_B: 639 GetColor(hwndDlg, g, 1); 640 break; 641 642 case IDC_ADVAPPEARANCE_FONTCOLOR_B: 643 GetColor(hwndDlg, g, 2); 644 break; 645 646 default: 647 return FALSE; 648 } 649 break; 650 651 default: 652 return FALSE; 653 } 654 655 return TRUE; 656 } 657