#include "alfpriv.h" typedef struct { ALFAPP app; ALFLayout layout; } ALFPanelPriv; static void ALF_Panel_IntializePriv(ALFPanelPriv *priv, ALFAPP app) { priv->app = app; ALF_Layout_Init(&priv->layout); } static void ALF_Panel_ClearPriv(ALFPanelPriv *priv) { ALF_Layout_Clear(&priv->layout); } static LRESULT WINAPI ALF__PanelWindowProc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam) { if (msg == WM_NCCREATE) { ALFPanelPriv *p = (ALFPanelPriv*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ALFPanelPriv)); ALFAPP app = (ALFAPP)(((CREATESTRUCT*)lparam)->lpCreateParams); ALF_Panel_IntializePriv(p, app); SetWindowLongPtr(window, 0, (LONG_PTR)p); } ALFPanelPriv *priv = (ALFPanelPriv *)GetWindowLongPtr(window, 0); if (msg == WM_NCDESTROY) { ALF_Panel_ClearPriv(priv); HeapFree(GetProcessHeap(), 0, priv); SetWindowLongPtr(window, 0, 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(ALFAPP app) { WNDCLASS cls; ZeroMemory(&cls, sizeof(cls)); TCHAR classNameBuf[256]; ALF_BuildRandomClassName(app, TEXT("ALFPanel."), classNameBuf); cls.hInstance = app->hInstance; cls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_ARROW); if (LOBYTE(LOWORD(GetVersion())) >= 4) { cls.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); } else { // NT 3.x has white dialog backgrounds cls.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); } cls.lpszClassName = classNameBuf; cls.cbWndExtra = sizeof(void*); cls.lpfnWndProc = ALF__PanelWindowProc; ATOM classatom = RegisterClass(&cls); if (!classatom) MessageBox(NULL, TEXT("FATAL: Could not register Combo class"), NULL, MB_OK); app->panelClass = MAKEINTATOM(classatom); } HWND ALF_AddPanel(HWND parent, WORD id, UINT x, UINT y) { ALFAPP app = ALF_ApplicationFromWindow(parent); HWND hwndPanel = CreateWindowEx(WS_EX_CONTROLPARENT, app->panelClass, TEXT(""), WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, 0, 0, parent, (HMENU)(int)id, (HINSTANCE)GetWindowLongPtr(parent, GWLP_HINSTANCE), (void*)app); ALFWidgetLayoutParams p; ZeroMemory(&p, sizeof(p)); p.hwnd = hwndPanel; p.x = x; p.y = y; p.width = 0; p.height = 0; p.flags = ALF_QUERYSIZE | ALF_SENDAPPLYFONTS; ALF_AddWidgetEx(parent, &p); return hwndPanel; }