diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-14 17:24:09 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-23 12:28:11 +0200 |
| commit | c218c7323a069eedbb42fbc31b0bcd8a664928c1 (patch) | |
| tree | 88f3d8923f3e1283785534e943927d00172a9375 /alf/alfradiobutton.cpp | |
| parent | 860d61661b82198bae93736980c340f5d2c4e152 (diff) | |
add radio button
Diffstat (limited to 'alf/alfradiobutton.cpp')
| -rw-r--r-- | alf/alfradiobutton.cpp | 96 |
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; +} + |
