#include "alfpriv.h" TCHAR *_alf_panelClass = NULL; typedef struct { ALFLayout layout; HFONT font; } ALFPanelPriv; static void ALF_Panel_IntializePriv(ALFPanelPriv *priv) { ALF_Layout_Init(&priv->layout); } static void ALF_Panel_ClearPriv(ALFPanelPriv *priv) { ALF_Layout_Clear(&priv->layout); } static void ALF_Panel_Paint(ALFPanelPriv *priv, HWND hwnd, HDC dc, RECT *r) { (void)priv; ALF_Compat_DrawThemeParentBackground(hwnd, dc, r); int textlen = GetWindowTextLength(hwnd); if (textlen < 1) return; TCHAR *textbuf = ALF_New(TCHAR, textlen + 1); GetWindowText(hwnd, textbuf, textlen+1); HFONT oldFont = SelectFont(dc, priv->font); SetTextColor(dc, GetSysColor(COLOR_BTNTEXT)); SetBkMode(dc, TRANSPARENT); RECT rc; GetClientRect(hwnd, &rc); DrawText(dc, textbuf, -1, &rc, DT_SINGLELINE | DT_EXPANDTABS | DT_HIDEPREFIX | DT_CENTER | DT_VCENTER); ALF_Free(textbuf); SelectFont(dc, oldFont); } static LRESULT WINAPI ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) { if (msg == WM_NCCREATE) { ALFPanelPriv *p = ALF_New(ALFPanelPriv, 1); ALF_Panel_IntializePriv(p); SetWindowLongPtr(window, 0, (LONG_PTR)p); } ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0); if (msg == WM_NCDESTROY) { ALF_Panel_ClearPriv(priv); ALF_Free(priv); SetWindowLongPtr(window, 0, 0); } if (msg == WM_ERASEBKGND) { return TRUE; } if (msg == WM_SETFONT) { priv->font = (HFONT)wparam; if (LOWORD(lparam) != 0) InvalidateRect(window, NULL, TRUE); // fallthrough to layout, will propagate font to children } if (msg == WM_GETFONT) { return (LRESULT)priv->font; } if (msg == WM_SETTEXT) { InvalidateRect(window, NULL, TRUE); } if (msg == WM_PRINTCLIENT) { RECT r = { 0, 0, 0, 0 }; GetClientRect(window, &r); ALF_Panel_Paint(priv, window, (HDC)wparam, &r); return TRUE; } if (msg == WM_PAINT) { PAINTSTRUCT ps; HDC dc = BeginPaint(window, &ps); ALF_Panel_Paint(priv, window, dc, &ps.rcPaint); EndPaint(window, &ps); return 0; } if (ALF_ShouldMessageBubble(window, msg, wparam, lparam)) return SendMessage(GetParent(window), msg, wparam, lparam); if (msg == WM_SIZE) { ALF_Layout_Apply(&priv->layout, window); } LRESULT ret = 0; if (ALF_Layout_HandleMessage(&priv->layout, window, msg, wparam, lparam, &ret)) return ret; return DefWindowProc(window, msg, wparam, lparam); } void ALF_RegisterPanelClass(void) { WNDCLASS cls; ZeroMemory(&cls, sizeof(cls)); TCHAR classNameBuf[256]; ALF_BuildUniqueName(classNameBuf, TEXT("ALFPanel."), (ULONG_PTR)&_alf_panelClass); cls.hInstance = ALF_HINSTANCE; cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW); cls.lpszClassName = classNameBuf; cls.cbWndExtra = sizeof(void*); cls.lpfnWndProc = ALF__PanelWindowProc; ATOM classatom = RegisterClass(&cls); if (!classatom) MessageBox(NULL, TEXT("FATAL: Could not register panel class"), NULL, MB_OK); _alf_panelClass = MAKEINTATOM(classatom); } HWND ALF_CreatePanelWindow(HWND parent, WORD id) { return CreateWindowEx(WS_EX_CONTROLPARENT, _alf_panelClass, TEXT(""), WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, 0, 0, parent, (HMENU)(int)id, ALF_HINSTANCE, NULL); } HWND ALF_AddPanel(HWND parent, WORD id, int x, int y) { HWND hwndPanel = ALF_CreatePanelWindow(parent, id); ALF_AddWidget(parent, x, y, hwndPanel, 0, 0, ALF_LAYOUT_SIZE_QUERY | ALF_LAYOUT_INHERITFONT); return hwndPanel; }