From a06c7ff02ce50243cd1e4bef8bad25bd1978bcda Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Mon, 25 May 2020 21:35:28 +0200 Subject: add explicit functions for adding native buttons --- Makefile.mingw | 7 +++++-- Makefile.mingw-amd64 | 7 +++++-- Makefile.vc6 | 5 ++++- Makefile.vc6-ansi | 5 ++++- alf/alf.h | 10 ++++++++++ alf/alflayout.cpp | 43 ++++++++++++++++++++++++++++++++++++++++ alf/alfnativebtn.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ widgetfactory.cpp | 53 +++++++------------------------------------------- 8 files changed, 133 insertions(+), 52 deletions(-) create mode 100644 alf/alfnativebtn.cpp diff --git a/Makefile.mingw b/Makefile.mingw index 991fce7..f74e3b7 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/alfnotebook.o out/alfpanel.o out/alfwindow.o +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 $(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 @@ -38,6 +38,9 @@ out/alflabel.o: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/ out/alflayout.o: alf/alflayout.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< +out/alfnativebtn.o: alf/alfnativebtn.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CXXFLAGS) -c -o $@ $< + out/alfnotebook.o: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< @@ -50,7 +53,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/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/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 98fed95..888be5a 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/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/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 @@ -38,6 +38,9 @@ out/alflabel.amd64.o: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout. out/alflayout.amd64.o: alf/alflayout.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< +out/alfnativebtn.amd64.o: alf/alfnativebtn.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CXXFLAGS) -c -o $@ $< + out/alfnotebook.amd64.o: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< @@ -50,7 +53,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/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/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 88daafe..2cef754 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/alfnotebook.obj out/alfpanel.obj out/alfwindow.obj +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 $(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 @@ -34,6 +34,9 @@ out/alflabel.obj: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h al out/alflayout.obj: alf/alflayout.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alflayout.cpp +out/alfnativebtn.obj: alf/alfnativebtn.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CFLAGS) -c -Fo$@ alf/alfnativebtn.cpp + out/alfnotebook.obj: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alfnotebook.cpp diff --git a/Makefile.vc6-ansi b/Makefile.vc6-ansi index 57aa6df..1753fc1 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/alfnotebook.obj out/alfpanel.obj out/alfwindow.obj +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 $(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 @@ -34,6 +34,9 @@ out/alflabel.obj: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h al out/alflayout.obj: alf/alflayout.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alflayout.cpp +out/alfnativebtn.obj: alf/alfnativebtn.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CFLAGS) -c -Fo$@ alf/alfnativebtn.cpp + out/alfnotebook.obj: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alfnotebook.cpp diff --git a/alf/alf.h b/alf/alf.h index 18cb241..fc17ec8 100644 --- a/alf/alf.h +++ b/alf/alf.h @@ -438,6 +438,16 @@ ALF_AddRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text); HWND ALF_AddGroupBox(HWND parent, WORD id, int x, int y, const TCHAR *text); +// native buttons +HWND +ALF_AddNativeButton(HWND win, WORD id, int x, int y, const TCHAR *text); + +HWND +ALF_AddNativeCheckbox(HWND parent, WORD id, int x, int y, const TCHAR *text); + +HWND +ALF_AddNativeRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text); + #ifdef __cplusplus } // extern C #endif diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp index 470f728..974cd78 100644 --- a/alf/alflayout.cpp +++ b/alf/alflayout.cpp @@ -256,6 +256,46 @@ ALF_Layout_CalcCheckboxSize(HWND hwndWindow, ALFLayout *layout, HWND hwndCheckbo ReleaseDC(hwndCheckbox, hDC); } +static void +ALF_Layout_CalcButtonSize(HWND hwndWindow, ALFLayout *layout, HWND hwndButton, SIZE *pSize) +{ + (void)hwndWindow; + + HDC hdc = GetDC(hwndButton); + HFONT oldFont = SelectFont(hdc, (HFONT)SendMessage(hwndButton, WM_GETFONT, 0, 0)); + + // calc drawtext style + UINT format = DT_LEFT | DT_EXPANDTABS | DT_CALCRECT; + + if (!(GetWindowLong(hwndButton, GWL_STYLE) & BS_MULTILINE)) + format |= DT_SINGLELINE; + + RECT r = { 0, 0, 0x7FFFFFFF, 100 }; + + TCHAR *textbuf = ALF_Text(hwndButton); + DrawText(hdc, textbuf, -1, &r, format); + ALF_Free(textbuf); + + int xpadding = ALF_Compat_GetSystemMetricsForDpi(SM_CXEDGE, + (UINT)layout->dpi) * 2 + 6; + int ypadding = ALF_Compat_GetSystemMetricsForDpi(SM_CYEDGE, + (UINT)layout->dpi) * 2 + 4; + + if (pSize->cx < r.right - r.left + xpadding) { + pSize->cx = r.right - r.left + xpadding; + } + if (pSize->cy < r.bottom - r.top + ypadding) { + pSize->cy = r.bottom - r.top + ypadding; + } + if (pSize->cx < pSize->cy) { + pSize->cx = pSize->cy; + } + + SelectFont(hdc, oldFont); + + ReleaseDC(hwndButton, hdc); +} + static void ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, SIZE *s) { @@ -280,6 +320,9 @@ ALF_Layout_CalcMinWidgetSize(ALFLayout *layout, ALFWidgetPriv *c, HWND window, S case ALF_LAYOUT_SIZE_CHECKBOX: ALF_Layout_CalcCheckboxSize(window, layout, c->hwnd, s); break; + case ALF_LAYOUT_SIZE_PUSHBUTTON: + ALF_Layout_CalcButtonSize(window, layout, c->hwnd, s); + break; default: // FIXME! unimplemented break; diff --git a/alf/alfnativebtn.cpp b/alf/alfnativebtn.cpp new file mode 100644 index 0000000..23997b5 --- /dev/null +++ b/alf/alfnativebtn.cpp @@ -0,0 +1,55 @@ +#include "alfpriv.h" + +HWND +ALF_AddNativeButton(HWND win, WORD id, int x, int y, const TCHAR *text) +{ + HWND hwndBtn = CreateWindowEx(0, + TEXT("BUTTON"), + text, + WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, + 0, 0, 100, 100, + win, + (HMENU)(ULONG_PTR)id, + ALF_HINSTANCE, + NULL); + ALF_AddWidget(win, x, y, hwndBtn, 5625, 1725, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG | ALF_LAYOUT_SIZE_PUSHBUTTON); + + return hwndBtn; +} + +HWND +ALF_AddNativeCheckbox(HWND parent, WORD id, int x, int y, const TCHAR *text) +{ + HWND hwnd = CreateWindowEx(0, + TEXT("BUTTON"), + text, + WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, + 0, 0, 100, 100, + parent, + (HMENU)(ULONG_PTR)id, + ALF_HINSTANCE, + NULL); + + ALF_AddWidget(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); + + return hwnd; +} + +HWND +ALF_AddNativeRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text) +{ + HWND hwnd = CreateWindowEx(0, + TEXT("BUTTON"), + text, + WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON, + 0, 0, 100, 100, + parent, + (HMENU)(ULONG_PTR)id, + ALF_HINSTANCE, + NULL); + + ALF_AddWidget(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); + + return hwnd; +} + diff --git a/widgetfactory.cpp b/widgetfactory.cpp index e4dc214..928ecb0 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -591,30 +591,9 @@ checkboxPanelAttach(void *closure, HWND outerPanel) panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 1, TEXT("Nat&ive Checkbox")); - HWND hwnd = CreateWindowEx(0, - TEXT("BUTTON"), - TEXT("Native Checkbox &with long text"), - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, - 0, 0, 100, 100, - panel, - (HMENU)(ULONG_PTR)-1, - (HINSTANCE)GetModuleHandle(NULL), - NULL); - - ALF_AddWidget(panel, 1, 1, hwnd, 2, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); - - hwnd = CreateWindowEx(0, - TEXT("BUTTON"), - TEXT("Native disabled Chec&kbox"), - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, - 0, 0, 100, 100, - panel, - (HMENU)(ULONG_PTR)-1, - (HINSTANCE)GetModuleHandle(NULL), - NULL); - + ALF_AddNativeCheckbox(panel, (WORD)-1, 1, 1, TEXT("Native Checkbox &with long text")); + HWND hwnd = ALF_AddNativeCheckbox(panel, (WORD)-1, 1, 3, TEXT("Native disabled Chec&kbox")); EnableWindow(hwnd, FALSE); - ALF_AddWidget(panel, 1, 3, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_LayoutSetRowMinSize(panel, 2, 525); ALF_LayoutSetRowMinSize(panel, 4, 525); @@ -638,28 +617,10 @@ checkboxPanelAttach(void *closure, HWND outerPanel) panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 3, TEXT("Native Radio")); - hwnd = CreateWindowEx(0, - TEXT("BUTTON"), - TEXT("Native Radio Butto&n with long text"), - WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, - 0, 0, 100, 100, - panel, - (HMENU)(ULONG_PTR)-1, - (HINSTANCE)GetModuleHandle(NULL), - NULL); + hwnd = ALF_AddNativeRadioButton(panel, (WORD)-1, 1, 1, TEXT("Native Radio Butto&n with long text")); SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); - ALF_AddWidget(panel, 1, 1, hwnd, 0, 0, ALF_LAYOUT_SIZE_RADIOBUTTON | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); - - hwnd = CreateWindowEx(0, - TEXT("BUTTON"), - TEXT("Native Radio B&utton #2"), - WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, - 0, 0, 100, 100, - panel, - (HMENU)(ULONG_PTR)-1, - (HINSTANCE)GetModuleHandle(NULL), - NULL); - ALF_AddWidget(panel, 1, 3, hwnd, 0, 0, ALF_LAYOUT_SIZE_RADIOBUTTON | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); + + ALF_AddNativeRadioButton(panel, (WORD)-1, 1, 3, TEXT("Native Radio B&utton #2")); ALF_LayoutSetRowMinSize(panel, 2, 525); ALF_LayoutSetRowMinSize(panel, 4, 525); @@ -889,8 +850,8 @@ WinMain addPaneToNotebook(hwndNtbk, PANE_GROUPBOX); HWND btnpanel = ALF_AddPanel(win, (WORD)-1, 1, 3); - ALF_AddButton(btnpanel, ID_HELLO, 1, 3, TEXT("&Hello World!")); - ALF_AddButton(btnpanel, (WORD)-1, 3, 3, TEXT("Goodbye, World")); + ALF_AddNativeButton(btnpanel, ID_HELLO, 1, 3, TEXT("&Hello World!")); + ALF_AddNativeButton(btnpanel, (WORD)-1, 3, 3, TEXT("Goodbye, World")); ALF_LayoutSetRowMinSize(win, 2, 525); ALF_LayoutSetRowMinSize(win, 0, 525); -- cgit v1.2.3