#include "alfpriv.h" /* LABEL */ static int ALF__LabelTopPadding(HWND hwnd, ALFAPP app) { // some pixels on top to align with the edit control // see also: alfedit.cpp return app->compatFn->GetSystemMetricsForDpi( SM_CYEDGE, ALF_CentipointsToPixels(GetParent(hwnd), 7200)) + ((LOBYTE(LOWORD(GetVersion())) < 4) ? 2 : 1) /* internal padding in edit control */ + 1 /* external padding around edit control */; } static LRESULT CALLBACK ALF__LabelSubclassProc(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 hdcLabel = GetDC(hwnd); HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); HFONT oldFont = 0; if (font) oldFont = SelectFont(hdcLabel, font); // calc drawtext style DWORD style = GetWindowLong(hwnd, GWL_STYLE); UINT format = DT_LEFT | DT_EXPANDTABS | DT_CALCRECT; if (style & SS_NOPREFIX) format |= DT_NOPREFIX; if (style & SS_EDITCONTROL) format |= DT_EDITCONTROL; if (style & SS_ENDELLIPSIS || style & SS_PATHELLIPSIS || style & SS_WORDELLIPSIS) 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(hdcLabel, textbuf, -1, &r, format); HeapFree(GetProcessHeap(), 0, textbuf); SIZE *pSize = (SIZE*)(void*)lParam; if (pSize->cx == 0) pSize->cx = r.right - r.left; if (pSize->cy == 0) pSize->cy = r.bottom - r.top + ALF__LabelTopPadding(hwnd, app); if (font) SelectFont(hdcLabel, oldFont); ReleaseDC(hwnd, hdcLabel); } else if (uMsg == ALF_WM_APPLYSIZE) { RECT *p = (RECT *)lParam; int topPadding = ALF__LabelTopPadding(hwnd, app); return (LRESULT)DeferWindowPos((HDWP)wParam, hwnd, NULL, p->left, p->top + topPadding, p->right - p->left, p->bottom - p->top - topPadding, SWP_NOZORDER|SWP_NOACTIVATE); } else if (uMsg == WM_DESTROY) { app->compatFn->RemoveWindowSubclass(hwnd, ALF__LabelSubclassProc, 0); } return app->compatFn->DefSubclassProc(hwnd, uMsg, wParam, lParam); } HWND ALF_AddLabel(HWND win, WORD id, UINT x, UINT y, const TCHAR *text) { HWND hwndLabel = CreateWindow(TEXT("STATIC"), text, WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, 0, 0, 100, 100, win, (HMENU)(int)id, (HINSTANCE)GetWindowLongPtr(win, GWLP_HINSTANCE), NULL); ALFAPP app = ALF_ApplicationFromWindow(win); app->compatFn->SetWindowSubclass(hwndLabel, ALF__LabelSubclassProc, 0, (DWORD_PTR)app); ALFWidgetLayoutParams p; ZeroMemory(&p, sizeof(p)); p.hwnd = hwndLabel; p.x = x; p.y = y; p.width = 0; p.height = 0; p.flags = ALF_QUERYSIZE | ALF_APPLYSIZE | ALF_MESSAGEFONT; ALF_AddWidgetEx(win, &p); return hwndLabel; }