#include "alfpriv.h" /* BUTTON */ static LRESULT CALLBACK ALF__ButtonSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { (void)uIdSubclass; (void)dwRefData; ALFAPP app = (ALFAPP)dwRefData; if (uMsg == ALF_WM_QUERYSIZE) { HDC hdc = GetDC(hwnd); HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); HFONT oldFont = 0; if (font) oldFont = SelectFont(hdc, font); // calc drawtext style DWORD style = GetWindowLong(hwnd, GWL_STYLE); UINT format = DT_LEFT | DT_EXPANDTABS | DT_CALCRECT; if ((style & BS_MULTILINE) == 0) format |= DT_SINGLELINE; RECT r = { 0, 0, 100, 100 }; int textlen = GetWindowTextLength(hwnd); TCHAR *textbuf = (TCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, (textlen + 1)*sizeof(TCHAR)); GetWindowText(hwnd, textbuf, textlen+1); DrawText(hdc, textbuf, -1, &r, format); HeapFree(GetProcessHeap(), 0, textbuf); int xpadding = app->compatFn->GetSystemMetricsForDpi(SM_CXEDGE, ALF_CentipointsToPixels(GetParent(hwnd), 7200)) * 3; int ypadding = app->compatFn->GetSystemMetricsForDpi(SM_CYEDGE, ALF_CentipointsToPixels(GetParent(hwnd), 7200)) * 3; SIZE *pSize = (SIZE*)(void*)lParam; 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; } if (font) SelectFont(hdc, oldFont); ReleaseDC(hwnd, hdc); } else if (uMsg == WM_NCCALCSIZE) { /* HACK: a themed button contains a 1px margin. An unthemed button * does not, so we add one by shrinking the client area */ RECT *r = (RECT *)lParam; int retval = app->compatFn->DefSubclassProc(hwnd, uMsg, wParam, lParam); if (!app->compatFn->IsAppThemed()) { r->top += 1; r->bottom -= 1; } return retval; } else if (uMsg == WM_THEMECHANGED) { SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED); } return app->compatFn->DefSubclassProc(hwnd, uMsg, wParam, lParam); } HWND ALF_AddButton(HWND win, WORD id, UINT x, UINT y, const WCHAR *text) { HWND hwndButton = CreateWindowEx(0, L"BUTTON", text, WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON | BS_MULTILINE, 0, 0, 100, 100, win, (HMENU)(int)id, (HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE), NULL); ALFAPP app = ALF_ApplicationFromWindow(win); app->compatFn->SetWindowSubclass(hwndButton, ALF__ButtonSubclassProc, 0, (DWORD_PTR)app); SetWindowPos(hwndButton, NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED); ALFAddWidgetParams p; ZeroMemory(&p, sizeof(p)); p.hwnd = hwndButton; p.x = x; p.y = y; p.width = 5625; p.height = 0; p.flags = ALF_QUERYSIZE | ALF_MESSAGEFONT; ALF_AddWidgetEx(win, &p); return hwndButton; } void ALF_SetDefaultButton(HWND win, WORD id) { SendMessage(win, DM_SETDEFID, (WPARAM)id, 0); }