diff options
| -rw-r--r-- | alf/alf.h | 22 | ||||
| -rw-r--r-- | alf/alfcompat.cpp | 16 | ||||
| -rw-r--r-- | alf/alfcompat.h | 1 | ||||
| -rw-r--r-- | alf/alfnotebook.cpp | 85 | ||||
| -rw-r--r-- | widgetfactory.cpp | 18 |
5 files changed, 121 insertions, 21 deletions
@@ -62,6 +62,9 @@ typedef struct { #define ALF_LABEL_ALIGN_BOTTOM 12 #define ALF_LABEL_VALIGN_MASK 12 +// notebook flags +#define ALF_NOTEBOOK_SOLID_TAB_BACKGROUND 1 + // messages #define ALF_WM__BASE 0x2800 @@ -107,6 +110,9 @@ typedef struct { #define ALF_WM_PANEL_SETVTABLE (ALF_WM__BASE + 201) +#define ALF_WM_NTBK_GETFLAGS (ALF_WM__BASE + 201) +#define ALF_WM_NTBK_SETFLAGS (ALF_WM__BASE + 202) + typedef DWORD ALFColor; #define ALF_COLOR_TRANSPARENT ((ALFColor)-1) @@ -378,6 +384,22 @@ ALF_NotebookSelectedPanel(HWND notebook); HWND ALF_NotebookTabPanel(HWND notebook, int index); +DWORD +ALF_NotebookFlags(HWND notebook); + +void +ALF_NotebookSetFlags(HWND notebook, DWORD flags); + +static inline void +ALF_NotebookAddFlag(HWND notebook, DWORD flag) { + ALF_NotebookSetFlags(notebook, ALF_NotebookFlags(notebook) | flag); +} + +static inline void +ALF_NotebookRemoveFlag(HWND notebook, DWORD flag) { + ALF_NotebookSetFlags(notebook, ALF_NotebookFlags(notebook) & ~flag); +} + #ifdef __cplusplus } // extern C #endif diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp index 5416d9b..5226bb4 100644 --- a/alf/alfcompat.cpp +++ b/alf/alfcompat.cpp @@ -425,6 +425,19 @@ ALF_Compat_fallbackGetThemePartSize(HTHEME hTheme, return E_NOTIMPL; } +static HRESULT WINAPI +ALF_Compat_fallbackGetThemeColor(HTHEME hTheme, + int iPartId, + int iStateId, + int iPropId, + COLORREF *pColor) +{ + (void)hTheme; (void)iPartId; (void)iStateId; (void)iPropId; (void)pColor; + + return E_NOTIMPL; +} + + #define LOAD_FUNC(dll, name) do { \ if (_alf_dll_##dll) \ @@ -499,6 +512,7 @@ void ALF_LoadCompatFunctions(void) LOAD_FUNC(uxtheme, BufferedPaintRenderAnimation); LOAD_FUNC(uxtheme, GetThemeTransitionDuration); LOAD_FUNC(uxtheme, GetThemePartSize); + LOAD_FUNC(uxtheme, GetThemeColor); } void ALF_UnloadCompatFunctions(void) @@ -527,6 +541,7 @@ void ALF_UnloadCompatFunctions(void) UNLOAD_FUNC(BufferedPaintRenderAnimation); UNLOAD_FUNC(GetThemeTransitionDuration); UNLOAD_FUNC(GetThemePartSize); + UNLOAD_FUNC(GetThemeColor); FreeLibrary(_alf_dll_uxtheme); FreeLibrary(_alf_dll_user32); @@ -561,3 +576,4 @@ ALF_Compat_HANIMATIONBUFFER (WINAPI *ALF_Compat_BeginBufferedAnimation)(HWND,HDC HRESULT (WINAPI *ALF_Compat_EndBufferedAnimation)(ALF_Compat_HANIMATIONBUFFER,BOOL) = NULL; BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC) = NULL; HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*) = NULL; +HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*); diff --git a/alf/alfcompat.h b/alf/alfcompat.h index fba31c3..b3efbaf 100644 --- a/alf/alfcompat.h +++ b/alf/alfcompat.h @@ -146,3 +146,4 @@ extern ALF_Compat_HANIMATIONBUFFER (WINAPI *ALF_Compat_BeginBufferedAnimation)(H extern HRESULT (WINAPI *ALF_Compat_EndBufferedAnimation)(ALF_Compat_HANIMATIONBUFFER,BOOL); extern BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC); extern HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*); +extern HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*); diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp index d1024e2..6679ec4 100644 --- a/alf/alfnotebook.cpp +++ b/alf/alfnotebook.cpp @@ -1,19 +1,22 @@ #include "alfpriv.h" #include "alfcompat.h" -#define ALF_NB_ADDTAB (ALF_WM__BASE + 200) -#define ALF_NB_TABCOUNT (ALF_WM__BASE + 201) -#define ALF_NB_GETPANEL (ALF_WM__BASE + 202) -#define ALF_NB_GETSELINDEX (ALF_WM__BASE + 203) -#define ALF_NB_GETPNLINDEX (ALF_WM__BASE + 204) +#define ALF_NB_ADDTAB (ALF_WM__BASE + 300) +#define ALF_NB_TABCOUNT (ALF_WM__BASE + 301) +#define ALF_NB_GETPANEL (ALF_WM__BASE + 302) +#define ALF_NB_GETSELINDEX (ALF_WM__BASE + 303) +#define ALF_NB_GETPNLINDEX (ALF_WM__BASE + 304) #define TABP_BODY 10 +#define TMT_FILLCOLORHINT 3821 TCHAR *_alf_notebookClass = NULL; typedef struct { - HWND hwndTabCtrl; - HTHEME hTheme; + HWND hwndTabCtrl; + HTHEME hTheme; + ALFColor themeTabBgColor; + DWORD flags; } ALFNotebookPriv; static ALFNotebookPriv * @@ -21,6 +24,8 @@ ALF_Notebook_CreatePriv(void) { ALFNotebookPriv *priv = ALF_New(ALFNotebookPriv, 1); + priv->themeTabBgColor = ALF_COLOR_SYS(COLOR_BTNFACE); + return priv; } @@ -81,26 +86,47 @@ ALF_Notebook_InternalHandleTabChange(HWND hwndNotebook, HWND hwndTabCtrl) } static void +ALF_Notebook_SetSingleTabBackground(HWND hwndNotebook, ALFNotebookPriv *priv, HWND panel) +{ + (void)hwndNotebook; + if (priv->hTheme && !(priv->flags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND)) { + SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_TRANSPARENT); + } else { + SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)priv->themeTabBgColor); + } +} + +static void +ALF_Notebook_SetAllTabBackgrounds(HWND hwndNotebook, ALFNotebookPriv *priv) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + HWND panel = ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i); + ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, panel); + } +} + +static void ALF_Notebook_InternalHandleThemeChange(HWND hwndNotebook, ALFNotebookPriv *priv) { ALF_Compat_CloseThemeData(priv->hTheme); priv->hTheme = NULL; if (ALF_Compat_IsAppThemed()) - priv->hTheme = ALF_Compat_OpenThemeData(hwndNotebook, L"TAB"); + priv->hTheme = ALF_Compat_OpenThemeData(hwndNotebook, L"Tab"); InvalidateRect(hwndNotebook, NULL, TRUE); ALF_InvalidateLayout(hwndNotebook); - int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); - for (int i = 0; i < n; ++i) { - HWND panel = ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i); - - if (priv->hTheme) { - SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_TRANSPARENT); - } else { - SendMessage(panel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_SYS(COLOR_BTNFACE)); + // tab fill color for solid bg color mode + priv->themeTabBgColor = ALF_COLOR_SYS(COLOR_BTNFACE); + if (priv->hTheme) { + COLORREF c; + if (SUCCEEDED(ALF_Compat_GetThemeColor(priv->hTheme, TABP_BODY, 0, TMT_FILLCOLORHINT, &c))) { + priv->themeTabBgColor = (ALFColor)c; } } + + ALF_Notebook_SetAllTabBackgrounds(hwndNotebook, priv); } @@ -117,11 +143,7 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t SendMessage(hwndPanel, WM_SETFONT, (WPARAM)SendMessage(priv->hwndTabCtrl, WM_GETFONT, 0, 0), 0); - if (priv->hTheme) { - SendMessage(hwndPanel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_TRANSPARENT); - } else { - SendMessage(hwndPanel, ALF_WM_SETBGCOLOR, 0, (LPARAM)ALF_COLOR_SYS(COLOR_BTNFACE)); - } + ALF_Notebook_SetSingleTabBackground(notebook, priv, hwndPanel); TCITEM tie; ZeroMemory(&tie, sizeof(tie)); @@ -341,6 +363,15 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return 0; } else if (uMsg == ALF_WM_INVALIDATELAYOUT) { ALF_InvalidateLayout(GetParent(hwnd)); + } else if (uMsg == ALF_WM_NTBK_GETFLAGS) { + return (LRESULT)priv->flags; + } else if (uMsg == ALF_WM_NTBK_SETFLAGS) { + DWORD oldFlags = priv->flags; + priv->flags = (DWORD)lParam; + + if ((oldFlags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND) != (priv->flags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND)) { + ALF_Notebook_SetAllTabBackgrounds(hwnd, priv); + } } return DefWindowProc(hwnd, uMsg, wParam, lParam); @@ -424,3 +455,15 @@ ALF_NotebookSelectedPanel(HWND notebook) return NULL; } } + +DWORD +ALF_NotebookFlags(HWND notebook) +{ + return (DWORD)SendMessage(notebook, ALF_WM_NTBK_GETFLAGS, 0, 0); +} + +void +ALF_NotebookSetFlags(HWND notebook, DWORD flags) +{ + SendMessage(notebook, ALF_WM_NTBK_SETFLAGS, 0, (LPARAM)flags); +} diff --git a/widgetfactory.cpp b/widgetfactory.cpp index 2457a84..d27c068 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -20,6 +20,8 @@ enum { ID_BC4, ID_BC5, ID_NOTEBOOK, + ID_B_TABBGSOLID, + ID_B_TABBGTEXTURE, ID__MAX }; @@ -87,6 +89,14 @@ handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, ALF_SetBackgroundColor(window, ALF_COLOR_TRANSPARENT); } } + if (control != NULL && sourceid == ID_B_TABBGSOLID) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + ALF_NotebookAddFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); + } + if (control != NULL && sourceid == ID_B_TABBGTEXTURE) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + ALF_NotebookRemoveFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); + } return 0; } @@ -320,10 +330,18 @@ WinMain EnableWindow(ALF_WidgetHwndById(win, ID_BC2), FALSE); HWND hwndTab = ALF_AddNotebook(win, ID_NOTEBOOK, 1, 7); + HWND hwndTabPanel0 = ALF_NotebookAddTab(hwndTab, TEXT("Notebook Debug")); HWND hwndTabPanel1 = ALF_NotebookAddTab(hwndTab, TEXT("Tab 1")); HWND hwndTabPanel2 = ALF_NotebookAddTab(hwndTab, TEXT("Tab 2")); ALF_NotebookAddTab(hwndTab, TEXT("Another tab")); ALF_NotebookAddTab(hwndTab, TEXT("Yet another empty tab")); + + + ALF_AddButton(hwndTabPanel0, ID_B_TABBGSOLID, 0, 0, TEXT("Solid tab background")); + ALF_AddButton(hwndTabPanel0, ID_B_TABBGTEXTURE, 0, 1, TEXT("Textured tab background")); + ALF_LayoutSetRowExpandNumerator(hwndTabPanel0, 2, 1); + ALF_LayoutSetColumnExpandNumerator(hwndTabPanel0, 1, 1); + ALF_AddLabel(hwndTabPanel1, (WORD)-1, 0, 0, TEXT("Hello World!")); ALF_AddLabel(hwndTabPanel2, (WORD)-1, 0, 0, TEXT("Goodbye, &World!")); ALF_AddEdit(hwndTabPanel2, (WORD)-1, 1, 0, TEXT("lol")); |
