mirror of
https://github.com/reactos/reactos.git
synced 2024-07-02 10:45:24 +00:00
Katayama Hirofumi MZ <katayama DOT hirofumi DOT mz AT gmail DOT com>
- Preperation of quick preview für themes. - See issue #5487 for details. svn path=/trunk/; revision=47937
This commit is contained in:
parent
d9e47e9039
commit
c7119e7226
|
@ -5,15 +5,55 @@
|
|||
* FILE: dll/cpl/desk/advappdlg.c
|
||||
* PURPOSE: Advanced appearance dialog
|
||||
*
|
||||
* PROGRAMMER: Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de)
|
||||
* PROGRAMMER: Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "desk.h"
|
||||
#include "theme.h"
|
||||
#include "appearance.h"
|
||||
#include "preview.h"
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int Size;
|
||||
int Size2;
|
||||
int Color1;
|
||||
int Color2;
|
||||
int Font;
|
||||
int FontColor;
|
||||
} ASSIGNMENT;
|
||||
|
||||
/* This const assigns the color and metric numbers to the elements from the elements list */
|
||||
|
||||
/* Size 1 (width) Size 2 (height) Color 1 Color 2 Font Fontcolor */
|
||||
const ASSIGNMENT g_Assignment[NUM_ELEMENTS] =
|
||||
{ {-1, -1, COLOR_DESKTOP, -1, -1, -1}, /* -Desktop */
|
||||
{SIZE_CAPTION_Y, -1, COLOR_INACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION, FONT_CAPTION, -1}, /* inactive window caption */
|
||||
{SIZE_BORDER_X, SIZE_BORDER_Y, COLOR_INACTIVEBORDER, -1, -1, -1}, /* inactive window border */
|
||||
{SIZE_CAPTION_Y, -1, COLOR_ACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION, FONT_CAPTION, COLOR_CAPTIONTEXT}, /* -active window caption */
|
||||
{SIZE_BORDER_X, SIZE_BORDER_Y, COLOR_ACTIVEBORDER, -1, -1, -1}, /* active window border */
|
||||
{SIZE_MENU_SIZE_X,SIZE_MENU_Y, COLOR_MENU, -1, FONT_MENU, COLOR_MENUTEXT}, /* menu */
|
||||
{SIZE_MENU_SIZE_X,SIZE_MENU_Y, COLOR_HIGHLIGHT, -1, FONT_HILIGHT, COLOR_HIGHLIGHTTEXT},/* marked element */
|
||||
{-1, -1, COLOR_WINDOW, -1 /*COLOR_WINDOWFRAME*/, -1, COLOR_WINDOWTEXT}, /* window */
|
||||
{SIZE_SCROLL_X, SIZE_SCROLL_Y, COLOR_SCROLLBAR, -1, -1, -1}, /* scroll bar */
|
||||
{-1, -1, COLOR_3DFACE, -1, -1, COLOR_BTNTEXT}, /* 3d objects */
|
||||
{SIZE_SMCAPTION_Y,-1, -1, -1, FONT_SMCAPTION, -1}, /* palette window caption */
|
||||
{-1, -1, -1, -1, -1, -1}, /* symbol caption FIXME: Access? */
|
||||
{SIZE_CAPTION_Y, -1, -1, -1, -1, -1}, /* caption bar */
|
||||
{-1, -1, -1, -1, -1, COLOR_GRAYTEXT}, /* inactive menu item FIXME: Access? */
|
||||
{-1, -1, -1, -1, FONT_DIALOG, COLOR_WINDOWTEXT}, /* dialog */
|
||||
{-1, -1, -1, -1, -1, -1}, /* scrollbar controls FIXME: Access? */
|
||||
{-1, -1, COLOR_APPWORKSPACE, -1, -1, -1}, /* application background */
|
||||
{-1, -1, -1, -1, -1, -1}, /* small caption bar FIXME: Access? */
|
||||
{SIZE_ICON_SPC_X, -1, -1, -1, -1, -1}, /* symbol distance horiz. */
|
||||
{SIZE_ICON_SPC_Y, -1, -1, -1, -1, -1}, /* symbol distance vert. */
|
||||
{-1, -1, COLOR_INFOBK, -1, FONT_INFO, COLOR_INFOTEXT}, /* quickinfo */
|
||||
{SIZE_ICON_X, SIZE_ICON_Y, -1, -1, FONT_ICON, -1}}; /* symbol */
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* Draw the current color on the color picker buttons */
|
||||
static VOID
|
||||
|
@ -71,6 +111,7 @@ InitColorButtons(HWND hwndDlg, GLOBALS* g)
|
|||
HPEN hPen;
|
||||
HWND hwndColorButton;
|
||||
HGDIOBJ hgdiTemp;
|
||||
THEME *theme = &g->ThemeAdv;
|
||||
|
||||
const POINT Points[3] = {{29,6},{33,6},{31,8}};
|
||||
|
||||
|
@ -92,7 +133,7 @@ InitColorButtons(HWND hwndDlg, GLOBALS* g)
|
|||
rect.top = 0;
|
||||
rect.right = 36;
|
||||
rect.bottom = 15;
|
||||
hbrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
|
||||
hbrush = CreateSolidBrush(theme->crColor[COLOR_BTNFACE]);
|
||||
FillRect(hdcCompat, &rect, hbrush);
|
||||
DeleteObject(hbrush);
|
||||
|
||||
|
@ -101,12 +142,12 @@ InitColorButtons(HWND hwndDlg, GLOBALS* g)
|
|||
rect.top = 1;
|
||||
rect.right = 23;
|
||||
rect.bottom = 14;
|
||||
hbrush = CreateSolidBrush(GetSysColor(COLOR_BTNTEXT));
|
||||
hbrush = CreateSolidBrush(theme->crColor[COLOR_BTNTEXT]);
|
||||
FillRect(hdcCompat, &rect, hbrush);
|
||||
DeleteObject(hbrush);
|
||||
|
||||
/* Draw left side of line */
|
||||
hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
|
||||
hPen = CreatePen(PS_SOLID, 1, theme->crColor[COLOR_BTNSHADOW]);
|
||||
SelectObject(hdcCompat, hPen);
|
||||
MoveToEx(hdcCompat, 26, 1, NULL);
|
||||
LineTo(hdcCompat, 26, 14);
|
||||
|
@ -114,7 +155,7 @@ InitColorButtons(HWND hwndDlg, GLOBALS* g)
|
|||
DeleteObject(hPen);
|
||||
|
||||
/* Draw right side of line */
|
||||
hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT));
|
||||
hPen = CreatePen(PS_SOLID, 1, theme->crColor[COLOR_BTNHIGHLIGHT]);
|
||||
SelectObject(hdcCompat,hPen);
|
||||
MoveToEx(hdcCompat, 27, 1, NULL);
|
||||
LineTo(hdcCompat, 27, 14);
|
||||
|
@ -122,8 +163,8 @@ InitColorButtons(HWND hwndDlg, GLOBALS* g)
|
|||
DeleteObject(hPen);
|
||||
|
||||
/* Draw triangle */
|
||||
hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT));
|
||||
hbrush = CreateSolidBrush(GetSysColor(COLOR_BTNTEXT));
|
||||
hPen = CreatePen(PS_SOLID, 1, theme->crColor[COLOR_BTNTEXT]);
|
||||
hbrush = CreateSolidBrush(theme->crColor[COLOR_BTNTEXT]);
|
||||
SelectObject(hdcCompat, hPen);
|
||||
SelectObject(hdcCompat, hbrush);
|
||||
SetPolyFillMode(hdcCompat, WINDING);
|
||||
|
@ -293,7 +334,7 @@ GetColor(HWND hwndDlg, GLOBALS* g, INT nButton)
|
|||
if (crColor != cc.rgbResult)
|
||||
{
|
||||
UpdateButtonColor(hwndDlg, g, ID, nButton, ColorIndex);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCOLOR, ColorIndex, cc.rgbResult);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -317,6 +358,9 @@ AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
|
|||
/* Copy the current theme values */
|
||||
g->ThemeAdv = g->Theme;
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
|
||||
|
||||
/* Add the elements to the combo */
|
||||
for (iElement = 0; iElement < NUM_ELEMENTS; iElement++)
|
||||
{
|
||||
|
@ -338,12 +382,6 @@ AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
|
|||
|
||||
SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETCURSEL, iDeskIndex, 0);
|
||||
|
||||
/* Set colors for the color buttons */
|
||||
g->crCOLOR_BTNFACE = g->Theme.crColor[COLOR_BTNFACE];
|
||||
g->crCOLOR_BTNTEXT = g->Theme.crColor[COLOR_BTNTEXT];
|
||||
g->crCOLOR_BTNSHADOW = g->Theme.crColor[COLOR_BTNSHADOW];
|
||||
g->crCOLOR_BTNHIGHLIGHT = g->Theme.crColor[COLOR_BTNHIGHLIGHT];
|
||||
|
||||
/* Create font for bold button */
|
||||
lfButtonFont = g->Theme.lfFont[FONT_DIALOG];
|
||||
lfButtonFont.lfWeight = FW_BOLD;
|
||||
|
@ -377,7 +415,7 @@ AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
|
|||
InitColorButtons(hwndDlg, g);
|
||||
|
||||
/* Make the UpDown control count correctly */
|
||||
SendMessage (GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), UDM_SETRANGE, 0L, MAKELONG (200, 1));
|
||||
SendMessage(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), UDM_SETRANGE, 0L, MAKELONG (200, 1));
|
||||
|
||||
/* Fill font selection combo */
|
||||
lfFont.lfCharSet = DEFAULT_CHARSET;
|
||||
|
@ -508,12 +546,12 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
case IDOK:
|
||||
SaveCurrentValues(hwndDlg, g);
|
||||
EndDialog(hwndDlg, 0);
|
||||
EndDialog(hwndDlg, IDOK);
|
||||
break;
|
||||
|
||||
case IDCANCEL:
|
||||
g->ThemeAdv = g->Theme;
|
||||
EndDialog(hwndDlg, 0);
|
||||
EndDialog(hwndDlg, IDCANCEL);
|
||||
break;
|
||||
|
||||
case IDC_APPEARANCE_PREVIEW:
|
||||
|
@ -571,22 +609,19 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
case IDX_ACTIVE_CAPTION:
|
||||
GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C,
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCAPTIONFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_MENU:
|
||||
GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C,
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETMENUFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_DIALOG:
|
||||
GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C,
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETDIALOGFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -605,24 +640,21 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
|
||||
-MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCAPTIONFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_MENU:
|
||||
i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
|
||||
-MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETMENUFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_DIALOG:
|
||||
i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
|
||||
-MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETDIALOGFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -640,24 +672,21 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
|
||||
-MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCAPTIONFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_MENU:
|
||||
i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
|
||||
-MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETMENUFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_DIALOG:
|
||||
i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
|
||||
-MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETDIALOGFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -677,9 +706,7 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight =
|
||||
(i == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCAPTIONFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_MENU:
|
||||
|
@ -687,18 +714,14 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight =
|
||||
(i == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETMENUFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_DIALOG:
|
||||
i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
|
||||
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight =
|
||||
(i == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETDIALOGFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -714,32 +737,23 @@ AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
case IDX_INACTIVE_CAPTION:
|
||||
case IDX_ACTIVE_CAPTION:
|
||||
i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
|
||||
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic =
|
||||
(i == BST_CHECKED) ? TRUE : FALSE;
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCAPTIONFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_MENU:
|
||||
i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
|
||||
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic =
|
||||
(i == BST_CHECKED) ? TRUE : FALSE;
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETMENUFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
|
||||
case IDX_DIALOG:
|
||||
i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
|
||||
|
||||
g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic =
|
||||
(i == BST_CHECKED) ? TRUE : FALSE;
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETDIALOGFONT, 0,
|
||||
(LPARAM)&g->ThemeAdv.lfFont[g_Assignment[g->CurrentElement].Font]);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->ThemeAdv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,488 +9,70 @@
|
|||
*/
|
||||
|
||||
#include "desk.h"
|
||||
#include "theme.h"
|
||||
#include "preview.h"
|
||||
#include "appearance.h"
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* This const assigns the color and metric numbers to the elements from the elements list */
|
||||
|
||||
/* Size 1 (width) Size 2 (height) Color 1 Color 2 Font Fontcolor */
|
||||
const ASSIGNMENT g_Assignment[NUM_ELEMENTS] =
|
||||
{ {-1, -1, COLOR_DESKTOP, -1, -1, -1}, /* -Desktop */
|
||||
{SIZE_CAPTION_Y, -1, COLOR_INACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION, FONT_CAPTION, -1}, /* inactive window caption */
|
||||
{SIZE_BORDER_X, SIZE_BORDER_Y, COLOR_INACTIVEBORDER, -1, -1, -1}, /* inactive window border */
|
||||
{SIZE_CAPTION_Y, -1, COLOR_ACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION, FONT_CAPTION, COLOR_CAPTIONTEXT}, /* -active window caption */
|
||||
{SIZE_BORDER_X, SIZE_BORDER_Y, COLOR_ACTIVEBORDER, -1, -1, -1}, /* active window border */
|
||||
{SIZE_MENU_X, SIZE_MENU_Y, COLOR_MENU, -1, FONT_MENU, COLOR_MENUTEXT}, /* menu */
|
||||
{SIZE_MENU_X, SIZE_MENU_Y, COLOR_HIGHLIGHT, -1, FONT_HILIGHT, COLOR_HIGHLIGHTTEXT},/* marked element */
|
||||
{-1, -1, COLOR_WINDOW, -1 /*COLOR_WINDOWFRAME*/, -1, COLOR_WINDOWTEXT}, /* window */
|
||||
{SIZE_SCROLL_X, SIZE_SCROLL_Y, COLOR_SCROLLBAR, -1, -1, -1}, /* scroll bar */
|
||||
{-1, -1, COLOR_3DFACE, -1, -1, COLOR_BTNTEXT}, /* 3d objects */
|
||||
{SIZE_SMCAPTION_Y,-1, -1, -1, FONT_SMCAPTION, -1}, /* palette window caption */
|
||||
{-1, -1, -1, -1, -1, -1}, /* symbol caption FIXME: Access? */
|
||||
{SIZE_CAPTION_Y, -1, -1, -1, -1, -1}, /* caption bar */
|
||||
{-1, -1, -1, -1, -1, COLOR_GRAYTEXT}, /* inactive menu item FIXME: Access? */
|
||||
{-1, -1, -1, -1, FONT_DIALOG, COLOR_WINDOWTEXT}, /* dialog */
|
||||
{-1, -1, -1, -1, -1, -1}, /* scrollbar controls FIXME: Access? */
|
||||
{-1, -1, COLOR_APPWORKSPACE, -1, -1, -1}, /* application background */
|
||||
{-1, -1, -1, -1, -1, -1}, /* small caption bar FIXME: Access? */
|
||||
{SIZE_ICON_SPC_X, -1, -1, -1, -1, -1}, /* symbol distance horiz. */
|
||||
{SIZE_ICON_SPC_Y, -1, -1, -1, -1, -1}, /* symbol distance vert. */
|
||||
{-1, -1, COLOR_INFOBK, -1, FONT_INFO, COLOR_INFOTEXT}, /* quickinfo */
|
||||
{SIZE_ICON_X, SIZE_ICON_Y, -1, -1, FONT_ICON, -1}}; /* symbol */
|
||||
|
||||
/* This is the list of names for the colors stored in the registry */
|
||||
const TCHAR g_RegColorNames[NUM_COLORS][MAX_COLORNAMELENGTH] =
|
||||
{TEXT("Scrollbar"), /* 00 = COLOR_SCROLLBAR */
|
||||
TEXT("Background"), /* 01 = COLOR_DESKTOP */
|
||||
TEXT("ActiveTitle"), /* 02 = COLOR_ACTIVECAPTION */
|
||||
TEXT("InactiveTitle"), /* 03 = COLOR_INACTIVECAPTION */
|
||||
TEXT("Menu"), /* 04 = COLOR_MENU */
|
||||
TEXT("Window"), /* 05 = COLOR_WINDOW */
|
||||
TEXT("WindowFrame"), /* 06 = COLOR_WINDOWFRAME */
|
||||
TEXT("MenuText"), /* 07 = COLOR_MENUTEXT */
|
||||
TEXT("WindowText"), /* 08 = COLOR_WINDOWTEXT */
|
||||
TEXT("TitleText"), /* 09 = COLOR_CAPTIONTEXT */
|
||||
TEXT("ActiveBorder"), /* 10 = COLOR_ACTIVEBORDER */
|
||||
TEXT("InactiveBorder"), /* 11 = COLOR_INACTIVEBORDER */
|
||||
TEXT("AppWorkSpace"), /* 12 = COLOR_APPWORKSPACE */
|
||||
TEXT("Hilight"), /* 13 = COLOR_HIGHLIGHT */
|
||||
TEXT("HilightText"), /* 14 = COLOR_HIGHLIGHTTEXT */
|
||||
TEXT("ButtonFace"), /* 15 = COLOR_BTNFACE */
|
||||
TEXT("ButtonShadow"), /* 16 = COLOR_BTNSHADOW */
|
||||
TEXT("GrayText"), /* 17 = COLOR_GRAYTEXT */
|
||||
TEXT("ButtonText"), /* 18 = COLOR_BTNTEXT */
|
||||
TEXT("InactiveTitleText"), /* 19 = COLOR_INACTIVECAPTIONTEXT */
|
||||
TEXT("ButtonHilight"), /* 20 = COLOR_BTNHIGHLIGHT */
|
||||
TEXT("ButtonDkShadow"), /* 21 = COLOR_3DDKSHADOW */
|
||||
TEXT("ButtonLight"), /* 22 = COLOR_3DLIGHT */
|
||||
TEXT("InfoText"), /* 23 = COLOR_INFOTEXT */
|
||||
TEXT("InfoWindow"), /* 24 = COLOR_INFOBK */
|
||||
TEXT("ButtonAlternateFace"), /* 25 = COLOR_ALTERNATEBTNFACE */
|
||||
TEXT("HotTrackingColor"), /* 26 = COLOR_HOTLIGHT */
|
||||
TEXT("GradientActiveTitle"), /* 27 = COLOR_GRADIENTACTIVECAPTION */
|
||||
TEXT("GradientInactiveTitle"), /* 28 = COLOR_GRADIENTINACTIVECAPTION */
|
||||
TEXT("MenuHilight"), /* 29 = COLOR_MENUHILIGHT */
|
||||
TEXT("MenuBar"), /* 30 = COLOR_MENUBAR */
|
||||
};
|
||||
|
||||
/* This is the list of used metrics and their numbers */
|
||||
const int g_SizeMetric[NUM_SIZES] =
|
||||
{
|
||||
SM_CXBORDER,
|
||||
SM_CYBORDER,
|
||||
SM_CYCAPTION,
|
||||
SM_CXICON,
|
||||
SM_CYICON,
|
||||
SM_CXICONSPACING,
|
||||
SM_CYICONSPACING,
|
||||
SM_CXMENUSIZE,
|
||||
SM_CYMENU,
|
||||
SM_CXVSCROLL,
|
||||
SM_CYHSCROLL,
|
||||
SM_CYSMCAPTION
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
static VOID
|
||||
LoadCurrentTheme(GLOBALS* g)
|
||||
{
|
||||
INT i;
|
||||
NONCLIENTMETRICS NonClientMetrics;
|
||||
|
||||
g->Theme.bHasChanged = FALSE;
|
||||
/* FIXME: it may be custom! */
|
||||
g->Theme.bIsCustom = FALSE;
|
||||
|
||||
/* Load colors */
|
||||
for (i = 0; i <= 30; i++)
|
||||
{
|
||||
g->ColorList[i] = i;
|
||||
g->Theme.crColor[i] = (COLORREF)GetSysColor(i);
|
||||
}
|
||||
|
||||
/* Load sizes */
|
||||
for (i = 0; i <= 11; i++)
|
||||
{
|
||||
g->Theme.Size[i] = GetSystemMetrics(g_SizeMetric[i]);
|
||||
}
|
||||
|
||||
/* Load fonts */
|
||||
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
g->Theme.lfFont[FONT_CAPTION] = NonClientMetrics.lfCaptionFont;
|
||||
g->Theme.lfFont[FONT_SMCAPTION] = NonClientMetrics.lfSmCaptionFont;
|
||||
g->Theme.lfFont[FONT_MENU] = NonClientMetrics.lfMenuFont;
|
||||
g->Theme.lfFont[FONT_INFO] = NonClientMetrics.lfStatusFont;
|
||||
g->Theme.lfFont[FONT_DIALOG] = NonClientMetrics.lfMessageFont;
|
||||
SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &g->Theme.lfFont[FONT_ICON], 0);
|
||||
|
||||
/* Effects */
|
||||
/* "Use the following transition effect for menus and tooltips" */
|
||||
SystemParametersInfo(SPI_GETMENUANIMATION, sizeof(BOOL), &g->Theme.Effects.bMenuAnimation, 0);
|
||||
SystemParametersInfo(SPI_GETMENUFADE, sizeof(BOOL), &g->Theme.Effects.bMenuFade, 0);
|
||||
/* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
|
||||
* Just keep them in sync for now:
|
||||
*/
|
||||
g->Theme.Effects.bTooltipAnimation = g->Theme.Effects.bMenuAnimation;
|
||||
g->Theme.Effects.bTooltipFade = g->Theme.Effects.bMenuFade;
|
||||
|
||||
/* show content of windows during dragging */
|
||||
//SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, g->Theme.Effects.bDragFullWindows, NULL, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
|
||||
SystemParametersInfoW(SPI_GETDRAGFULLWINDOWS, 0, &g->Theme.Effects.bDragFullWindows, 0);
|
||||
|
||||
/* "Hide underlined letters for keyboard navigation until I press the Alt key" */
|
||||
SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &g->Theme.Effects.bKeyboardCues, 0);
|
||||
}
|
||||
|
||||
|
||||
static BOOL
|
||||
LoadThemeFromReg(GLOBALS* g)
|
||||
{
|
||||
INT i;
|
||||
TCHAR strSizeName[20] = {TEXT("Sizes\\0")};
|
||||
TCHAR strValueName[10];
|
||||
HKEY hkNewSchemes, hkScheme, hkSize;
|
||||
DWORD dwType, dwLength;
|
||||
BOOL Ret = FALSE;
|
||||
INT iPreset = g->Theme.Id;
|
||||
|
||||
if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance\\New Schemes"),
|
||||
0, KEY_READ, &hkNewSchemes) == ERROR_SUCCESS)
|
||||
{
|
||||
if(RegOpenKeyEx(hkNewSchemes, g->ThemeTemplates[iPreset].strKeyName, 0, KEY_READ, &hkScheme) == ERROR_SUCCESS)
|
||||
{
|
||||
lstrcpyn(&strSizeName[6],g->ThemeTemplates[iPreset].strSizeName, 3);
|
||||
if(RegOpenKeyEx(hkScheme, strSizeName, 0, KEY_READ, &hkSize) == ERROR_SUCCESS)
|
||||
{
|
||||
Ret = TRUE;
|
||||
|
||||
dwLength = sizeof(DWORD);
|
||||
if (RegQueryValueEx(hkSize, TEXT("FlatMenus"), NULL, &dwType, (LPBYTE)&g->Theme.bFlatMenus, &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_DWORD || dwLength != sizeof(DWORD))
|
||||
{
|
||||
/* Failed to read registry value */
|
||||
g->Theme.bFlatMenus = FALSE;
|
||||
Ret = FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i <= 30; i++)
|
||||
{
|
||||
wsprintf(strValueName, TEXT("Color #%d"), i);
|
||||
dwLength = sizeof(COLORREF);
|
||||
if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&g->Theme.crColor[i], &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_DWORD || dwLength != sizeof(COLORREF))
|
||||
{
|
||||
/* Failed to read registry value, initialize with current setting for now */
|
||||
g->Theme.crColor[i] = GetSysColor(i);
|
||||
Ret = FALSE;
|
||||
}
|
||||
}
|
||||
for (i = 0; i <= 5; i++)
|
||||
{
|
||||
wsprintf(strValueName, TEXT("Font #%d"), i);
|
||||
dwLength = sizeof(LOGFONT);
|
||||
g->Theme.lfFont[i].lfFaceName[0] = 'x';
|
||||
if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&g->Theme.lfFont[i], &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_BINARY || dwLength != sizeof(LOGFONT))
|
||||
{
|
||||
/* Failed to read registry value */
|
||||
Ret = FALSE;
|
||||
}
|
||||
}
|
||||
for (i = 0; i <= 8; i++)
|
||||
{
|
||||
wsprintf(strValueName, TEXT("Size #%d"), i);
|
||||
dwLength = sizeof(UINT64);
|
||||
if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&g->Theme.Size[i], &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_QWORD || dwLength != sizeof(UINT64))
|
||||
{
|
||||
/* Failed to read registry value, initialize with current setting for now */
|
||||
g->Theme.Size[i] = GetSystemMetrics(g_SizeMetric[i]);
|
||||
Ret = FALSE;
|
||||
}
|
||||
}
|
||||
RegCloseKey(hkScheme);
|
||||
}
|
||||
RegCloseKey(hkScheme);
|
||||
}
|
||||
RegCloseKey(hkNewSchemes);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
static VOID
|
||||
_UpdateUserPref(UINT SpiGet,UINT SpiSet,BOOL *pbFlag)
|
||||
{
|
||||
SystemParametersInfo(SpiSet, 0, (PVOID)pbFlag, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
|
||||
}
|
||||
#define UPDATE_USERPREF(NAME,pbFlag) _UpdateUserPref(SPI_GET ## NAME, SPI_SET ## NAME, pbFlag)
|
||||
|
||||
static VOID
|
||||
ApplyTheme(GLOBALS* g)
|
||||
{
|
||||
INT i, Result;
|
||||
HKEY hKey;
|
||||
DWORD dwDisposition = 0;
|
||||
TCHAR clText[16] = {0};
|
||||
NONCLIENTMETRICS NonClientMetrics;
|
||||
HFONT hMyFont;
|
||||
LOGFONT lfButtonFont;
|
||||
|
||||
if (!g->Theme.bHasChanged)
|
||||
return;
|
||||
|
||||
/* Update some globals */
|
||||
g->crCOLOR_BTNFACE = g->Theme.crColor[COLOR_BTNFACE];
|
||||
g->crCOLOR_BTNTEXT = g->Theme.crColor[COLOR_BTNTEXT];
|
||||
g->crCOLOR_BTNSHADOW = g->Theme.crColor[COLOR_BTNSHADOW];
|
||||
g->crCOLOR_BTNHIGHLIGHT = g->Theme.crColor[COLOR_BTNHIGHLIGHT];
|
||||
lfButtonFont = g->Theme.lfFont[FONT_DIALOG];
|
||||
|
||||
/* Create new font for bold button */
|
||||
lfButtonFont.lfWeight = FW_BOLD;
|
||||
lfButtonFont.lfItalic = FALSE;
|
||||
hMyFont = CreateFontIndirect(&lfButtonFont);
|
||||
if (hMyFont)
|
||||
{
|
||||
if (g->hBoldFont)
|
||||
DeleteObject(g->hBoldFont);
|
||||
g->hBoldFont = hMyFont;
|
||||
}
|
||||
|
||||
/* Create new font for italic button */
|
||||
lfButtonFont.lfWeight = FW_REGULAR;
|
||||
lfButtonFont.lfItalic = TRUE;
|
||||
hMyFont = CreateFontIndirect(&lfButtonFont);
|
||||
if (hMyFont)
|
||||
{
|
||||
if (g->hItalicFont)
|
||||
DeleteObject(g->hItalicFont);
|
||||
g->hItalicFont = hMyFont;
|
||||
}
|
||||
|
||||
/* Apply Colors from global variable */
|
||||
SetSysColors(30, &g->ColorList[0], &g->Theme.crColor[0]);
|
||||
|
||||
/* Save colors to registry */
|
||||
Result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Colors"), 0, KEY_ALL_ACCESS, &hKey);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
/* Could not open the key, try to create it */
|
||||
Result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Colors"), 0, NULL, 0, KEY_ALL_ACCESS, NULL,&hKey, &dwDisposition);
|
||||
}
|
||||
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
for (i = 0; i <= 30; i++)
|
||||
{
|
||||
DWORD red = GetRValue(g->Theme.crColor[i]);
|
||||
DWORD green = GetGValue(g->Theme.crColor[i]);
|
||||
DWORD blue = GetBValue(g->Theme.crColor[i]);
|
||||
wsprintf(clText, TEXT("%d %d %d"), red, green, blue);
|
||||
RegSetValueEx(hKey, g_RegColorNames[i], 0, REG_SZ, (BYTE *)clText, lstrlen( clText )*sizeof(TCHAR) + sizeof(TCHAR));
|
||||
}
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
/* Apply the fonts */
|
||||
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
NonClientMetrics.lfCaptionFont = g->Theme.lfFont[FONT_CAPTION];
|
||||
NonClientMetrics.lfSmCaptionFont = g->Theme.lfFont[FONT_SMCAPTION];
|
||||
NonClientMetrics.lfMenuFont = g->Theme.lfFont[FONT_MENU];
|
||||
NonClientMetrics.lfStatusFont = g->Theme.lfFont[FONT_INFO];
|
||||
NonClientMetrics.lfMessageFont = g->Theme.lfFont[FONT_DIALOG];
|
||||
SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(LOGFONT), &g->Theme.lfFont[FONT_ICON], 0);
|
||||
|
||||
/* FIXME: Apply size metrics */
|
||||
|
||||
/* Save fonts and size metrics to registry */
|
||||
Result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop\\WindowMetrics"), 0, KEY_ALL_ACCESS, &hKey);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
/* Could not open the key, try to create it */
|
||||
Result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop\\WindowMetrics"), 0, NULL, 0, KEY_ALL_ACCESS, NULL,&hKey, &dwDisposition);
|
||||
}
|
||||
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
RegSetValueEx(hKey, TEXT("CaptionFont"), 0, REG_BINARY, (BYTE *)&g->Theme.lfFont[FONT_CAPTION], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("SmCaptionFont"), 0, REG_BINARY, (BYTE *)&g->Theme.lfFont[FONT_SMCAPTION], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("IconFont"), 0, REG_BINARY, (BYTE *)&g->Theme.lfFont[FONT_ICON], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("MenuFont"), 0, REG_BINARY, (BYTE *)&g->Theme.lfFont[FONT_MENU], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("StatusFont"), 0, REG_BINARY, (BYTE *)&g->Theme.lfFont[FONT_INFO], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("MessageFont"), 0, REG_BINARY, (BYTE *)&g->Theme.lfFont[FONT_DIALOG], sizeof(LOGFONT));
|
||||
|
||||
/* Save size metrics to registry */
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_BORDER_X]);
|
||||
RegSetValueEx(hKey, TEXT("BorderWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_CAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("CaptionWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_CAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("CaptionHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_SMCAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("SmCaptionWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_SMCAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("SmCaptionHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_ICON_SPC_X]);
|
||||
RegSetValueEx(hKey, TEXT("IconSpacing"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_ICON_SPC_Y]);
|
||||
RegSetValueEx(hKey, TEXT("IconVerticalSpacing"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_MENU_X]);
|
||||
RegSetValueEx(hKey, TEXT("MenuWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_MENU_Y]);
|
||||
RegSetValueEx(hKey, TEXT("MenuHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_SCROLL_X]);
|
||||
RegSetValueEx(hKey, TEXT("ScrollWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * g->Theme.Size[SIZE_SCROLL_Y]);
|
||||
RegSetValueEx(hKey, TEXT("ScrollHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), g->Theme.Size[SIZE_ICON_X]);
|
||||
RegSetValueEx(hKey, TEXT("Shell Icon Sizet"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
/* Effects, save only when needed: */
|
||||
/* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
|
||||
* Just keep them in sync for now.
|
||||
*/
|
||||
g->Theme.Effects.bTooltipAnimation = g->Theme.Effects.bMenuAnimation;
|
||||
g->Theme.Effects.bTooltipFade = g->Theme.Effects.bMenuFade;
|
||||
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, g->Theme.Effects.bDragFullWindows, NULL, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
|
||||
//UPDATE_USERPREF(KEYBOARDCUES, &g->Theme.Effects.bKeyboardCues);
|
||||
//UPDATE_USERPREF(ACTIVEWINDOWTRACKING, &g->Theme.Effects.bActiveWindowTracking);
|
||||
//UPDATE_USERPREF(MENUANIMATION, &g->Theme.Effects.bMenuAnimation);
|
||||
//UPDATE_USERPREF(COMBOBOXANIMATION, &g->Theme.Effects.bComboBoxAnimation);
|
||||
//UPDATE_USERPREF(LISTBOXSMOOTHSCROLLING, &g->Theme.Effects.bListBoxSmoothScrolling);
|
||||
//UPDATE_USERPREF(GRADIENTCAPTIONS, &g->Theme.Effects.bGradientCaptions);
|
||||
//UPDATE_USERPREF(ACTIVEWNDTRKZORDER, &g->Theme.Effects.bActiveWndTrkZorder);
|
||||
//UPDATE_USERPREF(HOTTRACKING, &g->Theme.Effects.bHotTracking);
|
||||
UPDATE_USERPREF(MENUFADE, &g->Theme.Effects.bMenuFade);
|
||||
//UPDATE_USERPREF(SELECTIONFADE, &g->Theme.Effects.bSelectionFade);
|
||||
UPDATE_USERPREF(TOOLTIPANIMATION, &g->Theme.Effects.bTooltipAnimation);
|
||||
UPDATE_USERPREF(TOOLTIPFADE, &g->Theme.Effects.bTooltipFade);
|
||||
//UPDATE_USERPREF(CURSORSHADOW, &g->Theme.Effects.bCursorShadow);
|
||||
//UPDATE_USERPREF(UIEFFECTS, &g->Theme.Effects.bUiEffects);
|
||||
/* Save ThemeId */
|
||||
Result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance\\New Schemes"), 0, KEY_ALL_ACCESS, &hKey);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
lstrcpy(clText, g->ThemeTemplates[g->Theme.Id].strKeyName);
|
||||
RegSetValueEx(hKey, TEXT("SelectedStyle"), 0, REG_SZ, (BYTE *)clText, (lstrlen(clText)+1) * sizeof (TCHAR));
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static INT_PTR
|
||||
AppearancePage_OnInit(HWND hwndDlg, GLOBALS *g)
|
||||
AppearancePage_OnInit(HWND hwndDlg)
|
||||
{
|
||||
HKEY hkNewSchemes, hkScheme, hkSizes, hkSize;
|
||||
FILETIME ftLastWriteTime;
|
||||
TCHAR strSelectedStyle[4];
|
||||
DWORD dwLength, dwType;
|
||||
DWORD dwDisposition = 0;
|
||||
INT iStyle, iSize, iTemplateIndex, iListIndex = 0;
|
||||
INT Result;
|
||||
INT i, TemplateCount, iListIndex;
|
||||
HWND hwndCombo;
|
||||
GLOBALS *g;
|
||||
|
||||
g = (GLOBALS*)malloc(sizeof(GLOBALS));
|
||||
g = (GLOBALS*)LocalAlloc(LPTR, sizeof(GLOBALS));
|
||||
if (g == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g);
|
||||
|
||||
LoadCurrentTheme(g);
|
||||
LoadCurrentTheme(&g->Theme);
|
||||
g->ThemeAdv = g->Theme;
|
||||
g->bHasChanged = FALSE;
|
||||
g->hBoldFont = g->hItalicFont = NULL;
|
||||
g->hbmpColor[0] = g->hbmpColor[1] = g->hbmpColor[2] = NULL;
|
||||
g->bInitializing = FALSE;
|
||||
|
||||
/* Fill color schemes combo */
|
||||
Result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance\\New Schemes"),
|
||||
0, KEY_READ, &hkNewSchemes);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
TemplateCount = LoadThemeTemplates(strSelectedStyle);
|
||||
|
||||
hwndCombo = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME);
|
||||
g->ThemeId = -1;
|
||||
g->bInitializing = TRUE;
|
||||
for(i = 0; i < TemplateCount; i++)
|
||||
{
|
||||
/* Could not open the key, try to create it */
|
||||
Result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance\\New Schemes"), 0, NULL, 0, KEY_ALL_ACCESS, NULL,&hkNewSchemes, &dwDisposition);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
iListIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)g_ThemeTemplates[i].strLegacyName);
|
||||
SendMessage(hwndCombo, CB_SETITEMDATA, iListIndex, i);
|
||||
if (lstrcmp(g_ThemeTemplates[i].strKeyName, strSelectedStyle) == 0)
|
||||
{
|
||||
/* FIXME: We have created it new, so let's put somethig there */
|
||||
g->ThemeId = i;
|
||||
SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM)iListIndex, 0);
|
||||
}
|
||||
}
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
/* First find out the currently selected template */
|
||||
dwLength = 8;
|
||||
RegQueryValueEx(hkNewSchemes, TEXT("SelectedStyle"), NULL, &dwType, (LPBYTE)&strSelectedStyle, &dwLength);
|
||||
iTemplateIndex = 0;
|
||||
iStyle = 0;
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
while((RegEnumKeyEx(hkNewSchemes, iStyle, g->ThemeTemplates[iTemplateIndex].strKeyName, &dwLength,
|
||||
NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS) && (iTemplateIndex < MAX_TEMPLATES))
|
||||
{
|
||||
/* is it really a template or one of the other entries */
|
||||
if (dwLength < 5)
|
||||
{
|
||||
if (RegOpenKeyEx(hkNewSchemes, g->ThemeTemplates[iTemplateIndex].strKeyName, 0, KEY_READ, &hkScheme) == ERROR_SUCCESS)
|
||||
{
|
||||
if(RegOpenKeyEx(hkScheme, TEXT("Sizes"), 0, KEY_READ, &hkSizes) == ERROR_SUCCESS)
|
||||
{
|
||||
iSize = 0;
|
||||
dwLength = 3;
|
||||
while((RegEnumKeyEx(hkSizes, iSize, g->ThemeTemplates[iTemplateIndex].strSizeName, &dwLength,
|
||||
NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS) && (iSize <= 4))
|
||||
{
|
||||
if(RegOpenKeyEx(hkSizes, g->ThemeTemplates[iTemplateIndex].strSizeName, 0, KEY_READ, &hkSize) == ERROR_SUCCESS)
|
||||
{
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
RegQueryValueEx(hkSize, TEXT("DisplayName"), NULL, &dwType, (LPBYTE)&g->ThemeTemplates[iTemplateIndex].strDisplayName, &dwLength);
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
RegQueryValueEx(hkSize, TEXT("LegacyName"), NULL, &dwType, (LPBYTE)&g->ThemeTemplates[iTemplateIndex].strLegacyName, &dwLength);
|
||||
RegCloseKey(hkSize);
|
||||
}
|
||||
iListIndex = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_ADDSTRING, 0, (LPARAM)g->ThemeTemplates[iTemplateIndex].strLegacyName);
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETITEMDATA, iListIndex, iTemplateIndex);
|
||||
if (lstrcmp(g->ThemeTemplates[iTemplateIndex].strKeyName, strSelectedStyle) == 0)
|
||||
{
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)iListIndex, 0);
|
||||
}
|
||||
iSize++;
|
||||
iTemplateIndex++;
|
||||
dwLength = 3;
|
||||
}
|
||||
RegCloseKey(hkSizes);
|
||||
}
|
||||
RegCloseKey(hkScheme);
|
||||
}
|
||||
}
|
||||
iStyle++;
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
}
|
||||
RegCloseKey(hkNewSchemes);
|
||||
}
|
||||
SendMessage(GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME), LB_SETCURSEL, 0, 0);
|
||||
g->bInitializing = FALSE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static INT_PTR
|
||||
static VOID
|
||||
AppearancePage_OnDestroy(HWND hwndDlg, GLOBALS *g)
|
||||
{
|
||||
free(g);
|
||||
return TRUE;
|
||||
LocalFree(g);
|
||||
}
|
||||
|
||||
static void
|
||||
UpdateSelectedThemeId(HWND hwndDlg, GLOBALS *g)
|
||||
static INT
|
||||
GetSelectedThemeId(HWND hwndDlg)
|
||||
{
|
||||
int sel;
|
||||
sel = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETCURSEL, 0, 0);
|
||||
g->Theme.Id = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)sel, 0);
|
||||
HWND hwndCombo;
|
||||
INT sel;
|
||||
|
||||
hwndCombo = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME);
|
||||
sel = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0);
|
||||
if (sel == CB_ERR)
|
||||
return -1;
|
||||
return (INT)SendMessage(hwndCombo, CB_GETITEMDATA, (WPARAM)sel, 0);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK
|
||||
|
@ -504,76 +86,83 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
return AppearancePage_OnInit(hwndDlg, g);
|
||||
return AppearancePage_OnInit(hwndDlg);
|
||||
|
||||
case WM_DESTROY:
|
||||
return AppearancePage_OnDestroy(hwndDlg, g);
|
||||
AppearancePage_OnDestroy(hwndDlg, g);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_APPEARANCE_EFFECTS:
|
||||
DialogBoxParam(hApplet, (LPCTSTR)IDD_EFFAPPEARANCE,
|
||||
hwndDlg, EffAppearanceDlgProc, (LPARAM)g);
|
||||
|
||||
/* Was anything changed in the effects appearance dialog? */
|
||||
if (memcmp(&g->Theme, &g->ThemeAdv, sizeof(THEME)) != 0)
|
||||
if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_EFFAPPEARANCE),
|
||||
hwndDlg, EffAppearanceDlgProc, (LPARAM)g) == IDOK)
|
||||
{
|
||||
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
||||
g->Theme = g->ThemeAdv;
|
||||
g->Theme.bHasChanged = TRUE;
|
||||
g->bHasChanged = TRUE;
|
||||
g->ThemeId = -1; /* Customized */
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0);
|
||||
SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT(""));
|
||||
/* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); */
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_APPEARANCE_ADVANCED:
|
||||
DialogBoxParam(hApplet, (LPCTSTR)IDD_ADVAPPEARANCE,
|
||||
hwndDlg, AdvAppearanceDlgProc, (LPARAM)g);
|
||||
|
||||
/* Was anything changed in the advanced appearance dialog? */
|
||||
if (memcmp(&g->Theme, &g->ThemeAdv, sizeof(THEME)) != 0)
|
||||
if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_ADVAPPEARANCE),
|
||||
hwndDlg, AdvAppearanceDlgProc, (LPARAM)g) == IDOK)
|
||||
{
|
||||
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
||||
g->Theme = g->ThemeAdv;
|
||||
g->Theme.bHasChanged = TRUE;
|
||||
g->bHasChanged = TRUE;
|
||||
g->ThemeId = -1; /* Customized */
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0);
|
||||
SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT(""));
|
||||
/* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); */
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_APPEARANCE_COLORSCHEME:
|
||||
if(HIWORD(wParam) == CBN_SELCHANGE)
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE && !g->bInitializing)
|
||||
{
|
||||
THEME Theme;
|
||||
INT ThemeId = GetSelectedThemeId(hwndDlg);
|
||||
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
||||
g->Theme.bHasChanged = TRUE;
|
||||
UpdateSelectedThemeId(hwndDlg, g);
|
||||
LoadThemeFromReg(g);
|
||||
//SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, WM_PAINT, 0, 0);
|
||||
g->bHasChanged = TRUE;
|
||||
if (ThemeId != -1 && LoadThemeFromReg(&Theme, ThemeId))
|
||||
{
|
||||
g->Theme = Theme;
|
||||
g->ThemeId = ThemeId;
|
||||
/* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme); */
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
case WM_NOTIFY:
|
||||
lpnm = (LPNMHDR)lParam;
|
||||
switch (lpnm->code)
|
||||
{
|
||||
case PSN_APPLY:
|
||||
if (g->Theme.bHasChanged)
|
||||
if (g->bHasChanged)
|
||||
{
|
||||
UpdateSelectedThemeId(hwndDlg, g);
|
||||
ApplyTheme(g);
|
||||
INT ThemeId = GetSelectedThemeId(hwndDlg);
|
||||
ApplyTheme(&g->Theme, ThemeId);
|
||||
g->ThemeId = ThemeId;
|
||||
SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
|
||||
g->bHasChanged = FALSE;
|
||||
}
|
||||
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)PSNRET_NOERROR);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
case PSN_KILLACTIVE:
|
||||
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -1,113 +1,21 @@
|
|||
|
||||
/* Some definitions for appearance page */
|
||||
#define SIZE_BORDER_X 0
|
||||
#define SIZE_BORDER_Y 1
|
||||
#define SIZE_CAPTION_Y 2
|
||||
#define SIZE_ICON_X 3
|
||||
#define SIZE_ICON_Y 4
|
||||
#define SIZE_ICON_SPC_X 5
|
||||
#define SIZE_ICON_SPC_Y 6
|
||||
#define SIZE_MENU_X 7
|
||||
#define SIZE_MENU_Y 8
|
||||
#define SIZE_SCROLL_X 9
|
||||
#define SIZE_SCROLL_Y 10
|
||||
#define SIZE_SMCAPTION_Y 11
|
||||
|
||||
#define FONT_CAPTION 0
|
||||
#define FONT_SMCAPTION 1
|
||||
#define FONT_HILIGHT 2
|
||||
#define FONT_MENU 2
|
||||
#define FONT_ICON 3
|
||||
#define FONT_INFO 4
|
||||
#define FONT_DIALOG 5
|
||||
|
||||
#define NUM_ELEMENTS 22
|
||||
#define NUM_FONTS 6
|
||||
#define NUM_SIZES 13
|
||||
#define NUM_COLORS 31
|
||||
#define MAX_TEMPLATES 50
|
||||
#define MAX_COLORNAMELENGTH 30
|
||||
#define MAX_TEMPLATENAMELENTGH 80
|
||||
|
||||
/* Some typedefs for appearance */
|
||||
|
||||
/* Most (but not all) fields below correspond to HKCU\Control Panel\Desktop\UserPreferencesMask */
|
||||
typedef struct
|
||||
{
|
||||
BOOL bActiveWindowTracking;
|
||||
BOOL bMenuAnimation;
|
||||
BOOL bComboBoxAnimation;
|
||||
BOOL bListBoxSmoothScrolling;
|
||||
BOOL bGradientCaptions;
|
||||
BOOL bKeyboardCues;
|
||||
BOOL bActiveWndTrkZorder;
|
||||
BOOL bHotTracking;
|
||||
BOOL bMenuFade;
|
||||
BOOL bSelectionFade;
|
||||
BOOL bTooltipAnimation;
|
||||
BOOL bTooltipFade;
|
||||
BOOL bCursorShadow;
|
||||
BOOL bUiEffects;
|
||||
BOOL bFontSmoothing;
|
||||
BOOL bDragFullWindows;
|
||||
UINT uiFontSmoothingType;
|
||||
} EFFECTS;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
COLORREF crColor[NUM_COLORS];
|
||||
LOGFONT lfFont[NUM_FONTS];
|
||||
UINT64 Size[NUM_SIZES];
|
||||
INT Id;
|
||||
BOOL bFlatMenus;
|
||||
BOOL bHasChanged;
|
||||
BOOL bIsCustom;
|
||||
EFFECTS Effects;
|
||||
} THEME;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
TCHAR strKeyName[4];
|
||||
TCHAR strSizeName[4];
|
||||
TCHAR strDisplayName[MAX_TEMPLATENAMELENTGH];
|
||||
TCHAR strLegacyName[MAX_TEMPLATENAMELENTGH];
|
||||
INT NumSizes;
|
||||
} THEME_PRESET;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int Size;
|
||||
int Size2;
|
||||
int Color1;
|
||||
int Color2;
|
||||
int Font;
|
||||
int FontColor;
|
||||
} ASSIGNMENT;
|
||||
|
||||
/* This is the global structure used to store the current values.
|
||||
A pointer of this get's passed to the functions either directly
|
||||
or by passing hwnd and getting the pointer by GetWindowLongPtr */
|
||||
typedef struct tagGLOBALS
|
||||
{
|
||||
THEME_PRESET ThemeTemplates[MAX_TEMPLATES];
|
||||
INT ThemeId; /* Theme is customized if ThemeId == -1 */
|
||||
THEME Theme;
|
||||
THEME ThemeAdv;
|
||||
INT ColorList[NUM_COLORS];
|
||||
BOOL bHasChanged;
|
||||
HBITMAP hbmpColor[3];
|
||||
INT CurrentElement;
|
||||
COLORREF crCOLOR_BTNFACE;
|
||||
COLORREF crCOLOR_BTNSHADOW;
|
||||
COLORREF crCOLOR_BTNTEXT;
|
||||
COLORREF crCOLOR_BTNHIGHLIGHT;
|
||||
HFONT hBoldFont;
|
||||
HFONT hItalicFont;
|
||||
BOOL bInitializing;
|
||||
} GLOBALS;
|
||||
|
||||
|
||||
extern const ASSIGNMENT g_Assignment[NUM_ELEMENTS];
|
||||
extern const TCHAR g_RegColorNames[NUM_COLORS][MAX_COLORNAMELENGTH];
|
||||
extern const INT g_SizeMetric[NUM_SIZES];
|
||||
|
||||
/* prototypes for appearance.c */
|
||||
INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
|
|
|
@ -31,4 +31,6 @@
|
|||
<file>monslctl.c</file>
|
||||
<file>general.c</file>
|
||||
<file>desk.rc</file>
|
||||
<file>draw.c</file>
|
||||
<file>theme.c</file>
|
||||
</module>
|
||||
|
|
423
reactos/dll/cpl/desk/draw.c
Normal file
423
reactos/dll/cpl/desk/draw.c
Normal file
|
@ -0,0 +1,423 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS Display Control Panel
|
||||
* FILE: lib/cpl/desk/draw.c
|
||||
* PURPOSE: Providing drawing functions
|
||||
*
|
||||
* PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||
*/
|
||||
|
||||
/* #define NTOS_MODE_USER */
|
||||
/* #define WIN32_NO_STATUS */
|
||||
#include "desk.h"
|
||||
#include "theme.h"
|
||||
#include "draw.h"
|
||||
/* #include <ndk/ntndk.h> */
|
||||
/* #include <win32k/ntuser.h> */
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
static const signed char LTInnerNormal[] = {
|
||||
-1, -1, -1, -1,
|
||||
-1, COLOR_BTNHIGHLIGHT, COLOR_BTNHIGHLIGHT, -1,
|
||||
-1, COLOR_3DDKSHADOW, COLOR_3DDKSHADOW, -1,
|
||||
-1, -1, -1, -1
|
||||
};
|
||||
|
||||
static const signed char LTOuterNormal[] = {
|
||||
-1, COLOR_3DLIGHT, COLOR_BTNSHADOW, -1,
|
||||
COLOR_BTNHIGHLIGHT, COLOR_3DLIGHT, COLOR_BTNSHADOW, -1,
|
||||
COLOR_3DDKSHADOW, COLOR_3DLIGHT, COLOR_BTNSHADOW, -1,
|
||||
-1, COLOR_3DLIGHT, COLOR_BTNSHADOW, -1
|
||||
};
|
||||
|
||||
static const signed char RBInnerNormal[] = {
|
||||
-1, -1, -1, -1,
|
||||
-1, COLOR_BTNSHADOW, COLOR_BTNSHADOW, -1,
|
||||
-1, COLOR_3DLIGHT, COLOR_3DLIGHT, -1,
|
||||
-1, -1, -1, -1
|
||||
};
|
||||
|
||||
static const signed char RBOuterNormal[] = {
|
||||
-1, COLOR_3DDKSHADOW, COLOR_BTNHIGHLIGHT, -1,
|
||||
COLOR_BTNSHADOW, COLOR_3DDKSHADOW, COLOR_BTNHIGHLIGHT, -1,
|
||||
COLOR_3DLIGHT, COLOR_3DDKSHADOW, COLOR_BTNHIGHLIGHT, -1,
|
||||
-1, COLOR_3DDKSHADOW, COLOR_BTNHIGHLIGHT, -1
|
||||
};
|
||||
|
||||
static BOOL
|
||||
MyIntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags, THEME *theme)
|
||||
{
|
||||
signed char LTInnerI, LTOuterI;
|
||||
signed char RBInnerI, RBOuterI;
|
||||
HPEN LTInnerPen, LTOuterPen;
|
||||
HPEN RBInnerPen, RBOuterPen;
|
||||
RECT InnerRect = *rc;
|
||||
POINT SavePoint;
|
||||
HPEN SavePen;
|
||||
int LBpenplus = 0;
|
||||
int LTpenplus = 0;
|
||||
int RTpenplus = 0;
|
||||
int RBpenplus = 0;
|
||||
/* Init some vars */
|
||||
LTInnerPen = LTOuterPen = RBInnerPen = RBOuterPen = (HPEN)GetStockObject(NULL_PEN);
|
||||
SavePen = (HPEN)SelectObject(hdc, LTInnerPen);
|
||||
|
||||
/* Determine the colors of the edges */
|
||||
LTInnerI = LTInnerNormal[uType & (BDR_INNER|BDR_OUTER)];
|
||||
LTOuterI = LTOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
|
||||
RBInnerI = RBInnerNormal[uType & (BDR_INNER|BDR_OUTER)];
|
||||
RBOuterI = RBOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
|
||||
|
||||
if((uFlags & BF_BOTTOMLEFT) == BF_BOTTOMLEFT)
|
||||
LBpenplus = 1;
|
||||
if((uFlags & BF_TOPRIGHT) == BF_TOPRIGHT)
|
||||
RTpenplus = 1;
|
||||
if((uFlags & BF_BOTTOMRIGHT) == BF_BOTTOMRIGHT)
|
||||
RBpenplus = 1;
|
||||
if((uFlags & BF_TOPLEFT) == BF_TOPLEFT)
|
||||
LTpenplus = 1;
|
||||
|
||||
if(LTInnerI != -1)
|
||||
LTInnerPen = GetStockObject(DC_PEN);
|
||||
if(LTOuterI != -1)
|
||||
LTOuterPen = GetStockObject(DC_PEN);
|
||||
if(RBInnerI != -1)
|
||||
RBInnerPen = GetStockObject(DC_PEN);
|
||||
if(RBOuterI != -1)
|
||||
RBOuterPen = GetStockObject(DC_PEN);
|
||||
{
|
||||
HBRUSH hbr;
|
||||
hbr = CreateSolidBrush(theme->crColor[COLOR_BTNFACE]);
|
||||
FillRect(hdc, &InnerRect, hbr);
|
||||
DeleteObject(hbr);
|
||||
}
|
||||
MoveToEx(hdc, 0, 0, &SavePoint);
|
||||
|
||||
/* Draw the outer edge */
|
||||
SelectObject(hdc, LTOuterPen);
|
||||
SetDCPenColor(hdc, theme->crColor[LTOuterI]);
|
||||
if(uFlags & BF_TOP)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.left, InnerRect.top, NULL);
|
||||
LineTo(hdc, InnerRect.right, InnerRect.top);
|
||||
}
|
||||
if(uFlags & BF_LEFT)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.left, InnerRect.top, NULL);
|
||||
LineTo(hdc, InnerRect.left, InnerRect.bottom);
|
||||
}
|
||||
SelectObject(hdc, RBOuterPen);
|
||||
SetDCPenColor(hdc, theme->crColor[RBOuterI]);
|
||||
if(uFlags & BF_BOTTOM)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.left, InnerRect.bottom-1, NULL);
|
||||
LineTo(hdc, InnerRect.right, InnerRect.bottom-1);
|
||||
}
|
||||
if(uFlags & BF_RIGHT)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.right-1, InnerRect.top, NULL);
|
||||
LineTo(hdc, InnerRect.right-1, InnerRect.bottom);
|
||||
}
|
||||
|
||||
/* Draw the inner edge */
|
||||
SelectObject(hdc, LTInnerPen);
|
||||
SetDCPenColor(hdc, theme->crColor[LTInnerI]);
|
||||
if(uFlags & BF_TOP)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.left+LTpenplus, InnerRect.top+1, NULL);
|
||||
LineTo(hdc, InnerRect.right-RTpenplus, InnerRect.top+1);
|
||||
}
|
||||
if(uFlags & BF_LEFT)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.left+1, InnerRect.top+LTpenplus, NULL);
|
||||
LineTo(hdc, InnerRect.left+1, InnerRect.bottom-LBpenplus);
|
||||
}
|
||||
SelectObject(hdc, RBInnerPen);
|
||||
SetDCPenColor(hdc, theme->crColor[RBInnerI]);
|
||||
if(uFlags & BF_BOTTOM)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.left+LBpenplus, InnerRect.bottom-2, NULL);
|
||||
LineTo(hdc, InnerRect.right-RBpenplus, InnerRect.bottom-2);
|
||||
}
|
||||
if(uFlags & BF_RIGHT)
|
||||
{
|
||||
MoveToEx(hdc, InnerRect.right-2, InnerRect.top+RTpenplus, NULL);
|
||||
LineTo(hdc, InnerRect.right-2, InnerRect.bottom-RBpenplus);
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
SelectObject(hdc, SavePen);
|
||||
MoveToEx(hdc, SavePoint.x, SavePoint.y, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
MyDrawFrameButton(HDC hdc, LPRECT rc, UINT uState, THEME *theme)
|
||||
{
|
||||
UINT edge;
|
||||
if(uState & (DFCS_PUSHED | DFCS_CHECKED | DFCS_FLAT))
|
||||
edge = EDGE_SUNKEN;
|
||||
else
|
||||
edge = EDGE_RAISED;
|
||||
return MyIntDrawRectEdge(hdc, rc, edge, (uState & DFCS_FLAT) | BF_RECT | BF_SOFT, theme);
|
||||
}
|
||||
|
||||
static int
|
||||
MyMakeSquareRect(LPRECT src, LPRECT dst)
|
||||
{
|
||||
int Width = src->right - src->left;
|
||||
int Height = src->bottom - src->top;
|
||||
int SmallDiam = Width > Height ? Height : Width;
|
||||
|
||||
*dst = *src;
|
||||
|
||||
/* Make it a square box */
|
||||
if (Width < Height) /* SmallDiam == Width */
|
||||
{
|
||||
dst->top += (Height-Width)/2;
|
||||
dst->bottom = dst->top + SmallDiam;
|
||||
}
|
||||
else if(Width > Height) /* SmallDiam == Height */
|
||||
{
|
||||
dst->left += (Width-Height)/2;
|
||||
dst->right = dst->left + SmallDiam;
|
||||
}
|
||||
|
||||
return SmallDiam;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
MyDrawFrameCaption(HDC dc, LPRECT r, UINT uFlags, THEME *theme)
|
||||
{
|
||||
LOGFONT lf;
|
||||
HFONT hFont, hOldFont;
|
||||
COLORREF clrsave;
|
||||
RECT myr;
|
||||
INT bkmode;
|
||||
TCHAR Symbol;
|
||||
switch(uFlags & 0xff)
|
||||
{
|
||||
case DFCS_CAPTIONCLOSE:
|
||||
Symbol = 'r';
|
||||
break;
|
||||
case DFCS_CAPTIONHELP:
|
||||
Symbol = 's';
|
||||
break;
|
||||
case DFCS_CAPTIONMIN:
|
||||
Symbol = '0';
|
||||
break;
|
||||
case DFCS_CAPTIONMAX:
|
||||
Symbol = '1';
|
||||
break;
|
||||
case DFCS_CAPTIONRESTORE:
|
||||
Symbol = '2';
|
||||
break;
|
||||
}
|
||||
MyIntDrawRectEdge(dc, r, (uFlags & DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED, BF_RECT | BF_MIDDLE | BF_SOFT, theme);
|
||||
ZeroMemory(&lf, sizeof(LOGFONT));
|
||||
MyMakeSquareRect(r, &myr);
|
||||
myr.left += 1;
|
||||
myr.top += 1;
|
||||
myr.right -= 1;
|
||||
myr.bottom -= 1;
|
||||
if(uFlags & DFCS_PUSHED)
|
||||
OffsetRect(&myr,1,1);
|
||||
lf.lfHeight = myr.bottom - myr.top;
|
||||
lf.lfWidth = 0;
|
||||
lf.lfWeight = FW_NORMAL;
|
||||
lf.lfCharSet = DEFAULT_CHARSET;
|
||||
lstrcpy(lf.lfFaceName, TEXT("Marlett"));
|
||||
hFont = CreateFontIndirect(&lf);
|
||||
/* save font and text color */
|
||||
hOldFont = SelectObject(dc, hFont);
|
||||
clrsave = GetTextColor(dc);
|
||||
bkmode = GetBkMode(dc);
|
||||
/* set color and drawing mode */
|
||||
SetBkMode(dc, TRANSPARENT);
|
||||
if(uFlags & DFCS_INACTIVE)
|
||||
{
|
||||
/* draw shadow */
|
||||
SetTextColor(dc, theme->crColor[COLOR_BTNHIGHLIGHT]);
|
||||
TextOut(dc, myr.left + 1, myr.top + 1, &Symbol, 1);
|
||||
}
|
||||
SetTextColor(dc, theme->crColor[(uFlags & DFCS_INACTIVE) ? COLOR_BTNSHADOW : COLOR_BTNTEXT]);
|
||||
/* draw selected symbol */
|
||||
TextOut(dc, myr.left, myr.top, &Symbol, 1);
|
||||
/* restore previous settings */
|
||||
SetTextColor(dc, clrsave);
|
||||
SelectObject(dc, hOldFont);
|
||||
SetBkMode(dc, bkmode);
|
||||
DeleteObject(hFont);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
static BOOL
|
||||
MyDrawFrameScroll(HDC dc, LPRECT r, UINT uFlags, THEME *theme)
|
||||
{
|
||||
LOGFONT lf;
|
||||
HFONT hFont, hOldFont;
|
||||
COLORREF clrsave;
|
||||
RECT myr;
|
||||
INT bkmode;
|
||||
TCHAR Symbol;
|
||||
switch(uFlags & 0xff)
|
||||
{
|
||||
case DFCS_SCROLLCOMBOBOX:
|
||||
case DFCS_SCROLLDOWN:
|
||||
Symbol = '6';
|
||||
break;
|
||||
|
||||
case DFCS_SCROLLUP:
|
||||
Symbol = '5';
|
||||
break;
|
||||
|
||||
case DFCS_SCROLLLEFT:
|
||||
Symbol = '3';
|
||||
break;
|
||||
|
||||
case DFCS_SCROLLRIGHT:
|
||||
Symbol = '4';
|
||||
break;
|
||||
}
|
||||
MyIntDrawRectEdge(dc, r, (uFlags & DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED, (uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT, theme);
|
||||
ZeroMemory(&lf, sizeof(LOGFONT));
|
||||
MyMakeSquareRect(r, &myr);
|
||||
myr.left += 1;
|
||||
myr.top += 1;
|
||||
myr.right -= 1;
|
||||
myr.bottom -= 1;
|
||||
if(uFlags & DFCS_PUSHED)
|
||||
OffsetRect(&myr,1,1);
|
||||
lf.lfHeight = myr.bottom - myr.top;
|
||||
lf.lfWidth = 0;
|
||||
lf.lfWeight = FW_NORMAL;
|
||||
lf.lfCharSet = DEFAULT_CHARSET;
|
||||
lstrcpy(lf.lfFaceName, TEXT("Marlett"));
|
||||
hFont = CreateFontIndirect(&lf);
|
||||
/* save font and text color */
|
||||
hOldFont = SelectObject(dc, hFont);
|
||||
clrsave = GetTextColor(dc);
|
||||
bkmode = GetBkMode(dc);
|
||||
/* set color and drawing mode */
|
||||
SetBkMode(dc, TRANSPARENT);
|
||||
if(uFlags & DFCS_INACTIVE)
|
||||
{
|
||||
/* draw shadow */
|
||||
SetTextColor(dc, theme->crColor[COLOR_BTNHIGHLIGHT]);
|
||||
TextOut(dc, myr.left + 1, myr.top + 1, &Symbol, 1);
|
||||
}
|
||||
SetTextColor(dc, theme->crColor[(uFlags & DFCS_INACTIVE) ? COLOR_BTNSHADOW : COLOR_BTNTEXT]);
|
||||
/* draw selected symbol */
|
||||
TextOut(dc, myr.left, myr.top, &Symbol, 1);
|
||||
/* restore previous settings */
|
||||
SetTextColor(dc, clrsave);
|
||||
SelectObject(dc, hOldFont);
|
||||
SetBkMode(dc, bkmode);
|
||||
DeleteObject(hFont);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
MyDrawFrameControl(HDC hDC, LPRECT rc, UINT uType, UINT uState, THEME *theme)
|
||||
{
|
||||
switch(uType)
|
||||
{
|
||||
case DFC_BUTTON:
|
||||
return MyDrawFrameButton(hDC, rc, uState, theme);
|
||||
case DFC_CAPTION:
|
||||
return MyDrawFrameCaption(hDC, rc, uState, theme);
|
||||
case DFC_SCROLL:
|
||||
return MyDrawFrameScroll(hDC, rc, uState, theme);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
MyDrawEdge(HDC hDC, LPRECT rc, UINT edge, UINT flags, THEME *theme)
|
||||
{
|
||||
return MyIntDrawRectEdge(hDC, rc, edge, flags, theme);
|
||||
}
|
||||
|
||||
VOID
|
||||
MyDrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x, THEME *theme)
|
||||
{
|
||||
RECT rc3;
|
||||
RECT rc4;
|
||||
RECT rc5;
|
||||
|
||||
rc3.left = lpRect->right - 2 - x;
|
||||
rc3.top = lpRect->top + 2;
|
||||
rc3.right = lpRect->right - 2;
|
||||
rc3.bottom = lpRect->bottom - 2;
|
||||
|
||||
MyDrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE, theme);
|
||||
|
||||
if (bMinMax)
|
||||
{
|
||||
rc4.left = rc3.left - x - 2;
|
||||
rc4.top = rc3.top;
|
||||
rc4.right = rc3.right - x - 2;
|
||||
rc4.bottom = rc3.bottom;
|
||||
|
||||
MyDrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX, theme);
|
||||
|
||||
rc5.left = rc4.left - x;
|
||||
rc5.top = rc4.top;
|
||||
rc5.right = rc4.right - x;
|
||||
rc5.bottom = rc4.bottom;
|
||||
|
||||
MyDrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN, theme);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
MyDrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar, THEME *theme)
|
||||
{
|
||||
RECT rcTop;
|
||||
RECT rcBottom;
|
||||
RECT rcMiddle;
|
||||
int width;
|
||||
|
||||
width = rc->right - rc->left;
|
||||
|
||||
rcTop.left = rc->left;
|
||||
rcTop.right = rc->right;
|
||||
rcTop.top = rc->top;
|
||||
rcTop.bottom = rc->top + width;
|
||||
|
||||
rcMiddle.left = rc->left;
|
||||
rcMiddle.right = rc->right;
|
||||
rcMiddle.top = rc->top + width;
|
||||
rcMiddle.bottom = rc->bottom - width;
|
||||
|
||||
rcBottom.left = rc->left;
|
||||
rcBottom.right = rc->right;
|
||||
rcBottom.top = rc->bottom - width;
|
||||
rcBottom.bottom = rc->bottom;
|
||||
|
||||
MyDrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP, theme);
|
||||
MyDrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN, theme);
|
||||
|
||||
FillRect(hdc, &rcMiddle, hbrScrollbar);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
BOOL
|
||||
MyDrawCaptionTemp(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags, THEME *theme)
|
||||
{
|
||||
/* FIXME */
|
||||
return DrawCaptionTemp(hwnd, hdc, rect, hFont, hIcon, str, uFlags);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
DWORD
|
||||
MyDrawMenuBarTemp(HWND Wnd, HDC DC, LPRECT Rect, HMENU Menu, HFONT Font, THEME *theme)
|
||||
{
|
||||
/* FIXME */
|
||||
return DrawMenuBarTemp(Wnd, DC, Rect, Menu, Font);
|
||||
}
|
12
reactos/dll/cpl/desk/draw.h
Normal file
12
reactos/dll/cpl/desk/draw.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
BOOL
|
||||
MyDrawFrameControl(HDC hDC, LPRECT rc, UINT uType, UINT uState, THEME *theme);
|
||||
BOOL
|
||||
MyDrawEdge(HDC hDC, LPRECT rc, UINT edge, UINT flags, THEME *theme);
|
||||
VOID
|
||||
MyDrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x, THEME *theme);
|
||||
VOID
|
||||
MyDrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar, THEME *theme);
|
||||
BOOL
|
||||
MyDrawCaptionTemp(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags, THEME *theme);
|
||||
DWORD
|
||||
MyDrawMenuBarTemp(HWND Wnd, HDC DC, LPRECT Rect, HMENU Menu, HFONT Font, THEME *theme);
|
|
@ -4,11 +4,12 @@
|
|||
* FILE: dll/cpl/desk/effappdlg.c
|
||||
* PURPOSE: Effects appearance dialog
|
||||
*
|
||||
* PROGRAMMER: Jan Roeloffzen (jroeloffzen[at]hotmail[dot]com)
|
||||
* PROGRAMMER: Jan Roeloffzen (jroeloffzen[at]hotmail[dot]com)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "desk.h"
|
||||
#include "theme.h"
|
||||
#include "appearance.h"
|
||||
|
||||
/* Update all the controls with the current values for the selected screen element */
|
||||
|
|
|
@ -7,7 +7,9 @@
|
|||
*/
|
||||
|
||||
#include "desk.h"
|
||||
#include "theme.h"
|
||||
#include "preview.h"
|
||||
#include "draw.h"
|
||||
|
||||
static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
|
||||
|
||||
|
@ -15,7 +17,7 @@ typedef struct _PREVIEW_DATA
|
|||
{
|
||||
HWND hwndParent;
|
||||
|
||||
DWORD clrSysColor[COLOR_MENUBAR];
|
||||
THEME Theme;
|
||||
|
||||
HBRUSH hbrScrollbar;
|
||||
HBRUSH hbrDesktop;
|
||||
|
@ -58,10 +60,6 @@ typedef struct _PREVIEW_DATA
|
|||
LPTSTR lpMessText;
|
||||
LPTSTR lpButText;
|
||||
|
||||
LOGFONT lfCaptionFont;
|
||||
LOGFONT lfMenuFont;
|
||||
LOGFONT lfMessageFont;
|
||||
|
||||
HFONT hCaptionFont;
|
||||
HFONT hMenuFont;
|
||||
HFONT hMessageFont;
|
||||
|
@ -71,109 +69,48 @@ typedef struct _PREVIEW_DATA
|
|||
} PREVIEW_DATA, *PPREVIEW_DATA;
|
||||
|
||||
|
||||
|
||||
static VOID
|
||||
DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x)
|
||||
static VOID UpdatePreviewTheme(HWND hwnd, PPREVIEW_DATA pPreviewData, THEME *theme)
|
||||
{
|
||||
RECT rc3;
|
||||
RECT rc4;
|
||||
RECT rc5;
|
||||
if (pPreviewData->hbrScrollbar != NULL)
|
||||
DeleteObject(pPreviewData->hbrScrollbar);
|
||||
pPreviewData->hbrScrollbar = CreateSolidBrush(theme->crColor[COLOR_SCROLLBAR]);
|
||||
if (pPreviewData->hbrDesktop != NULL)
|
||||
DeleteObject(pPreviewData->hbrDesktop);
|
||||
pPreviewData->hbrDesktop = CreateSolidBrush(theme->crColor[COLOR_DESKTOP]);
|
||||
if (pPreviewData->hbrWindow != NULL)
|
||||
DeleteObject(pPreviewData->hbrWindow);
|
||||
pPreviewData->hbrWindow = CreateSolidBrush(theme->crColor[COLOR_WINDOW]);
|
||||
|
||||
rc3.left = lpRect->right - 2 - x;
|
||||
rc3.top = lpRect->top + 2;
|
||||
rc3.right = lpRect->right - 2;
|
||||
rc3.bottom = lpRect->bottom - 2;
|
||||
pPreviewData->cxEdge = theme->Size[SIZE_EDGE_X] - 2; /* SM_CXEDGE */
|
||||
pPreviewData->cyEdge = theme->Size[SIZE_EDGE_Y] - 2; /* SM_CYEDGE */
|
||||
|
||||
DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);
|
||||
pPreviewData->cySizeFrame = theme->Size[SIZE_FRAME_Y] - 1; /* SM_CYSIZEFRAME */
|
||||
|
||||
if (bMinMax)
|
||||
{
|
||||
rc4.left = rc3.left - x - 2;
|
||||
rc4.top = rc3.top;
|
||||
rc4.right = rc3.right - x - 2;
|
||||
rc4.bottom = rc3.bottom;
|
||||
pPreviewData->cyCaption = theme->Size[SIZE_CAPTION_Y]; /* SM_CYCAPTION */
|
||||
pPreviewData->cyMenu = theme->Size[SIZE_MENU_Y]; /* SM_CYMENU */
|
||||
pPreviewData->cxScrollbar = theme->Size[SIZE_SCROLL_X]; /* SM_CXVSCROLL */
|
||||
pPreviewData->cyBorder = theme->Size[SIZE_BORDER_Y]; /* SM_CYBORDER */
|
||||
|
||||
DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);
|
||||
if (pPreviewData->hCaptionFont != NULL)
|
||||
DeleteObject(pPreviewData->hCaptionFont);
|
||||
pPreviewData->hCaptionFont = CreateFontIndirect(&theme->lfFont[FONT_CAPTION]);
|
||||
|
||||
rc5.left = rc4.left - x;
|
||||
rc5.top = rc4.top;
|
||||
rc5.right = rc4.right - x;
|
||||
rc5.bottom = rc4.bottom;
|
||||
if (pPreviewData->hMenuFont != NULL)
|
||||
DeleteObject(pPreviewData->hMenuFont);
|
||||
pPreviewData->hMenuFont = CreateFontIndirect(&theme->lfFont[FONT_MENU]);
|
||||
|
||||
DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);
|
||||
}
|
||||
if (pPreviewData->hMessageFont != NULL)
|
||||
DeleteObject(pPreviewData->hMessageFont);
|
||||
pPreviewData->hMessageFont = CreateFontIndirect(&theme->lfFont[FONT_DIALOG]);
|
||||
|
||||
pPreviewData->Theme = *theme;
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
}
|
||||
|
||||
|
||||
static VOID
|
||||
DrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar)
|
||||
{
|
||||
RECT rcTop;
|
||||
RECT rcBottom;
|
||||
RECT rcMiddle;
|
||||
int width;
|
||||
|
||||
width = rc->right - rc->left;
|
||||
|
||||
rcTop.left = rc->left;
|
||||
rcTop.right = rc->right;
|
||||
rcTop.top = rc->top;
|
||||
rcTop.bottom = rc->top + width;
|
||||
|
||||
rcMiddle.left = rc->left;
|
||||
rcMiddle.right = rc->right;
|
||||
rcMiddle.top = rc->top + width;
|
||||
rcMiddle.bottom = rc->bottom - width;
|
||||
|
||||
rcBottom.left = rc->left;
|
||||
rcBottom.right = rc->right;
|
||||
rcBottom.top = rc->bottom - width;
|
||||
rcBottom.bottom = rc->bottom;
|
||||
|
||||
DrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP);
|
||||
DrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN);
|
||||
|
||||
FillRect(hdc, &rcMiddle, hbrScrollbar);
|
||||
}
|
||||
|
||||
|
||||
static VOID
|
||||
OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
||||
{
|
||||
NONCLIENTMETRICS NonClientMetrics;
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < COLOR_MENUBAR + 1; i++)
|
||||
{
|
||||
pPreviewData->clrSysColor[i] = GetSysColor(i);
|
||||
}
|
||||
|
||||
pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
|
||||
pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
|
||||
pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
|
||||
|
||||
pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE) - 2;
|
||||
pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE) - 2;
|
||||
|
||||
pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME) - 1;
|
||||
|
||||
pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
|
||||
pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
|
||||
pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
|
||||
pPreviewData->cyBorder = GetSystemMetrics(SM_CYBORDER);
|
||||
|
||||
/* load font info */
|
||||
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
|
||||
pPreviewData->lfCaptionFont = NonClientMetrics.lfCaptionFont;
|
||||
pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
|
||||
|
||||
pPreviewData->lfMenuFont = NonClientMetrics.lfMenuFont;
|
||||
pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
|
||||
|
||||
pPreviewData->lfMessageFont = NonClientMetrics.lfMessageFont;
|
||||
pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
|
||||
THEME *theme;
|
||||
|
||||
/* Load and modify the menu */
|
||||
pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
|
||||
|
@ -191,6 +128,11 @@ OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
|||
AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);
|
||||
AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);
|
||||
AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);
|
||||
|
||||
theme = &pPreviewData->Theme;
|
||||
LoadCurrentTheme(theme);
|
||||
|
||||
UpdatePreviewTheme(hwnd, pPreviewData, theme);
|
||||
}
|
||||
|
||||
|
||||
|
@ -302,21 +244,6 @@ OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)
|
|||
CalculateItemSize(pPreviewData);
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
#if _UNICODE
|
||||
typedef BOOL (WINAPI * DCT_PROC)(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags);
|
||||
#define DCT_ORD 178
|
||||
#else
|
||||
typedef BOOL (WINAPI * DCT_PROC)(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCSTR str, UINT uFlags);
|
||||
#define DCT_ORD 177
|
||||
#endif
|
||||
|
||||
typedef DWORD (WINAPI * DMBT_PROC)(HWND hwnd, HDC hDC, LPRECT lprect, HMENU hMenu, HFONT hFont);
|
||||
#define DMBT_ORD 186
|
||||
|
||||
#endif
|
||||
|
||||
static VOID
|
||||
OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
||||
{
|
||||
|
@ -324,19 +251,9 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
|||
HFONT hOldFont;
|
||||
HDC hdc;
|
||||
RECT rc;
|
||||
THEME *theme;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
DCT_PROC DrawCaptionTemp;
|
||||
DMBT_PROC DrawMenuBarTemp;
|
||||
HMODULE hUser32;
|
||||
|
||||
hUser32 = LoadLibrary(_T("user32.dll"));
|
||||
if(hUser32 == NULL)
|
||||
return;
|
||||
|
||||
DrawCaptionTemp = (DCT_PROC)GetProcAddress(hUser32, (LPCSTR)DCT_ORD);
|
||||
DrawMenuBarTemp = (DMBT_PROC)GetProcAddress(hUser32, (LPCSTR)DMBT_ORD);
|
||||
#endif
|
||||
theme = &pPreviewData->Theme;
|
||||
|
||||
hdc = BeginPaint(hwnd, &ps);
|
||||
|
||||
|
@ -344,47 +261,47 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
|||
FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
|
||||
|
||||
/* Inactive Window */
|
||||
DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
||||
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_INACTIVECAPTIONTEXT]);
|
||||
MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
|
||||
SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]);
|
||||
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont,
|
||||
NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
|
||||
DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
|
||||
MyDrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2, theme);
|
||||
|
||||
/* Active Window */
|
||||
DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
||||
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_CAPTIONTEXT]);
|
||||
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
|
||||
NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
|
||||
DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2);
|
||||
MyDrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
|
||||
SetTextColor(hdc, theme->crColor[COLOR_CAPTIONTEXT]);
|
||||
MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
|
||||
NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, theme);
|
||||
MyDrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2, theme);
|
||||
|
||||
/* Draw the menu bar */
|
||||
DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
|
||||
pPreviewData->hMenu,
|
||||
pPreviewData->hMenuFont);
|
||||
MyDrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
|
||||
pPreviewData->hMenu,
|
||||
pPreviewData->hMenuFont, theme);
|
||||
|
||||
/* Draw the client area */
|
||||
CopyRect(&rc, &pPreviewData->rcActiveClient);
|
||||
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
|
||||
MyDrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST, theme);
|
||||
FillRect(hdc, &rc, pPreviewData->hbrWindow);
|
||||
|
||||
/* Draw the client text */
|
||||
CopyRect(&rc, &pPreviewData->rcActiveClient);
|
||||
rc.left += 4;
|
||||
rc.top += 2;
|
||||
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOWTEXT]);
|
||||
hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont);
|
||||
SetTextColor(hdc, theme->crColor[COLOR_WINDOWTEXT]);
|
||||
hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont); /* FIXME: client text is not caption text */
|
||||
DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
|
||||
SelectObject(hdc, hOldFont);
|
||||
|
||||
/* Draw the scroll bar */
|
||||
DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);
|
||||
MyDrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar, theme);
|
||||
|
||||
/* Dialog Window */
|
||||
DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
||||
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOW]);
|
||||
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
|
||||
NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
|
||||
DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2);
|
||||
MyDrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
|
||||
SetTextColor(hdc, theme->crColor[COLOR_WINDOW]);
|
||||
MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
|
||||
NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, theme);
|
||||
MyDrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2, theme);
|
||||
|
||||
/* Draw the dialog text */
|
||||
CopyRect(&rc, &pPreviewData->rcDialogClient);
|
||||
|
@ -396,9 +313,9 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
|||
SelectObject(hdc, hOldFont);
|
||||
|
||||
/* Draw Button */
|
||||
DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
|
||||
MyDrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH, theme);
|
||||
CopyRect(&rc, &pPreviewData->rcDialogButton);
|
||||
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_BTNTEXT]);
|
||||
SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]);
|
||||
hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
|
||||
DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
|
||||
SelectObject(hdc, hOldFont);
|
||||
|
@ -575,60 +492,14 @@ PreviewWndProc(HWND hwnd,
|
|||
}
|
||||
break;
|
||||
|
||||
case PVM_SETCAPTIONFONT:
|
||||
CopyMemory(&pPreviewData->lfCaptionFont, (LOGFONT*)lParam, sizeof(LOGFONT));
|
||||
DeleteObject(pPreviewData->hCaptionFont);
|
||||
pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
|
||||
CalculateItemSize(pPreviewData);
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
break;
|
||||
|
||||
case PVM_SETMENUFONT:
|
||||
CopyMemory(&pPreviewData->lfMenuFont, (LOGFONT*)lParam, sizeof(LOGFONT));
|
||||
DeleteObject(pPreviewData->hMenuFont);
|
||||
pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
|
||||
CalculateItemSize(pPreviewData);
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
break;
|
||||
|
||||
case PVM_SETDIALOGFONT:
|
||||
CopyMemory(&pPreviewData->lfMessageFont, (LOGFONT*)lParam, sizeof(LOGFONT));
|
||||
DeleteObject(pPreviewData->hMessageFont);
|
||||
pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
|
||||
CalculateItemSize(pPreviewData);
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
break;
|
||||
|
||||
case PVM_SETCOLOR:
|
||||
pPreviewData->clrSysColor[(INT)wParam] = (DWORD)lParam;
|
||||
switch((INT)wParam)
|
||||
{
|
||||
case COLOR_SCROLLBAR:
|
||||
DeleteObject(pPreviewData->hbrScrollbar);
|
||||
pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
|
||||
break;
|
||||
|
||||
case COLOR_DESKTOP:
|
||||
DeleteObject(pPreviewData->hbrDesktop);
|
||||
pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
|
||||
break;
|
||||
|
||||
case COLOR_WINDOW:
|
||||
DeleteObject(pPreviewData->hbrWindow);
|
||||
pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
|
||||
break;
|
||||
}
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
case PVM_UPDATETHEME:
|
||||
UpdatePreviewTheme(hwnd, pPreviewData, (THEME *)lParam);
|
||||
break;
|
||||
|
||||
default:
|
||||
DefWindowProc(hwnd,
|
||||
uMsg,
|
||||
wParam,
|
||||
lParam);
|
||||
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -651,6 +522,5 @@ RegisterPreviewControl(IN HINSTANCE hInstance)
|
|||
VOID
|
||||
UnregisterPreviewControl(IN HINSTANCE hInstance)
|
||||
{
|
||||
UnregisterClass(szPreviewWndClass,
|
||||
hInstance);
|
||||
UnregisterClass(szPreviewWndClass, hInstance);
|
||||
}
|
||||
|
|
|
@ -35,11 +35,7 @@
|
|||
#define PVM_GETCYSIZEFRAME (WM_USER+7)
|
||||
#define PVM_SETCYSIZEFRAME (WM_USER+8)
|
||||
|
||||
#define PVM_SETCAPTIONFONT (WM_USER+9)
|
||||
#define PVM_SETMENUFONT (WM_USER+10)
|
||||
#define PVM_SETDIALOGFONT (WM_USER+11)
|
||||
|
||||
#define PVM_SETCOLOR (WM_USER+12)
|
||||
#define PVM_UPDATETHEME (WM_USER+13)
|
||||
|
||||
BOOL RegisterPreviewControl(IN HINSTANCE hInstance);
|
||||
VOID UnregisterPreviewControl(IN HINSTANCE hInstance);
|
||||
|
|
413
reactos/dll/cpl/desk/theme.c
Normal file
413
reactos/dll/cpl/desk/theme.c
Normal file
|
@ -0,0 +1,413 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS Display Control Panel
|
||||
* FILE: lib/cpl/desk/theme.c
|
||||
* PURPOSE: Handling themes
|
||||
*
|
||||
* PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||
*/
|
||||
|
||||
#include "desk.h"
|
||||
#include "theme.h"
|
||||
|
||||
static BOOL g_TemplateLoaded = FALSE;
|
||||
static INT g_TemplateCount = 0;
|
||||
|
||||
static INT g_ColorList[NUM_COLORS];
|
||||
|
||||
static const TCHAR g_CPColors[] = TEXT("Control Panel\\Colors");
|
||||
static const TCHAR g_CPANewSchemes[] = TEXT("Control Panel\\Appearance\\New Schemes");
|
||||
static const TCHAR g_SelectedStyle[] = TEXT("SelectedStyle");
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
THEME_PRESET g_ThemeTemplates[MAX_TEMPLATES];
|
||||
|
||||
/* This is the list of names for the colors stored in the registry */
|
||||
const TCHAR g_RegColorNames[NUM_COLORS][MAX_COLORNAMELENGTH] =
|
||||
{TEXT("Scrollbar"), /* 00 = COLOR_SCROLLBAR */
|
||||
TEXT("Background"), /* 01 = COLOR_DESKTOP */
|
||||
TEXT("ActiveTitle"), /* 02 = COLOR_ACTIVECAPTION */
|
||||
TEXT("InactiveTitle"), /* 03 = COLOR_INACTIVECAPTION */
|
||||
TEXT("Menu"), /* 04 = COLOR_MENU */
|
||||
TEXT("Window"), /* 05 = COLOR_WINDOW */
|
||||
TEXT("WindowFrame"), /* 06 = COLOR_WINDOWFRAME */
|
||||
TEXT("MenuText"), /* 07 = COLOR_MENUTEXT */
|
||||
TEXT("WindowText"), /* 08 = COLOR_WINDOWTEXT */
|
||||
TEXT("TitleText"), /* 09 = COLOR_CAPTIONTEXT */
|
||||
TEXT("ActiveBorder"), /* 10 = COLOR_ACTIVEBORDER */
|
||||
TEXT("InactiveBorder"), /* 11 = COLOR_INACTIVEBORDER */
|
||||
TEXT("AppWorkSpace"), /* 12 = COLOR_APPWORKSPACE */
|
||||
TEXT("Hilight"), /* 13 = COLOR_HIGHLIGHT */
|
||||
TEXT("HilightText"), /* 14 = COLOR_HIGHLIGHTTEXT */
|
||||
TEXT("ButtonFace"), /* 15 = COLOR_BTNFACE */
|
||||
TEXT("ButtonShadow"), /* 16 = COLOR_BTNSHADOW */
|
||||
TEXT("GrayText"), /* 17 = COLOR_GRAYTEXT */
|
||||
TEXT("ButtonText"), /* 18 = COLOR_BTNTEXT */
|
||||
TEXT("InactiveTitleText"), /* 19 = COLOR_INACTIVECAPTIONTEXT */
|
||||
TEXT("ButtonHilight"), /* 20 = COLOR_BTNHIGHLIGHT */
|
||||
TEXT("ButtonDkShadow"), /* 21 = COLOR_3DDKSHADOW */
|
||||
TEXT("ButtonLight"), /* 22 = COLOR_3DLIGHT */
|
||||
TEXT("InfoText"), /* 23 = COLOR_INFOTEXT */
|
||||
TEXT("InfoWindow"), /* 24 = COLOR_INFOBK */
|
||||
TEXT("ButtonAlternateFace"), /* 25 = COLOR_ALTERNATEBTNFACE */
|
||||
TEXT("HotTrackingColor"), /* 26 = COLOR_HOTLIGHT */
|
||||
TEXT("GradientActiveTitle"), /* 27 = COLOR_GRADIENTACTIVECAPTION */
|
||||
TEXT("GradientInactiveTitle"), /* 28 = COLOR_GRADIENTINACTIVECAPTION */
|
||||
TEXT("MenuHilight"), /* 29 = COLOR_MENUHILIGHT */
|
||||
TEXT("MenuBar"), /* 30 = COLOR_MENUBAR */
|
||||
};
|
||||
|
||||
/* This is the list of used metrics and their numbers */
|
||||
const int g_SizeMetric[NUM_SIZES] =
|
||||
{
|
||||
SM_CXBORDER, /* 00: SIZE_BORDER_X */
|
||||
SM_CYBORDER, /* 01: SIZE_BORDER_Y */
|
||||
SM_CYCAPTION, /* 02: SIZE_CAPTION_Y */
|
||||
SM_CXICON, /* 03: SIZE_ICON_X */
|
||||
SM_CYICON, /* 04: SIZE_ICON_Y */
|
||||
SM_CXICONSPACING, /* 05: SIZE_ICON_SPC_X */
|
||||
SM_CYICONSPACING, /* 06: SIZE_ICON_SPC_Y */
|
||||
SM_CXMENUSIZE, /* 07: SIZE_MENU_SIZE_X */
|
||||
SM_CYMENU, /* 08: SIZE_MENU_Y */
|
||||
SM_CXVSCROLL, /* 09: SIZE_SCROLL_X */
|
||||
SM_CYHSCROLL, /* 10: SIZE_SCROLL_Y */
|
||||
SM_CYSMCAPTION, /* 11: SIZE_SMCAPTION_Y */
|
||||
SM_CXEDGE, /* 12: SIZE_EDGE_X */
|
||||
SM_CYEDGE, /* 13: SIZE_EDGE_Y */
|
||||
SM_CYSIZEFRAME, /* 14: SIZE_FRAME_Y */
|
||||
SM_CXMENUCHECK, /* 15: SIZE_MENU_CHECK_X */
|
||||
SM_CYMENUCHECK, /* 16: SIZE_MENU_CHECK_Y */
|
||||
SM_CYMENUSIZE, /* 17: SIZE_MENU_SIZE_Y */
|
||||
SM_CXSIZE, /* 18: SIZE_SIZE_X */
|
||||
SM_CYSIZE /* 19: SIZE_SIZE_Y */
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
VOID LoadCurrentTheme(THEME* theme)
|
||||
{
|
||||
INT i;
|
||||
NONCLIENTMETRICS NonClientMetrics;
|
||||
|
||||
/* Load colors */
|
||||
for (i = 0; i < NUM_COLORS; i++)
|
||||
{
|
||||
g_ColorList[i] = i;
|
||||
theme->crColor[i] = (COLORREF)GetSysColor(i);
|
||||
}
|
||||
|
||||
/* Load sizes */
|
||||
for (i = 0; i < NUM_SIZES; i++)
|
||||
{
|
||||
theme->Size[i] = GetSystemMetrics(g_SizeMetric[i]);
|
||||
}
|
||||
|
||||
/* Load fonts */
|
||||
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
theme->lfFont[FONT_CAPTION] = NonClientMetrics.lfCaptionFont;
|
||||
theme->lfFont[FONT_SMCAPTION] = NonClientMetrics.lfSmCaptionFont;
|
||||
theme->lfFont[FONT_MENU] = NonClientMetrics.lfMenuFont;
|
||||
theme->lfFont[FONT_INFO] = NonClientMetrics.lfStatusFont;
|
||||
theme->lfFont[FONT_DIALOG] = NonClientMetrics.lfMessageFont;
|
||||
SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &theme->lfFont[FONT_ICON], 0);
|
||||
|
||||
/* Effects */
|
||||
/* "Use the following transition effect for menus and tooltips" */
|
||||
SystemParametersInfo(SPI_GETMENUANIMATION, sizeof(BOOL), &theme->Effects.bMenuAnimation, 0);
|
||||
SystemParametersInfo(SPI_GETMENUFADE, sizeof(BOOL), &theme->Effects.bMenuFade, 0);
|
||||
/* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
|
||||
* Just keep them in sync for now:
|
||||
*/
|
||||
theme->Effects.bTooltipAnimation = theme->Effects.bMenuAnimation;
|
||||
theme->Effects.bTooltipFade = theme->Effects.bMenuFade;
|
||||
|
||||
/* show content of windows during dragging */
|
||||
//SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, theme->Effects.bDragFullWindows, NULL, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
|
||||
SystemParametersInfoW(SPI_GETDRAGFULLWINDOWS, 0, &theme->Effects.bDragFullWindows, 0);
|
||||
|
||||
/* "Hide underlined letters for keyboard navigation until I press the Alt key" */
|
||||
SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &theme->Effects.bKeyboardCues, 0);
|
||||
}
|
||||
|
||||
BOOL LoadThemeFromReg(THEME* theme, INT ThemeId)
|
||||
{
|
||||
INT i;
|
||||
TCHAR strSelectedStyle[4];
|
||||
TCHAR strSizeName[20] = {TEXT("Sizes\\0")};
|
||||
TCHAR strValueName[10];
|
||||
HKEY hkNewSchemes, hkScheme, hkSize;
|
||||
DWORD dwType, dwLength;
|
||||
BOOL Ret = FALSE;
|
||||
|
||||
if (!g_TemplateLoaded)
|
||||
LoadThemeTemplates(strSelectedStyle);
|
||||
|
||||
if (ThemeId == -1)
|
||||
return FALSE;
|
||||
|
||||
if (RegOpenKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, KEY_READ, &hkNewSchemes) == ERROR_SUCCESS)
|
||||
{
|
||||
if (RegOpenKeyEx(hkNewSchemes, g_ThemeTemplates[ThemeId].strKeyName, 0, KEY_READ, &hkScheme) == ERROR_SUCCESS)
|
||||
{
|
||||
lstrcpyn(&strSizeName[6], g_ThemeTemplates[ThemeId].strSizeName, 3);
|
||||
if (RegOpenKeyEx(hkScheme, strSizeName, 0, KEY_READ, &hkSize) == ERROR_SUCCESS)
|
||||
{
|
||||
Ret = TRUE;
|
||||
|
||||
dwLength = sizeof(DWORD);
|
||||
if (RegQueryValueEx(hkSize, TEXT("FlatMenus"), NULL, &dwType, (LPBYTE)&theme->bFlatMenus, &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_DWORD)
|
||||
{
|
||||
/* Failed to read registry value */
|
||||
theme->bFlatMenus = FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_COLORS; i++)
|
||||
{
|
||||
wsprintf(strValueName, TEXT("Color #%d"), i);
|
||||
dwLength = sizeof(COLORREF);
|
||||
if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&theme->crColor[i], &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_DWORD)
|
||||
{
|
||||
/* Failed to read registry value, initialize with current setting for now */
|
||||
theme->crColor[i] = GetSysColor(i);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_FONTS; i++)
|
||||
{
|
||||
wsprintf(strValueName, TEXT("Font #%d"), i);
|
||||
dwLength = sizeof(LOGFONT);
|
||||
if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&theme->lfFont[i], &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_BINARY || dwLength != sizeof(LOGFONT))
|
||||
{
|
||||
/* Failed to read registry value */
|
||||
Ret = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_SIZES; i++)
|
||||
{
|
||||
wsprintf(strValueName, TEXT("Size #%d"), i);
|
||||
dwLength = sizeof(UINT64);
|
||||
if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&theme->Size[i], &dwLength) != ERROR_SUCCESS ||
|
||||
dwType != REG_QWORD || dwLength != sizeof(UINT64))
|
||||
{
|
||||
/* Failed to read registry value, initialize with current setting for now */
|
||||
theme->Size[i] = GetSystemMetrics(g_SizeMetric[i]);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hkScheme);
|
||||
}
|
||||
RegCloseKey(hkScheme);
|
||||
}
|
||||
RegCloseKey(hkNewSchemes);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
static VOID
|
||||
_UpdateUserPref(UINT SpiGet, UINT SpiSet, BOOL *pbFlag)
|
||||
{
|
||||
SystemParametersInfo(SpiSet, 0, (PVOID)pbFlag, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
|
||||
}
|
||||
#define UPDATE_USERPREF(NAME,pbFlag) _UpdateUserPref(SPI_GET ## NAME, SPI_SET ## NAME, pbFlag)
|
||||
|
||||
VOID ApplyTheme(THEME* theme, INT ThemeId)
|
||||
{
|
||||
INT i, Result;
|
||||
HKEY hKey;
|
||||
DWORD dwDisposition;
|
||||
TCHAR clText[16];
|
||||
NONCLIENTMETRICS NonClientMetrics;
|
||||
|
||||
/* Apply Colors from global variable */
|
||||
SetSysColors(NUM_COLORS, g_ColorList, theme->crColor);
|
||||
|
||||
/* Save colors to registry */
|
||||
Result = RegOpenKeyEx(HKEY_CURRENT_USER, g_CPColors, 0, KEY_ALL_ACCESS, &hKey);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
/* Could not open the key, try to create it */
|
||||
Result = RegCreateKeyEx(HKEY_CURRENT_USER, g_CPColors, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
|
||||
}
|
||||
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
for (i = 0; i < NUM_COLORS; i++)
|
||||
{
|
||||
DWORD red = GetRValue(theme->crColor[i]);
|
||||
DWORD green = GetGValue(theme->crColor[i]);
|
||||
DWORD blue = GetBValue(theme->crColor[i]);
|
||||
wsprintf(clText, TEXT("%d %d %d"), red, green, blue);
|
||||
RegSetValueEx(hKey, g_RegColorNames[i], 0, REG_SZ, (BYTE *)clText, (lstrlen(clText) + 1) * sizeof(TCHAR));
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
/* Apply the fonts */
|
||||
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
NonClientMetrics.lfCaptionFont = theme->lfFont[FONT_CAPTION];
|
||||
NonClientMetrics.lfSmCaptionFont = theme->lfFont[FONT_SMCAPTION];
|
||||
NonClientMetrics.lfMenuFont = theme->lfFont[FONT_MENU];
|
||||
NonClientMetrics.lfStatusFont = theme->lfFont[FONT_INFO];
|
||||
NonClientMetrics.lfMessageFont = theme->lfFont[FONT_DIALOG];
|
||||
SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
|
||||
SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(LOGFONT), &theme->lfFont[FONT_ICON], 0);
|
||||
|
||||
/* FIXME: Apply size metrics */
|
||||
|
||||
/* Save fonts and size metrics to registry */
|
||||
Result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop\\WindowMetrics"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
RegSetValueEx(hKey, TEXT("CaptionFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_CAPTION], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("SmCaptionFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_SMCAPTION], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("IconFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_ICON], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("MenuFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_MENU], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("StatusFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_INFO], sizeof(LOGFONT));
|
||||
RegSetValueEx(hKey, TEXT("MessageFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_DIALOG], sizeof(LOGFONT));
|
||||
|
||||
/* Save size metrics to registry */
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_BORDER_X]);
|
||||
RegSetValueEx(hKey, TEXT("BorderWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_CAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("CaptionWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_CAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("CaptionHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SMCAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("SmCaptionWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SMCAPTION_Y]);
|
||||
RegSetValueEx(hKey, TEXT("SmCaptionHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_ICON_SPC_X]);
|
||||
RegSetValueEx(hKey, TEXT("IconSpacing"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_ICON_SPC_Y]);
|
||||
RegSetValueEx(hKey, TEXT("IconVerticalSpacing"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_MENU_SIZE_X]);
|
||||
RegSetValueEx(hKey, TEXT("MenuWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_MENU_Y]);
|
||||
RegSetValueEx(hKey, TEXT("MenuHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SCROLL_X]);
|
||||
RegSetValueEx(hKey, TEXT("ScrollWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SCROLL_Y]);
|
||||
RegSetValueEx(hKey, TEXT("ScrollHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
wsprintf(clText, TEXT("%d"), theme->Size[SIZE_ICON_X]);
|
||||
RegSetValueEx(hKey, TEXT("Shell Icon Size"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
/* Effects, save only when needed: */
|
||||
/* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
|
||||
* Just keep them in sync for now.
|
||||
*/
|
||||
theme->Effects.bTooltipAnimation = theme->Effects.bMenuAnimation;
|
||||
theme->Effects.bTooltipFade = theme->Effects.bMenuFade;
|
||||
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, theme->Effects.bDragFullWindows, NULL, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
|
||||
UPDATE_USERPREF(KEYBOARDCUES, &theme->Effects.bKeyboardCues);
|
||||
//UPDATE_USERPREF(ACTIVEWINDOWTRACKING, &theme->Effects.bActiveWindowTracking);
|
||||
//UPDATE_USERPREF(MENUANIMATION, &theme->Effects.bMenuAnimation);
|
||||
//UPDATE_USERPREF(COMBOBOXANIMATION, &theme->Effects.bComboBoxAnimation);
|
||||
//UPDATE_USERPREF(LISTBOXSMOOTHSCROLLING, &theme->Effects.bListBoxSmoothScrolling);
|
||||
//UPDATE_USERPREF(GRADIENTCAPTIONS, &theme->Effects.bGradientCaptions);
|
||||
//UPDATE_USERPREF(ACTIVEWNDTRKZORDER, &theme->Effects.bActiveWndTrkZorder);
|
||||
//UPDATE_USERPREF(HOTTRACKING, &theme->Effects.bHotTracking);
|
||||
UPDATE_USERPREF(MENUFADE, &theme->Effects.bMenuFade);
|
||||
//UPDATE_USERPREF(SELECTIONFADE, &theme->Effects.bSelectionFade);
|
||||
UPDATE_USERPREF(TOOLTIPANIMATION, &theme->Effects.bTooltipAnimation);
|
||||
UPDATE_USERPREF(TOOLTIPFADE, &theme->Effects.bTooltipFade);
|
||||
//UPDATE_USERPREF(CURSORSHADOW, &theme->Effects.bCursorShadow);
|
||||
//UPDATE_USERPREF(UIEFFECTS, &theme->Effects.bUiEffects);
|
||||
|
||||
/* Save ThemeId */
|
||||
Result = RegOpenKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, KEY_ALL_ACCESS, &hKey);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
if (ThemeId == -1)
|
||||
clText[0] = TEXT('\0');
|
||||
else
|
||||
lstrcpy(clText, g_ThemeTemplates[ThemeId].strKeyName);
|
||||
RegSetValueEx(hKey, g_SelectedStyle, 0, REG_SZ, (BYTE *)clText, (lstrlen(clText) + 1) * sizeof(TCHAR));
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL SaveTheme(THEME* theme, LPCTSTR strLegacyName)
|
||||
{
|
||||
/* FIXME: implement */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
INT LoadThemeTemplates(LPTSTR pszSelectedStyle)
|
||||
{
|
||||
HKEY hkNewSchemes, hkScheme, hkSizes, hkSize;
|
||||
FILETIME ftLastWriteTime;
|
||||
DWORD dwLength, dwType;
|
||||
DWORD dwDisposition;
|
||||
INT iStyle, iSize, iTemplateIndex;
|
||||
INT Result;
|
||||
|
||||
lstrcpy(pszSelectedStyle, TEXT(""));
|
||||
|
||||
iTemplateIndex = 0;
|
||||
Result = RegCreateKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkNewSchemes, &dwDisposition);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
/* First find out the currently selected template */
|
||||
dwLength = 4 * sizeof(TCHAR);
|
||||
RegQueryValueEx(hkNewSchemes, g_SelectedStyle, NULL, &dwType, (LPBYTE)pszSelectedStyle, &dwLength);
|
||||
|
||||
/* Check if already loaded */
|
||||
if (g_TemplateLoaded)
|
||||
{
|
||||
RegCloseKey(hkNewSchemes);
|
||||
return g_TemplateCount;
|
||||
}
|
||||
|
||||
iStyle = 0;
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
while((RegEnumKeyEx(hkNewSchemes, iStyle, g_ThemeTemplates[iTemplateIndex].strKeyName, &dwLength,
|
||||
NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS) && (iTemplateIndex < MAX_TEMPLATES))
|
||||
{
|
||||
/* is it really a template or one of the other entries */
|
||||
if (dwLength <= 4)
|
||||
{
|
||||
if (RegOpenKeyEx(hkNewSchemes, g_ThemeTemplates[iTemplateIndex].strKeyName, 0, KEY_READ, &hkScheme) == ERROR_SUCCESS)
|
||||
{
|
||||
if (RegOpenKeyEx(hkScheme, TEXT("Sizes"), 0, KEY_READ, &hkSizes) == ERROR_SUCCESS)
|
||||
{
|
||||
iSize = 0;
|
||||
dwLength = 3;
|
||||
while((RegEnumKeyEx(hkSizes, iSize, g_ThemeTemplates[iTemplateIndex].strSizeName, &dwLength,
|
||||
NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS) && (iSize <= 4))
|
||||
{
|
||||
if(RegOpenKeyEx(hkSizes, g_ThemeTemplates[iTemplateIndex].strSizeName, 0, KEY_READ, &hkSize) == ERROR_SUCCESS)
|
||||
{
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
RegQueryValueEx(hkSize, TEXT("DisplayName"), NULL, &dwType, (LPBYTE)&g_ThemeTemplates[iTemplateIndex].strDisplayName, &dwLength);
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
RegQueryValueEx(hkSize, TEXT("LegacyName"), NULL, &dwType, (LPBYTE)&g_ThemeTemplates[iTemplateIndex].strLegacyName, &dwLength);
|
||||
RegCloseKey(hkSize);
|
||||
}
|
||||
iSize++;
|
||||
iTemplateIndex++;
|
||||
dwLength = 3;
|
||||
}
|
||||
RegCloseKey(hkSizes);
|
||||
}
|
||||
RegCloseKey(hkScheme);
|
||||
}
|
||||
}
|
||||
iStyle++;
|
||||
dwLength = MAX_TEMPLATENAMELENTGH;
|
||||
}
|
||||
RegCloseKey(hkNewSchemes);
|
||||
g_TemplateLoaded = TRUE;
|
||||
g_TemplateCount = iTemplateIndex;
|
||||
}
|
||||
return iTemplateIndex;
|
||||
}
|
89
reactos/dll/cpl/desk/theme.h
Normal file
89
reactos/dll/cpl/desk/theme.h
Normal file
|
@ -0,0 +1,89 @@
|
|||
/* Some definitions for theme */
|
||||
#define SIZE_BORDER_X 0
|
||||
#define SIZE_BORDER_Y 1
|
||||
#define SIZE_CAPTION_Y 2
|
||||
#define SIZE_ICON_X 3
|
||||
#define SIZE_ICON_Y 4
|
||||
#define SIZE_ICON_SPC_X 5
|
||||
#define SIZE_ICON_SPC_Y 6
|
||||
#define SIZE_MENU_SIZE_X 7
|
||||
#define SIZE_MENU_Y 8
|
||||
#define SIZE_SCROLL_X 9
|
||||
#define SIZE_SCROLL_Y 10
|
||||
#define SIZE_SMCAPTION_Y 11
|
||||
#define SIZE_EDGE_X 12
|
||||
#define SIZE_EDGE_Y 13
|
||||
#define SIZE_FRAME_Y 14
|
||||
#define SIZE_MENU_CHECK_X 15
|
||||
#define SIZE_MENU_CHECK_Y 16
|
||||
#define SIZE_MENU_SIZE_Y 17
|
||||
#define SIZE_SIZE_X 18
|
||||
#define SIZE_SIZE_Y 19
|
||||
|
||||
#define FONT_CAPTION 0
|
||||
#define FONT_SMCAPTION 1
|
||||
#define FONT_HILIGHT 2
|
||||
#define FONT_MENU 2
|
||||
#define FONT_ICON 3
|
||||
#define FONT_INFO 4
|
||||
#define FONT_DIALOG 5
|
||||
|
||||
#define NUM_ELEMENTS 22
|
||||
#define NUM_FONTS 6
|
||||
#define NUM_SIZES 20
|
||||
#define NUM_COLORS 31
|
||||
#define MAX_TEMPLATES 50
|
||||
#define MAX_COLORNAMELENGTH 30
|
||||
#define MAX_TEMPLATENAMELENTGH 80
|
||||
|
||||
/* Some typedefs for theme */
|
||||
|
||||
/* Most (but not all) fields below correspond to HKCU\Control Panel\Desktop\UserPreferencesMask */
|
||||
typedef struct
|
||||
{
|
||||
BOOL bActiveWindowTracking;
|
||||
BOOL bMenuAnimation;
|
||||
BOOL bComboBoxAnimation;
|
||||
BOOL bListBoxSmoothScrolling;
|
||||
BOOL bGradientCaptions;
|
||||
BOOL bKeyboardCues;
|
||||
BOOL bActiveWndTrkZorder;
|
||||
BOOL bHotTracking;
|
||||
BOOL bMenuFade;
|
||||
BOOL bSelectionFade;
|
||||
BOOL bTooltipAnimation;
|
||||
BOOL bTooltipFade;
|
||||
BOOL bCursorShadow;
|
||||
BOOL bUiEffects;
|
||||
BOOL bFontSmoothing;
|
||||
BOOL bDragFullWindows;
|
||||
UINT uiFontSmoothingType;
|
||||
} EFFECTS;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
COLORREF crColor[NUM_COLORS];
|
||||
LOGFONT lfFont[NUM_FONTS];
|
||||
UINT64 Size[NUM_SIZES];
|
||||
BOOL bFlatMenus;
|
||||
EFFECTS Effects;
|
||||
} THEME;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
TCHAR strKeyName[4];
|
||||
TCHAR strSizeName[4];
|
||||
TCHAR strDisplayName[MAX_TEMPLATENAMELENTGH];
|
||||
TCHAR strLegacyName[MAX_TEMPLATENAMELENTGH];
|
||||
} THEME_PRESET;
|
||||
|
||||
extern const TCHAR g_RegColorNames[NUM_COLORS][MAX_COLORNAMELENGTH];
|
||||
extern const INT g_SizeMetric[NUM_SIZES];
|
||||
extern THEME_PRESET g_ThemeTemplates[MAX_TEMPLATES];
|
||||
|
||||
/* prototypes for theme.c */
|
||||
VOID LoadCurrentTheme(THEME* theme);
|
||||
BOOL LoadThemeFromReg(THEME* theme, INT ThemeId);
|
||||
VOID ApplyTheme(THEME* theme, INT ThemeId);
|
||||
BOOL SaveTheme(THEME* theme, LPCTSTR strLegacyName);
|
||||
INT LoadThemeTemplates(LPTSTR pszSelectedStyle);
|
Loading…
Reference in a new issue