summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alf/alf.h22
-rw-r--r--alf/alfcompat.cpp16
-rw-r--r--alf/alfcompat.h1
-rw-r--r--alf/alfnotebook.cpp85
-rw-r--r--widgetfactory.cpp18
5 files changed, 121 insertions, 21 deletions
diff --git a/alf/alf.h b/alf/alf.h
index 32e221c..0d336c9 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -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"));