如何在 MFC 对话框中保持控件的 Z 顺序?
Posted
技术标签:
【中文标题】如何在 MFC 对话框中保持控件的 Z 顺序?【英文标题】:How to keep Z-order of a control in MFC dialog? 【发布时间】:2011-12-10 14:09:52 【问题描述】:它开始让我发疯,但我不知道如何在 z 顺序中保持子控件的位置。 在 MFC 对话框资源编辑器的设计时,我在底部有 STATIC 控件(CStatic 的后代)(选项卡顺序编号 1),即。它与按钮、列表框等其他控件重叠。
在运行时,对话框处理 WM_TIMER 消息,并在 OnTimer 处理程序中移动 STATIC 控件:
void CTestMFCDlg::OnTimer(UINT_PTR nIDEvent)
...
m_stMyStatic.SetWindowPos(&this->wndBottom, xpos, ypos, 0, 0, SWP_NOSIZE);
...
在为子类 CStatic 控件调用 SetWindowPos 之后,无论我在第一个参数中传递什么,它都会在对话框中的其他控件上绘制。
知道如何将控件始终保持在 Z 顺序的底部吗?
【问题讨论】:
您的对话框中有WS_CLIPSIBLINGS
样式吗?如果不是,则无论 z 顺序如何,控件都可能在彼此之上绘制。无论如何,您应该检查窗口的实际 z 顺序(通过 win-spy)。
对话框的剪辑兄弟属性设置为 true。我确实使用 Spy++ 检查了正在运行的应用程序,但没有找到在哪里可以阅读有关控件的 z 顺序的信息。
这里:***.com/questions/160105/…
@Michael> 不幸的是,这不包括我的问题,即。在控件更改其左上角坐标后忽略 z 顺序。
@David Unric - Spy++ 在 Windows 视图中按 Z 顺序对兄弟控件进行排序。此外,选择属性,Prev Window 和 Next Window 指示 Z-order
【参考方案1】:
答案很简单。我只是忽略了 SetWindowPos 文档中的一个标志。 为了防止 z 顺序发生变化,只需传递 SWP_NOZORDER 标志,因此函数调用应如下所示:
m_stMyStatic.SetWindowPos(NULL, xpos, ypos, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
【讨论】:
以上是关于如何在 MFC 对话框中保持控件的 Z 顺序?的主要内容,如果未能解决你的问题,请参考以下文章