summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-14 17:24:09 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-23 12:28:11 +0200
commitc218c7323a069eedbb42fbc31b0bcd8a664928c1 (patch)
tree88f3d8923f3e1283785534e943927d00172a9375
parent860d61661b82198bae93736980c340f5d2c4e152 (diff)
add radio button
-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.h4
-rw-r--r--alf/alfradiobutton.cpp96
-rw-r--r--widgetfactory.cpp81
7 files changed, 197 insertions, 8 deletions
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 = {