Win32窗口控件最简洁的传统组织方式是什么?
Win32 容器控件子控件的字体继承与WM_COMMAND消息传递问题解决
一、解决子控件不继承主窗口字体的问题
STATIC类容器默认不会自动将自身字体传递给子控件,需手动处理字体同步:
- 方案1:创建子控件时显式指定字体
调用CreateWindowEx创建按钮等子控件时,将主窗口(或容器)的字体作为最后一个参数传入:// 获取主窗口字体 HFONT hMainFont = (HFONT)SendMessage(hMainWnd, WM_GETFONT, 0, 0); // 创建按钮,父窗口为容器hContainerWnd,指定字体 HWND hBtn = CreateWindowEx(0, L"BUTTON", L"Click Me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 100, 30, hContainerWnd, (HMENU)ID_BTN_TEST, hInst, hMainFont); - 方案2:容器窗口过程中转发WM_SETFONT消息
为STATIC容器子类化自定义窗口过程,当容器收到WM_SETFONT消息时,同步字体给所有子控件:
之后只需给容器设置一次主窗口字体,所有子控件自动同步:LRESULT CALLBACK ContainerWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { switch(msg) { case WM_SETFONT: // 先处理自身字体设置 LRESULT result = DefSubclassProc(hWnd, msg, wParam, lParam); // 遍历子控件同步字体 HWND hChild = GetWindow(hWnd, GW_CHILD); while(hChild) { SendMessage(hChild, WM_SETFONT, wParam, TRUE); hChild = GetWindow(hChild, GW_HWNDNEXT); } return result; default: return DefSubclassProc(hWnd, msg, wParam, lParam); } } // 子类化容器窗口 SetWindowSubclass(hContainerWnd, ContainerWndProc, 0, 0);SendMessage(hContainerWnd, WM_SETFONT, (WPARAM)hMainFont, TRUE);
二、解决WM_COMMAND消息无法传递到主窗口的问题
按钮父窗口为STATIC容器时,WM_COMMAND消息会先发送给容器窗口过程,需在容器的自定义窗口过程中转发给主窗口:
在上述ContainerWndProc中添加:
case WM_COMMAND: // 将消息转发给容器的父窗口(主窗口) SendMessage(GetParent(hWnd), msg, wParam, lParam); return 0;
这样按钮触发的WM_COMMAND就能正常传递到主窗口的窗口过程处理。
三、关于容器覆盖按钮的补充说明
当按钮作为主窗口子控件时,容器周期性覆盖按钮是因为容器Z轴顺序高于按钮。可通过SetWindowPos调整按钮Z顺序,使其置于容器之上:
SetWindowPos(hBtn, hContainerWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
但既然你倾向容器作为按钮父控件的方案,完成前两点处理即可满足需求。
内容的提问来源于stack exchange,提问作者dylanweber
相关产品推荐
相关产品推荐

