summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.mingw7
-rw-r--r--Makefile.mingw-amd647
-rw-r--r--Makefile.vc65
-rw-r--r--Makefile.vc6-ansi5
-rw-r--r--alf/alf.cpp14
-rw-r--r--alf/alfbutton.cpp129
-rw-r--r--alf/alfcombobox.cpp44
-rw-r--r--alf/alfcompat.cpp65
-rw-r--r--alf/alfcompat.h2
-rw-r--r--alf/alfcontrol.cpp53
-rw-r--r--alf/alfgroupbox.cpp41
-rw-r--r--alf/alflabel.cpp41
-rw-r--r--alf/alfnotebook.cpp41
-rw-r--r--alf/alfpanel.cpp41
-rw-r--r--alf/alfpriv.h40
-rw-r--r--alf/alfwindow.cpp2
16 files changed, 224 insertions, 313 deletions
diff --git a/Makefile.mingw b/Makefile.mingw
index f74e3b7..8c29c5d 100644
--- a/Makefile.mingw
+++ b/Makefile.mingw
@@ -8,7 +8,7 @@ LDFLAGS = -luser32 -lcomctl32 -lshell32 -lversion -static
all: out/widgetfactory.exe out/alf/alf.c out/widgetfactory-c.exe
-out/widgetfactory.exe: out/widgetfactory.o out/alfbutton.o out/alfcombobox.o out/alfcompat.o out/alf.o out/alfdpiaware.o out/alfedit.o out/alfgroupbox.o out/alflabel.o out/alflayout.o out/alfnativebtn.o out/alfnotebook.o out/alfpanel.o out/alfwindow.o
+out/widgetfactory.exe: out/widgetfactory.o out/alfbutton.o out/alfcombobox.o out/alfcompat.o out/alfcontrol.o out/alf.o out/alfdpiaware.o out/alfedit.o out/alfgroupbox.o out/alflabel.o out/alflayout.o out/alfnativebtn.o out/alfnotebook.o out/alfpanel.o out/alfwindow.o
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
out/alfbutton.o: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -20,6 +20,9 @@ out/alfcombobox.o: alf/alfcombobox.cpp alf/alfcompat.h alf/alf.h alf/alflayout.
out/alfcompat.o: alf/alfcompat.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
+out/alfcontrol.o: alf/alfcontrol.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CXXFLAGS) -c -o $@ $<
+
out/alf.o: alf/alf.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
@@ -53,7 +56,7 @@ out/alfwindow.o: alf/alfwindow.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h al
out/widgetfactory.o: widgetfactory.cpp alf/alf.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
-out/alf/alf.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alfwindow.cpp
+out/alf/alf.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alfcontrol.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alfwindow.cpp
@mkdir -p out/alf
@printf "#include \"alf.h\"\\n" > $@
@cat $^ | grep -v "^#pragma once" | grep -v "^#include \"alf" >> $@
diff --git a/Makefile.mingw-amd64 b/Makefile.mingw-amd64
index 888be5a..17e7aea 100644
--- a/Makefile.mingw-amd64
+++ b/Makefile.mingw-amd64
@@ -8,7 +8,7 @@ LDFLAGS = -luser32 -lcomctl32 -lshell32 -lversion -static
all: out/widgetfactory64.exe out/alf/alf64.c out/widgetfactory64-c.exe
-out/widgetfactory64.exe: out/widgetfactory.amd64.o out/alfbutton.amd64.o out/alfcombobox.amd64.o out/alfcompat.amd64.o out/alf.amd64.o out/alfdpiaware.amd64.o out/alfedit.amd64.o out/alfgroupbox.amd64.o out/alflabel.amd64.o out/alflayout.amd64.o out/alfnativebtn.amd64.o out/alfnotebook.amd64.o out/alfpanel.amd64.o out/alfwindow.amd64.o
+out/widgetfactory64.exe: out/widgetfactory.amd64.o out/alfbutton.amd64.o out/alfcombobox.amd64.o out/alfcompat.amd64.o out/alfcontrol.amd64.o out/alf.amd64.o out/alfdpiaware.amd64.o out/alfedit.amd64.o out/alfgroupbox.amd64.o out/alflabel.amd64.o out/alflayout.amd64.o out/alfnativebtn.amd64.o out/alfnotebook.amd64.o out/alfpanel.amd64.o out/alfwindow.amd64.o
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
out/alfbutton.amd64.o: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -20,6 +20,9 @@ out/alfcombobox.amd64.o: alf/alfcombobox.cpp alf/alfcompat.h alf/alf.h alf/alfl
out/alfcompat.amd64.o: alf/alfcompat.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
+out/alfcontrol.amd64.o: alf/alfcontrol.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CXXFLAGS) -c -o $@ $<
+
out/alf.amd64.o: alf/alf.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
@@ -53,7 +56,7 @@ out/alfwindow.amd64.o: alf/alfwindow.cpp alf/alfcompat.h alf/alf.h alf/alflayou
out/widgetfactory.amd64.o: widgetfactory.cpp alf/alf.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
-out/alf/alf64.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alfwindow.cpp
+out/alf/alf64.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alfcontrol.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alfwindow.cpp
@mkdir -p out/alf
@printf "#include \"alf.h\"\\n" > $@
@cat $^ | grep -v "^#pragma once" | grep -v "^#include \"alf" >> $@
diff --git a/Makefile.vc6 b/Makefile.vc6
index 2cef754..c850e7d 100644
--- a/Makefile.vc6
+++ b/Makefile.vc6
@@ -4,7 +4,7 @@ CXX = cl.exe
CFLAGS = -O2 -GA -W3 -DUNICODE -D_UNICODE -D_WIN32=0x0501 -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0501 -nologo
LDFLAGS = /link unicows.lib kernel32.lib user32.lib comctl32.lib shell32.lib gdi32.lib version.lib
-out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alfwindow.obj
+out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alfcontrol.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alfwindow.obj
$(CXX) $(CFLAGS) -Fe$@ $** $(LDFLAGS)
out/alfbutton.obj: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -16,6 +16,9 @@ out/alfcombobox.obj: alf/alfcombobox.cpp alf/alfcompat.h alf/alf.h alf/alflayou
out/alfcompat.obj: alf/alfcompat.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alfcompat.cpp
+out/alfcontrol.obj: alf/alfcontrol.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CFLAGS) -c -Fo$@ alf/alfcontrol.cpp
+
out/alf.obj: alf/alf.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alf.cpp
diff --git a/Makefile.vc6-ansi b/Makefile.vc6-ansi
index 1753fc1..8a6cb3f 100644
--- a/Makefile.vc6-ansi
+++ b/Makefile.vc6-ansi
@@ -4,7 +4,7 @@ CXX = cl.exe
CFLAGS = -O2 -GA -W3 -D_WIN32=0x0501 -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0501 -nologo
LDFLAGS = /link /entry:_entry /opt:nowin98 /fixed:no kernel32.lib user32.lib comctl32.lib shell32.lib gdi32.lib version.lib
-out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alfwindow.obj
+out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alfcontrol.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alfwindow.obj
$(CXX) $(CFLAGS) -Fe$@ $** $(LDFLAGS)
out/alfbutton.obj: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -16,6 +16,9 @@ out/alfcombobox.obj: alf/alfcombobox.cpp alf/alfcompat.h alf/alf.h alf/alflayou
out/alfcompat.obj: alf/alfcompat.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alfcompat.cpp
+out/alfcontrol.obj: alf/alfcontrol.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CFLAGS) -c -Fo$@ alf/alfcontrol.cpp
+
out/alf.obj: alf/alf.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alf.cpp
diff --git a/alf/alf.cpp b/alf/alf.cpp
index 8929a5b..641baec 100644
--- a/alf/alf.cpp
+++ b/alf/alf.cpp
@@ -45,13 +45,8 @@ ALF_Initialize(void)
ALF_LoadCompatFunctions();
- ALF_RegisterComboClass();
- ALF_RegisterPanelClass();
- ALF_RegisterLabelClass();
- ALF_RegisterNotebookClass();
- ALF_RegisterButtonClass();
- ALF_RegisterGroupBoxClass();
ALF_RegisterWindowClass();
+ ALF_RegisterControlClass();
ALF_Compat_BufferedPaintInit();
}
@@ -72,13 +67,8 @@ ALF_UnInitialize(void)
if (!--_alf_initCounter) {
ALF_Compat_BufferedPaintUnInit();
- UnregisterClass(_alf_comboClass, ALF_HINSTANCE);
- UnregisterClass(_alf_panelClass, ALF_HINSTANCE);
- UnregisterClass(_alf_labelClass, ALF_HINSTANCE);
- UnregisterClass(_alf_notebookClass, ALF_HINSTANCE);
- UnregisterClass(_alf_buttonClass, ALF_HINSTANCE);
- UnregisterClass(_alf_groupboxClass, ALF_HINSTANCE);
UnregisterClass(_alf_windowClass, ALF_HINSTANCE);
+ UnregisterClass(_alf_controlClass, ALF_HINSTANCE);
ALF_UnloadCompatFunctions();
}
diff --git a/alf/alfbutton.cpp b/alf/alfbutton.cpp
index f41b0b5..6d7d319 100644
--- a/alf/alfbutton.cpp
+++ b/alf/alfbutton.cpp
@@ -64,21 +64,6 @@ typedef struct {
ALFColor bgcolor;
} ALFNtButtonPriv;
-TCHAR *_alf_buttonClass = NULL;
-static int (*ALF_Button_DrawDisabledText)(HDC,LPCTSTR,int,LPRECT,UINT) = NULL;
-
-static BOOL CALLBACK
-ALF_Button_DrawDisabledText_DrawStateProc(HDC hdc,
- LPARAM lData,
- WPARAM wData,
- int cx,
- int cy)
-{
- RECT rc = { 0, 0, cx, cy };
- DrawText(hdc, (const TCHAR *)lData, -1, &rc, (UINT)wData);
- return TRUE;
-}
-
static BOOL CALLBACK
ALF_Button_DrawDisabledTextW_DrawStateProc(HDC hdc,
LPARAM lData,
@@ -92,20 +77,6 @@ ALF_Button_DrawDisabledTextW_DrawStateProc(HDC hdc,
}
static int
-ALF_Button_DrawDisabledTextNt(HDC hdc,
- LPCTSTR lpchText,
- int cchText,
- LPRECT lprc,
- UINT format)
-{
- (void)cchText;
- return DrawState(hdc, NULL, ALF_Button_DrawDisabledText_DrawStateProc,
- (LPARAM)lpchText, (WPARAM)format,
- lprc->left, lprc->top, lprc->right - lprc->left, lprc->bottom - lprc->top,
- DST_COMPLEX | DSS_DISABLED);
-}
-
-static int
ALF_Button_DrawDisabledTextNtW(HDC hdc,
LPCWSTR lpchText,
int cchText,
@@ -119,33 +90,6 @@ ALF_Button_DrawDisabledTextNtW(HDC hdc,
DST_COMPLEX | DSS_DISABLED);
}
-static int
-ALF_Button_DrawDisabledText9x(HDC hdc,
- LPCTSTR lpchText,
- int cchText,
- LPRECT lprc,
- UINT format)
-{
- COLORREF oldcolor = SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
- int r = DrawText(hdc, lpchText, cchText, lprc, format);
- SetTextColor(hdc, oldcolor);
- return r;
-}
-
-// FIXME! This is how NT 3.x dos it, need to figure out how to get the real 16bit look
-static int
-ALF_Button_DrawDisabledText31(HDC hdc,
- LPCTSTR lpchText,
- int cchText,
- LPRECT lprc,
- UINT format)
-{
- COLORREF oldcolor = SetTextColor(hdc, GetSysColor(COLOR_BTNSHADOW));
- int r = DrawText(hdc, lpchText, cchText, lprc, format);
- SetTextColor(hdc, oldcolor);
- return r;
-}
-
// FIXME! this doesn’t really look correct
static int
ALF_Button_CalcCheckboxTextSpace(HDC hdc)
@@ -996,55 +940,32 @@ ALF_NtButton_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
-void
-ALF_RegisterButtonClass(void)
-{
- // initialize helper function for disabled text
- if (ALF_Compat_IsMinWindowsVersion(4, 0)) {
- if (ALF_Compat_IsWin9x()) {
- ALF_Button_DrawDisabledText = ALF_Button_DrawDisabledText9x;
- } else {
- ALF_Button_DrawDisabledText = ALF_Button_DrawDisabledTextNt;
- }
- } else {
- ALF_Button_DrawDisabledText = ALF_Button_DrawDisabledText31;
- }
-
- // Initialize custom themed button class on windows 2000 and newer
- // Win9x and NT3.51/NT4 are well served by the classic version
- if (ALF_Compat_IsMinWindowsVersion(5, 0)) {
- WNDCLASSW cls;
- ZeroMemory(&cls, sizeof(cls));
-
- WCHAR classNameBuf[256];
- ALF_BuildUniqueNameW(classNameBuf, L"ALFNtButton.", (ULONG_PTR)&_alf_buttonClass);
+#ifdef UNICODE
+# define ALF_NtButton_WndProcStart ALF_NtButton_WndProc
+#else
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.lpszClassName = classNameBuf;
- cls.cbWndExtra = sizeof(void*);
- cls.lpfnWndProc = ALF_NtButton_WndProc;
-
- ATOM classatom = RegisterClassW(&cls);
- if (!classatom)
- MessageBox(NULL, TEXT("FATAL: Could not register button class"), NULL, MB_OK);
-
- _alf_buttonClass = MAKEINTATOM(classatom);
- }
+// HACK to get a unicode window
+static LRESULT CALLBACK
+ALF_NtButton_WndProcStart(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+ SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (LONG_PTR)ALF_NtButton_WndProc);
+ WNDPROC thunk = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC);
+ return CallWindowProc(thunk, hwnd, msg, wparam, lparam);
}
+#endif
+
static HWND
ALF_NtButton_Create(HWND win, WORD id, int x, int y, const TCHAR *text, DWORD addstyle)
{
- HWND hwndButton = CreateWindowEx(0,
- _alf_buttonClass,
- text,
- WS_CHILD | WS_VISIBLE | addstyle,
- 0, 0, 100, 100,
- win,
- (HMENU)(ULONG_PTR)id,
- ALF_HINSTANCE,
- NULL);
+ HWND hwndButton = ALF_CreateControlWindow(0,
+ text,
+ WS_CHILD | WS_VISIBLE | addstyle,
+ 0, 0, 100, 100,
+ win,
+ (HMENU)(ULONG_PTR)id,
+ ALF_NtButton_WndProcStart,
+ NULL);
int minwidth = 5625;
int minheight = 1725;
@@ -1211,7 +1132,7 @@ ALF_ClassicButton_PaintCheckbox(HWND hwnd, ALFClassicButtonPriv *priv, DRAWITEMS
COLORREF oldBkColor = SetBkColor(dis->hDC, GetSysColor(COLOR_BTNFACE));
if (dis->itemState & ODS_DISABLED) {
- ALF_Button_DrawDisabledText(dis->hDC, textbuf, -1, &texttarget, style);
+ ALF_Compat_DrawDisabledText(dis->hDC, textbuf, -1, &texttarget, style);
} else {
DrawText(dis->hDC, textbuf, -1, &texttarget, style);
}
@@ -1270,7 +1191,7 @@ ALF_ClassicButton_PaintButton(HWND hwnd, ALFClassicButtonPriv *priv, DRAWITEMSTR
COLORREF oldBkColor = SetBkColor(dis->hDC, GetSysColor(COLOR_BTNFACE));
if (dis->itemState & ODS_DISABLED) {
- ALF_Button_DrawDisabledText(dis->hDC, textbuf, -1, &texttarget, style);
+ ALF_Compat_DrawDisabledText(dis->hDC, textbuf, -1, &texttarget, style);
} else {
COLORREF oldTextColor = SetTextColor(dis->hDC, GetSysColor(COLOR_BTNTEXT));
@@ -1467,7 +1388,7 @@ ALF_ClassicButton_Create(HWND win, WORD id, int x, int y, const TCHAR *text, DWO
HWND
ALF_AddButton(HWND win, WORD id, int x, int y, const TCHAR *text)
{
- if (_alf_buttonClass) {
+ if (ALF_Compat_IsMinWindowsVersion(5, 0)) {
return ALF_NtButton_Create(win, id, x, y, text, WS_TABSTOP);
} else {
return ALF_ClassicButton_Create(win, id, x, y, text, 0);
@@ -1477,7 +1398,7 @@ ALF_AddButton(HWND win, WORD id, int x, int y, const TCHAR *text)
HWND
ALF_AddCheckbox(HWND win, WORD id, int x, int y, const TCHAR *text)
{
- if (_alf_buttonClass) {
+ if (ALF_Compat_IsMinWindowsVersion(5, 0)) {
return ALF_NtButton_Create(win, id, x, y, text, WS_TABSTOP | BS_AUTOCHECKBOX);
} else {
return ALF_ClassicButton_Create(win, id, x, y, text, BS_AUTOCHECKBOX);
@@ -1487,7 +1408,7 @@ ALF_AddCheckbox(HWND win, WORD id, int x, int y, const TCHAR *text)
HWND
ALF_AddRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text)
{
- if (_alf_buttonClass) {
+ if (ALF_Compat_IsMinWindowsVersion(5, 0)) {
return ALF_NtButton_Create(parent, id, x, y, text, BS_AUTORADIOBUTTON);
} else {
return ALF_ClassicButton_Create(parent, id, x, y, text, BS_AUTORADIOBUTTON);
diff --git a/alf/alfcombobox.cpp b/alf/alfcombobox.cpp
index 3ce7326..2b24fa7 100644
--- a/alf/alfcombobox.cpp
+++ b/alf/alfcombobox.cpp
@@ -11,8 +11,6 @@
#define ALF_CB_GETSTYLE (ALF_WM__BASE + 207)
#define ALF_CB_FINDSTRINGEXACT (ALF_WM__BASE + 208)
-TCHAR *_alf_comboClass = NULL;
-
typedef struct {
DWORD comboStyle;
} ALFComboCreateParams;
@@ -83,7 +81,7 @@ ALF__ComboWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
ALFComboPriv *priv = (ALFComboPriv *)GetWindowLongPtr(hwnd, 0);
if (uMsg == WM_CREATE) {
- ALFComboCreateParams *params = (ALFComboCreateParams*)((CREATESTRUCT*)lParam)->lpCreateParams;
+ ALFComboCreateParams *params = (ALFComboCreateParams*)((ALFControlCreateParams *)((CREATESTRUCT*)lParam)->lpCreateParams)->param;
priv = ALF_Combo_InitializePriv(hwnd, params);
SetWindowLongPtr(hwnd, 0, (LONG_PTR)priv);
@@ -300,44 +298,20 @@ ALF__ComboWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
-void
-ALF_RegisterComboClass(void)
-{
- WNDCLASS cls;
- ZeroMemory(&cls, sizeof(cls));
-
- TCHAR classNameBuf[256];
- ALF_BuildUniqueName(classNameBuf, TEXT("ALFComboBox."), (ULONG_PTR)&_alf_comboClass);
-
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
- cls.lpszClassName = classNameBuf;
- cls.cbWndExtra = sizeof(void*);
- cls.lpfnWndProc = ALF__ComboWindowProc;
-
- ATOM classatom = RegisterClass(&cls);
- if (!classatom)
- MessageBox(NULL, TEXT("FATAL: Could not register Combo class"), NULL, MB_OK);
-
- _alf_comboClass = MAKEINTATOM(classatom);
-}
-
static HWND
ALF_InternalAddComboBox(HWND win, WORD id, int x, int y, DWORD style, const TCHAR *defaultText)
{
ALFComboCreateParams cp;
cp.comboStyle = style;
- HWND hwndCombo = CreateWindowEx(WS_EX_CONTROLPARENT,
- _alf_comboClass,
- TEXT(""),
- WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
- 0, 0, 0, 0,
- win,
- (HMENU)(ULONG_PTR)id,
- ALF_HINSTANCE,
- &cp);
+ HWND hwndCombo = ALF_CreateControlWindow(WS_EX_CONTROLPARENT,
+ TEXT(""),
+ WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
+ 0, 0, 0, 0,
+ win,
+ (HMENU)(ULONG_PTR)id,
+ ALF__ComboWindowProc,
+ &cp);
if (defaultText)
SetWindowText(hwndCombo, defaultText);
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp
index ec14b00..12a79f4 100644
--- a/alf/alfcompat.cpp
+++ b/alf/alfcompat.cpp
@@ -356,6 +356,58 @@ ALF_Compat_fallbackGetThemeColor(HTHEME hTheme,
return E_NOTIMPL;
}
+static BOOL CALLBACK
+ALF_Compat_DrawDisabledText_DrawStateProc(HDC hdc,
+ LPARAM lData,
+ WPARAM wData,
+ int cx,
+ int cy)
+{
+ RECT rc = { 0, 0, cx, cy };
+ DrawText(hdc, (const TCHAR *)lData, -1, &rc, (UINT)wData);
+ return TRUE;
+}
+
+static int
+ALF_Compat_DrawDisabledTextEmbossed(HDC hdc,
+ LPCTSTR lpchText,
+ int cchText,
+ LPRECT lprc,
+ UINT format)
+{
+ (void)cchText;
+ return DrawState(hdc, NULL, ALF_Compat_DrawDisabledText_DrawStateProc,
+ (LPARAM)lpchText, (WPARAM)format,
+ lprc->left, lprc->top, lprc->right - lprc->left, lprc->bottom - lprc->top,
+ DST_COMPLEX | DSS_DISABLED);
+}
+
+static int
+ALF_Compat_DrawDisabledTextSolid(HDC hdc,
+ LPCTSTR lpchText,
+ int cchText,
+ LPRECT lprc,
+ UINT format)
+{
+ COLORREF oldcolor = SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
+ int r = DrawText(hdc, lpchText, cchText, lprc, format);
+ SetTextColor(hdc, oldcolor);
+ return r;
+}
+
+// FIXME! This is how NT 3.x does it, need to figure out how to get the real 16bit look
+static int
+ALF_Compat_DrawDisabledText31(HDC hdc,
+ LPCTSTR lpchText,
+ int cchText,
+ LPRECT lprc,
+ UINT format)
+{
+ COLORREF oldcolor = SetTextColor(hdc, GetSysColor(COLOR_BTNSHADOW));
+ int r = DrawText(hdc, lpchText, cchText, lprc, format);
+ SetTextColor(hdc, oldcolor);
+ return r;
+}
#define LOAD_FUNC(dll, name) do { \
@@ -413,6 +465,17 @@ void ALF_LoadCompatFunctions(void)
LOAD_FUNC(uxtheme, GetThemeTransitionDuration);
LOAD_FUNC(uxtheme, GetThemePartSize);
LOAD_FUNC(uxtheme, GetThemeColor);
+
+ // initialize helper function for disabled text
+ if (ALF_Compat_IsMinWindowsVersion(4, 0)) {
+ if (GetSystemMetrics(SM_SLOWMACHINE)) {
+ ALF_Compat_DrawDisabledText = ALF_Compat_DrawDisabledTextSolid;
+ } else {
+ ALF_Compat_DrawDisabledText = ALF_Compat_DrawDisabledTextEmbossed;
+ }
+ } else {
+ ALF_Compat_DrawDisabledText = ALF_Compat_DrawDisabledText31;
+ }
}
void ALF_UnloadCompatFunctions(void)
@@ -448,6 +511,8 @@ void ALF_UnloadCompatFunctions(void)
#undef LOAD_FUNC
#undef UNLOAD_FUNC
+int (*ALF_Compat_DrawDisabledText)(HDC,LPCTSTR,int,LPRECT,UINT) = NULL;
+
BOOL (WINAPI *ALF_Compat_IsAppThemed)(void) = NULL;
UINT (WINAPI *ALF_Compat_GetDpiForWindow)(HWND /*window*/) = NULL;
BOOL (WINAPI *ALF_Compat_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT) = NULL;
diff --git a/alf/alfcompat.h b/alf/alfcompat.h
index e09bda0..e2df004 100644
--- a/alf/alfcompat.h
+++ b/alf/alfcompat.h
@@ -122,6 +122,8 @@ ALF_Compat_LogFontAtoW(const LOGFONTA *a, LOGFONTW *w)
w->lfFaceName[LF_FACESIZE - 1] = 0;
}
+extern int (*ALF_Compat_DrawDisabledText)(HDC,LPCTSTR,int,LPRECT,UINT);
+
extern BOOL (WINAPI *ALF_Compat_IsAppThemed)(void);
extern UINT (WINAPI *ALF_Compat_GetDpiForWindow)(HWND);
extern BOOL (WINAPI *ALF_Compat_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);
diff --git a/alf/alfcontrol.cpp b/alf/alfcontrol.cpp
new file mode 100644
index 0000000..a630fa7
--- /dev/null
+++ b/alf/alfcontrol.cpp
@@ -0,0 +1,53 @@
+#include "alfpriv.h"
+
+
+TCHAR _alf_controlClass[28] = {0};
+
+static LRESULT CALLBACK
+ALF_Control_InitialWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+ if (msg == WM_NCCREATE) {
+ ALFControlCreateParams *params = (ALFControlCreateParams *)((CREATESTRUCT *)lparam)->lpCreateParams;
+ SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)params->windowProc);
+ return params->windowProc(hwnd, msg, wparam, lparam);
+ }
+
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+}
+
+void
+ALF_RegisterControlClass(void)
+{
+ WNDCLASS cls;
+ ZeroMemory(&cls, sizeof(cls));
+
+ ALF_BuildUniqueName(_alf_controlClass, TEXT("ALFControl."), (ULONG_PTR)&_alf_controlClass[0]);
+
+ cls.style = CS_DBLCLKS;
+ cls.hInstance = ALF_HINSTANCE;
+ cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
+ cls.lpszClassName = _alf_controlClass;
+ cls.cbWndExtra = sizeof(void*);
+ cls.lpfnWndProc = ALF_Control_InitialWindowProc;
+
+ ATOM classatom = RegisterClass(&cls);
+ if (!classatom)
+ MessageBox(NULL, TEXT("FATAL: Could not register control class"), NULL, MB_OK);
+}
+
+HWND
+ALF_CreateControlWindow(DWORD exstyle, const TCHAR *text, DWORD style,
+ int x, int y, int w, int h, HWND parent, HMENU hmenu,
+ WNDPROC windowProc, void *param)
+{
+ ALFControlCreateParams p = { windowProc, param };
+ return CreateWindowEx(exstyle,
+ _alf_controlClass,
+ text,
+ style,
+ x, y, w, h,
+ parent,
+ hmenu,
+ ALF_HINSTANCE,
+ &p);
+}
diff --git a/alf/alfgroupbox.cpp b/alf/alfgroupbox.cpp
index 5c459dc..bfe5519 100644
--- a/alf/alfgroupbox.cpp
+++ b/alf/alfgroupbox.cpp
@@ -5,8 +5,6 @@
#define GBS_DISABLED 2
#define TMT_TEXTCOLOR 3803
-TCHAR *_alf_groupboxClass = NULL;
-
typedef struct {
ALFLayout layout;
HTHEME theme;
@@ -342,40 +340,17 @@ ALF_GroupBox_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
return DefWindowProc(window, msg, wparam, lparam);
}
-void
-ALF_RegisterGroupBoxClass(void)
-{
- WNDCLASS cls;
- ZeroMemory(&cls, sizeof(cls));
-
- TCHAR classNameBuf[256];
- ALF_BuildUniqueName(classNameBuf, TEXT("ALFGroupBox."), (ULONG_PTR)&_alf_groupboxClass);
-
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.lpszClassName = classNameBuf;
- cls.cbWndExtra = sizeof(void*);
- cls.lpfnWndProc = ALF_GroupBox_WindowProc;
-
- ATOM classatom = RegisterClass(&cls);
- if (!classatom)
- MessageBox(NULL, TEXT("FATAL: Could not register groupbox class"), NULL, MB_OK);
-
- _alf_groupboxClass = MAKEINTATOM(classatom);
-}
-
HWND
ALF_AddGroupBox(HWND parent, WORD id, int x, int y, const TCHAR *text)
{
- HWND hwndPanel = CreateWindowEx(WS_EX_CONTROLPARENT,
- _alf_groupboxClass,
- text,
- WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_TABSTOP,
- 0, 0, 0, 0,
- parent,
- (HMENU)(UINT_PTR)id,
- ALF_HINSTANCE,
- NULL);
+ HWND hwndPanel = ALF_CreateControlWindow(WS_EX_CONTROLPARENT,
+ text,
+ WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_TABSTOP,
+ 0, 0, 0, 0,
+ parent,
+ (HMENU)(UINT_PTR)id,
+ ALF_GroupBox_WindowProc,
+ NULL);
ALF_AddWidget(parent, x, y, hwndPanel, 0, 0, ALF_LAYOUT_SIZE_QUERY | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_SENDBGCHANGE | ALF_LAYOUT_SENDDPICHANGE);
diff --git a/alf/alflabel.cpp b/alf/alflabel.cpp
index d0b9b59..e7e2ee3 100644
--- a/alf/alflabel.cpp
+++ b/alf/alflabel.cpp
@@ -10,8 +10,6 @@ typedef struct {
int dpi;
} ALFLabelPriv;
-TCHAR *_alf_labelClass;
-
static int
ALF__LabelTopPadding(HWND hwnd, ALFLabelPriv *priv)
{
@@ -328,14 +326,14 @@ ALF__LabelWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
HWND
ALF_AddLabel(HWND win, WORD id, int x, int y, const TCHAR *text)
{
- HWND hwndLabel = CreateWindow(_alf_labelClass,
- text,
- WS_CHILD | WS_VISIBLE,
- 0, 0, 100, 100,
- win,
- (HMENU)(ULONG_PTR)id,
- ALF_HINSTANCE,
- NULL);
+ HWND hwndLabel = ALF_CreateControlWindow(0,
+ text,
+ WS_CHILD | WS_VISIBLE,
+ 0, 0, 100, 100,
+ win,
+ (HMENU)(ULONG_PTR)id,
+ ALF__LabelWindowProc,
+ NULL);
ALFLabelPriv *priv = ALF_New(ALFLabelPriv, 1);
priv->style = ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_TOP_LIKE_EDIT;
@@ -349,29 +347,6 @@ ALF_AddLabel(HWND win, WORD id, int x, int y, const TCHAR *text)
return hwndLabel;
}
-
-void
-ALF_RegisterLabelClass(void)
-{
- WNDCLASS cls;
- ZeroMemory(&cls, sizeof(cls));
-
- TCHAR classNameBuf[256];
- ALF_BuildUniqueName(classNameBuf, TEXT("ALFLabel."), (ULONG_PTR)&_alf_labelClass);
-
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.lpszClassName = classNameBuf;
- cls.cbWndExtra = sizeof(void*);
- cls.lpfnWndProc = ALF__LabelWindowProc;
-
- ATOM classatom = RegisterClass(&cls);
- if (!classatom)
- MessageBox(NULL, TEXT("FATAL: Could not register label class"), NULL, MB_OK);
-
- _alf_labelClass = MAKEINTATOM(classatom);
-}
-
DWORD
ALF_LabelStyle(HWND hwndLabel)
{
diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp
index 314ee85..bdcb304 100644
--- a/alf/alfnotebook.cpp
+++ b/alf/alfnotebook.cpp
@@ -10,8 +10,6 @@
#define TABP_BODY 10
#define TMT_FILLCOLORHINT 3821
-TCHAR *_alf_notebookClass = NULL;
-
typedef struct {
HWND hwndTabCtrl;
HTHEME hTheme;
@@ -559,41 +557,18 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
-void
-ALF_RegisterNotebookClass(void)
-{
- WNDCLASS cls;
- ZeroMemory(&cls, sizeof(cls));
-
- TCHAR classNameBuf[256];
- ALF_BuildUniqueName(classNameBuf, TEXT("ALFNotebook."), (ULONG_PTR)&_alf_notebookClass);
-
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.lpszClassName = classNameBuf;
- cls.cbWndExtra = sizeof(ALFNotebookPriv*);
- cls.lpfnWndProc = ALF__NotebookWindowProc;
-
- ATOM classatom = RegisterClass(&cls);
- if (!classatom)
- MessageBox(NULL, TEXT("FATAL: Could not register notebook class"), NULL, MB_OK);
-
- _alf_notebookClass = MAKEINTATOM(classatom);
-}
-
// tab control
HWND
ALF_AddNotebook(HWND parent, WORD id, int x, int y)
{
- HWND hwndNtbk = CreateWindowEx(WS_EX_CONTROLPARENT,
- _alf_notebookClass,
- TEXT(""),
- WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
- 0, 0, 100, 100,
- parent,
- (HMENU)(ULONG_PTR)id,
- ALF_HINSTANCE,
- NULL);
+ HWND hwndNtbk = ALF_CreateControlWindow(WS_EX_CONTROLPARENT,
+ TEXT(""),
+ WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
+ 0, 0, 100, 100,
+ parent,
+ (HMENU)(ULONG_PTR)id,
+ ALF__NotebookWindowProc,
+ NULL);
ALF_AddWidget(parent, x, y, hwndNtbk, 0, 0, ALF_LAYOUT_SIZE_QUERY | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_SENDDPICHANGE);
diff --git a/alf/alfpanel.cpp b/alf/alfpanel.cpp
index 6e63611..085b1c7 100644
--- a/alf/alfpanel.cpp
+++ b/alf/alfpanel.cpp
@@ -1,7 +1,5 @@
#include "alfpriv.h"
-TCHAR *_alf_panelClass = NULL;
-
typedef struct {
ALFLayout layout;
const ALFPanelVTable *vtbl;
@@ -250,40 +248,17 @@ ALF_Panel_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
}
}
-void
-ALF_RegisterPanelClass(void)
-{
- WNDCLASS cls;
- ZeroMemory(&cls, sizeof(cls));
-
- TCHAR classNameBuf[256];
- ALF_BuildUniqueName(classNameBuf, TEXT("ALFPanel."), (ULONG_PTR)&_alf_panelClass);
-
- cls.hInstance = ALF_HINSTANCE;
- cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW);
- cls.lpszClassName = classNameBuf;
- cls.cbWndExtra = sizeof(void*);
- cls.lpfnWndProc = ALF_Panel_WindowProc;
-
- ATOM classatom = RegisterClass(&cls);
- if (!classatom)
- MessageBox(NULL, TEXT("FATAL: Could not register panel class"), NULL, MB_OK);
-
- _alf_panelClass = MAKEINTATOM(classatom);
-}
-
HWND
ALF_CreatePanelWindow(HWND parent, WORD id)
{
- return CreateWindowEx(WS_EX_CONTROLPARENT,
- _alf_panelClass,
- TEXT(""),
- WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
- 0, 0, 0, 0,
- parent,
- (HMENU)(ULONG_PTR)id,
- ALF_HINSTANCE,
- NULL);
+ return ALF_CreateControlWindow(WS_EX_CONTROLPARENT,
+ TEXT(""),
+ WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
+ 0, 0, 0, 0,
+ parent,
+ (HMENU)(ULONG_PTR)id,
+ ALF_Panel_WindowProc,
+ NULL);
}
HWND
diff --git a/alf/alfpriv.h b/alf/alfpriv.h
index dd36f55..eb3c358 100644
--- a/alf/alfpriv.h
+++ b/alf/alfpriv.h
@@ -17,34 +17,14 @@
#include "alfcompat.h"
#include "alflayout.h"
-extern TCHAR *_alf_comboClass;
-extern TCHAR *_alf_panelClass;
-extern TCHAR *_alf_labelClass;
-extern TCHAR *_alf_notebookClass;
-extern TCHAR *_alf_buttonClass;
-extern TCHAR *_alf_groupboxClass;
extern TCHAR _alf_windowClass[];
+extern TCHAR _alf_controlClass[];
void
-ALF_RegisterComboClass(void);
-
-void
-ALF_RegisterPanelClass(void);
-
-void
-ALF_RegisterLabelClass(void);
-
-void
-ALF_RegisterNotebookClass(void);
-
-void
-ALF_RegisterButtonClass(void);
-
-void
-ALF_RegisterGroupBoxClass(void);
+ALF_RegisterWindowClass(void);
void
-ALF_RegisterWindowClass(void);
+ALF_RegisterControlClass(void);
HWND
ALF_CreatePanelWindow(HWND parent, WORD id);
@@ -55,5 +35,19 @@ ALF_BuildUniqueName(TCHAR *buf, const TCHAR *prefix, ULONG_PTR uniquifier);
void
ALF_BuildUniqueNameW(WCHAR *buf, const WCHAR *prefix, ULONG_PTR uniquifier);
+// TODO: think about making it public
BOOL
ALF_ShouldMessageBubble(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
+
+// TODO: refine custom control API, make it public
+
+// passed as ptr in WM_CREATE
+typedef struct {
+ WNDPROC windowProc;
+ void *param;
+} ALFControlCreateParams;
+
+HWND
+ALF_CreateControlWindow(DWORD exstyle, const TCHAR *text, DWORD style,
+ int x, int y, int w, int h, HWND parent, HMENU hmenu,
+ WNDPROC windowProc, void *param);
diff --git a/alf/alfwindow.cpp b/alf/alfwindow.cpp
index 3434cf5..a464080 100644
--- a/alf/alfwindow.cpp
+++ b/alf/alfwindow.cpp
@@ -375,7 +375,7 @@ ALF_RegisterWindowClass(void)
WNDCLASS cls;
ZeroMemory(&cls, sizeof(cls));
- ALF_BuildUniqueName(_alf_windowClass, TEXT("ALFWindow."), (ULONG_PTR)&_alf_windowClass);
+ ALF_BuildUniqueName(_alf_windowClass, TEXT("ALFWindow."), (ULONG_PTR)&_alf_windowClass[0]);
cls.style = 0;
cls.hInstance = ALF_HINSTANCE;