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