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
UpdateButtonColor(HWND hwndDlg,GLOBALS * g,INT ID,INT nButton,INT nColor)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
InitColorButtons(HWND hwndDlg,GLOBALS * g)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
EnumFontFamExProc(ENUMLOGFONTEX * lpelfe,NEWTEXTMETRICEX * lpntme,DWORD dwFontType,LPARAM lParam)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
UpdateControls(HWND hwndDlg,GLOBALS * g)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
SaveCurrentValues(HWND hwndDlg,GLOBALS * g)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
GetColor(HWND hwndDlg,GLOBALS * g,INT nButton)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
AdvAppearanceDlg_Init(HWND hwndDlg,GLOBALS * g)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
AdvAppearanceDlg_CleanUp(HWND hwndDlg,GLOBALS * g)437 AdvAppearanceDlg_CleanUp(HWND hwndDlg, GLOBALS* g)
438 {
439 DeleteObject(g->hBoldFont);
440 DeleteObject(g->hItalicFont);
441 }
442
443
444 static VOID
SelectComboByElement(HWND hwnd,INT id,LPARAM lParam)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
GetSelectedComboText(HWND hwnd,INT id,LPWSTR lpStr)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
GetSelectedComboInt(HWND hwnd,INT id)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
AdvAppearanceDlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)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