summaryrefslogtreecommitdiff
path: root/alf/alfradiobutton.cpp
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 /alf/alfradiobutton.cpp
parent860d61661b82198bae93736980c340f5d2c4e152 (diff)
add radio button
Diffstat (limited to 'alf/alfradiobutton.cpp')
-rw-r--r--alf/alfradiobutton.cpp96
1 files changed, 96 insertions, 0 deletions
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;
+}
+