summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-25 21:35:28 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-05-25 21:43:48 +0200
commita06c7ff02ce50243cd1e4bef8bad25bd1978bcda (patch)
tree48c0462afd5a9566ffd44cb54659ecea934e70c1
parentd1be0b5dce72a3bc355e915916955b1a9a267c47 (diff)
add explicit functions for adding native buttons
-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.h10
-rw-r--r--alf/alflayout.cpp43
-rw-r--r--alf/alfnativebtn.cpp55
-rw-r--r--widgetfactory.cpp53
8 files changed, 133 insertions, 52 deletions
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
@@ -257,6 +257,46 @@ ALF_Layout_CalcCheckboxSize(HWND hwndWindow, ALFLayout *layout, HWND hwndCheckbo
}
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)
{
if (c->flags & ALF_LAYOUT_SIZE_PX) {
@@ -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);