diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-29 23:43:00 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-29 23:43:00 +0200 |
| commit | c9ebff8e7de093e7705aab6208593fae048ad98d (patch) | |
| tree | 06f641c182e4013e95c7fa1f255e4adbd32a67f2 | |
| parent | 46326d57e0c912f265595ffed375d211bbe23f44 (diff) | |
controls: subclass generic "ALFControl" window
The idea is that the compiler can strip unused controls when linking
statically, but the window class initialization functions blocked that.
| -rw-r--r-- | Makefile.mingw | 7 | ||||
| -rw-r--r-- | Makefile.mingw-amd64 | 7 | ||||
| -rw-r--r-- | Makefile.vc6 | 5 | ||||
| -rw-r--r-- | Makefile.vc6-ansi | 5 | ||||
| -rw-r--r-- | alf/alf.cpp | 14 | ||||
| -rw-r--r-- | alf/alfbutton.cpp | 129 | ||||
| -rw-r--r-- | alf/alfcombobox.cpp | 44 | ||||
| -rw-r--r-- | alf/alfcompat.cpp | 65 | ||||
| -rw-r--r-- | alf/alfcompat.h | 2 | ||||
| -rw-r--r-- | alf/alfcontrol.cpp | 53 | ||||
| -rw-r--r-- | alf/alfgroupbox.cpp | 41 | ||||
| -rw-r--r-- | alf/alflabel.cpp | 41 | ||||
| -rw-r--r-- | alf/alfnotebook.cpp | 41 | ||||
| -rw-r--r-- | alf/alfpanel.cpp | 41 | ||||
| -rw-r--r-- | alf/alfpriv.h | 40 | ||||
| -rw-r--r-- | alf/alfwindow.cpp | 2 |
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; |
