From c218c7323a069eedbb42fbc31b0bcd8a664928c1 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Thu, 14 May 2020 17:24:09 +0200 Subject: add radio button --- Makefile.mingw | 7 ++-- Makefile.mingw-amd64 | 7 ++-- Makefile.vc6 | 5 ++- Makefile.vc6-ansi | 5 ++- alf/alf.h | 4 +++ alf/alfradiobutton.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ widgetfactory.cpp | 81 ++++++++++++++++++++++++++++++++++++++++-- 7 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 alf/alfradiobutton.cpp diff --git a/Makefile.mingw b/Makefile.mingw index a836bf8..7353860 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/alfcheckbox.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/alfcheckbox.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/alfradiobutton.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 @@ -47,13 +47,16 @@ out/alfnotebook.o: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayout. out/alfpanel.o: alf/alfpanel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< +out/alfradiobutton.o: alf/alfradiobutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CXXFLAGS) -c -o $@ $< + out/alfwindow.o: alf/alfwindow.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< 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/alfcheckbox.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/alfcheckbox.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/alfradiobutton.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 81ab5b1..5735c59 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/alfcheckbox.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/alfcheckbox.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/alfradiobutton.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 @@ -47,13 +47,16 @@ out/alfnotebook.amd64.o: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alfl out/alfpanel.amd64.o: alf/alfpanel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< +out/alfradiobutton.amd64.o: alf/alfradiobutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CXXFLAGS) -c -o $@ $< + out/alfwindow.amd64.o: alf/alfwindow.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CXXFLAGS) -c -o $@ $< 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/alfcheckbox.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/alfcheckbox.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/alfradiobutton.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 29317de..020cc70 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/alfcheckbox.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/alfcheckbox.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/alfradiobutton.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 @@ -43,6 +43,9 @@ out/alfnotebook.obj: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayou out/alfpanel.obj: alf/alfpanel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alfpanel.cpp +out/alfradiobutton.obj: alf/alfradiobutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CFLAGS) -c -Fo$@ alf/alfradiobutton.cpp + out/alfwindow.obj: alf/alfwindow.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alfwindow.cpp diff --git a/Makefile.vc6-ansi b/Makefile.vc6-ansi index efd1375..a855401 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/alfcheckbox.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/alfcheckbox.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/alfradiobutton.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 @@ -43,6 +43,9 @@ out/alfnotebook.obj: alf/alfnotebook.cpp alf/alfcompat.h alf/alf.h alf/alflayou out/alfpanel.obj: alf/alfpanel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alfpanel.cpp +out/alfradiobutton.obj: alf/alfradiobutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h + $(CXX) $(CFLAGS) -c -Fo$@ alf/alfradiobutton.cpp + out/alfwindow.obj: alf/alfwindow.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h $(CXX) $(CFLAGS) -c -Fo$@ alf/alfwindow.cpp diff --git a/alf/alf.h b/alf/alf.h index f77167d..900d977 100644 --- a/alf/alf.h +++ b/alf/alf.h @@ -447,6 +447,10 @@ ALF_NotebookRemoveFlag(HWND notebook, DWORD flag) { HWND ALF_AddCheckbox(HWND parent, WORD id, int x, int y, const TCHAR *text); +// radio +HWND +ALF_AddRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text); + // groupbox HWND ALF_AddGroupBox(HWND parent, WORD id, int x, int y, const TCHAR *text); diff --git a/alf/alfradiobutton.cpp b/alf/alfradiobutton.cpp new file mode 100644 index 0000000..2fe6cb6 --- /dev/null +++ b/alf/alfradiobutton.cpp @@ -0,0 +1,96 @@ +#include "alfpriv.h" + +typedef struct { + ALFColor bgcolor; + WNDPROC origWndProc; +} ALFRadioPriv; + +static ALFRadioPriv * +ALF_Radio_InitializePriv(void) +{ + return ALF_New(ALFRadioPriv, 1); +} + +static void +ALF_Radio_FreePriv(ALFRadioPriv *priv) +{ + ALF_Free(priv); +} + +static LRESULT +ALF_Radio_HandleCtlColor(HWND window, ALFRadioPriv *priv, HDC hDC) +{ + (void)priv; (void)window; + + SetTextColor(hDC, GetSysColor(COLOR_BTNTEXT)); + SetBkColor(hDC, GetSysColor(COLOR_BTNFACE)); + SetBkMode(hDC, OPAQUE); + return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); +} + +static LRESULT CALLBACK +ALF_Radio_WindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) +{ + ALFRadioPriv *priv = (ALFRadioPriv *)GetWindowLongPtr(window, GWLP_USERDATA); + + if (!priv) // fuck + return DefWindowProc(window, msg, wparam, lparam); + + if (msg == ALF_WM_SETBGCOLOR) { + ALFColor newColor = (ALFColor)lparam; + if (newColor != priv->bgcolor) { + priv->bgcolor = newColor; + if (ALF_Compat_IsAppThemed()) + InvalidateRect(window, NULL, TRUE); + } + return TRUE; + } + + if (msg == 0x2000 + WM_CTLCOLORSTATIC || msg == 0x2000 + WM_CTLCOLORBTN) { + return ALF_Radio_HandleCtlColor(window, priv, (HDC)wparam); + } + + if (msg == ALF_WM_BACKGROUNDCHANGE) { + if (priv->bgcolor == ALF_COLOR_TRANSPARENT && ALF_Compat_IsAppThemed()) { + InvalidateRect(window, NULL, TRUE); + } + return TRUE; + } + + if (msg == WM_THEMECHANGED) { + InvalidateRect(window, NULL, TRUE); + } + + if (msg == WM_DESTROY) { + WNDPROC orig = priv->origWndProc; + SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)orig); + SetWindowLongPtr(window, GWLP_USERDATA, 0); + ALF_Radio_FreePriv(priv); + return CallWindowProc(orig, window, msg, wparam, lparam); + } + + return CallWindowProc(priv->origWndProc, window, msg, wparam, lparam); +} + +HWND +ALF_AddRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text) +{ + HWND hwnd = CreateWindowEx(0, + TEXT("BUTTON"), + text, + WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, + 0, 0, 100, 100, + parent, + (HMENU)(ULONG_PTR)id, + ALF_HINSTANCE, + NULL); + + ALFRadioPriv *priv = ALF_Radio_InitializePriv(); + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)priv); + priv->origWndProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ALF_Radio_WindowProc); + + ALF_AddWidget(parent, x, y, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_SENDBGCHANGE); + + return hwnd; +} + diff --git a/widgetfactory.cpp b/widgetfactory.cpp index 7299074..ecf1bbb 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -566,20 +566,97 @@ notebookPanelInit(HWND panel) /* checkbox panel */ static void -checkboxPanelAttach(void *closure, HWND panel) +checkboxPanelAttach(void *closure, HWND outerPanel) { (void)closure; + HWND panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 1, 1, TEXT("ALF Checkbox")); + ALF_AddCheckbox(panel, (WORD)-1, 1, 2, TEXT("Some Checkbox with a very very really very very long text")); HWND l = ALF_AddLabel(panel, (WORD)-1, 1, 4, TEXT("Width checker")); ALF_SetBackgroundColor(l, ALF_COLOR_RGB(0, 0, 255)); ALF_SetTextColor(l, ALF_COLOR_RGB(255, 255, 255)); - ALF_LayoutSetRowMinSize(panel, 1, 825); + ALF_AddCheckbox(panel, (WORD)-1, 1, 6, TEXT("Another Checkbox")); + + ALF_LayoutSetRowMinSize(panel, 3, 525); + ALF_LayoutSetRowMinSize(panel, 5, 525); + ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); + ALF_LayoutSetRowExpandNumerator(panel, 9, 1); + + panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 1, TEXT("Native 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, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); + ALF_LayoutSetRowMinSize(panel, 3, 825); + ALF_LayoutSetRowMinSize(panel, 5, 825); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_LayoutSetRowExpandNumerator(panel, 9, 1); + + panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 1, 3, TEXT("ALF Radio Button")); + + hwnd = ALF_AddRadioButton(panel, (WORD)-1, 1, 2, TEXT("Some Radio button")); + ALF_AddRadioButton(panel, (WORD)-1, 1, 4, TEXT("Another long One")); + ALF_AddRadioButton(panel, (WORD)-1, 1, 6, TEXT("Option 3")); + ALF_AddRadioButton(panel, (WORD)-1, 1, 8, TEXT("Option IV")); + + SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); + + ALF_LayoutSetRowMinSize(panel, 3, 525); + ALF_LayoutSetRowMinSize(panel, 5, 525); + ALF_LayoutSetRowMinSize(panel, 7, 525); + ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); + ALF_LayoutSetRowExpandNumerator(panel, 9, 1); + + panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 3, TEXT("Native Radio")); + + hwnd = CreateWindowEx(0, + TEXT("BUTTON"), + TEXT("Native Radio Button with long text"), + WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, + 0, 0, 100, 100, + panel, + (HMENU)(ULONG_PTR)-1, + (HINSTANCE)GetModuleHandle(NULL), + NULL); + 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 Button #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_LayoutSetRowMinSize(panel, 2, 525); + ALF_LayoutSetRowMinSize(panel, 4, 525); + ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); + ALF_LayoutSetRowExpandNumerator(panel, 9, 1); + + ALF_LayoutSetRowMinSize(outerPanel, 0, 825); + ALF_LayoutSetRowMinSize(outerPanel, 2, 825); + ALF_LayoutSetColumnMinSize(outerPanel, 0, 825); + ALF_LayoutSetColumnMinSize(outerPanel, 2, 825); + ALF_LayoutSetColumnMinSize(outerPanel, 4, 825); + ALF_LayoutSetColumnExpandNumerator(outerPanel, 1, 1); + ALF_LayoutSetColumnExpandNumerator(outerPanel, 3, 1); + ALF_LayoutSetRowExpandNumerator(outerPanel, 1, 1); } static ALFPanelVTable checkboxPanelVtbl = { -- cgit v1.2.3