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