我在使用vs2008的mfc开发wince程序时候遇到使用setwindowPos为主程序强制置顶失效的情况。
打开主程序后强制置顶生效,弹出模态对话框后,主窗体强制置顶失效。关闭模态对话框后,主窗体强制置顶又生效。
我怀疑是模态对话框阻塞消息导致主窗口置顶失效,我是一定要用模态对话框的,而且也要实现主窗体一直强制置顶的效果,但不知道应该怎么办,请高人帮忙!

mfc主窗口强制置顶会在模态阻塞时失效
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注
【以下回答由 GPT 生成】
解决方案: 由于模态对话框阻塞了消息,导致主窗口的置顶属性失效,可以通过以下方法来解决这个问题:
-
在主窗口类(CMainWnd)中添加成员变量
BOOL m_bIsModalDialogActive
,用于标识模态对话框是否处于激活状态。 -
修改
CMainWnd
类的OnCreate
事件,通过GWL_STYLE
和WS_EX_TOPMOST
设置主窗口为置顶窗口。添加以下代码:c++ SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) | WS_EX_TOPMOST);
-
在
CMainWnd
类中,重写OnActivateApp
事件,并添加以下代码,用于更新m_bIsModalDialogActive
变量:c++ void CMainWnd::OnActivateApp(BOOL bActive, DWORD dwThreadID) { CWnd::OnActivateApp(bActive, dwThreadID); m_bIsModalDialogActive = !bActive; }
-
在模态对话框(CMyModalDlg)中添加成员变量
CMainWnd* m_pMainWnd
,用于保存主窗口的指针。 -
在模态对话框(CMyModalDlg)的构造函数中,接受主窗口指针,并保存到
m_pMainWnd
变量中:c++ CMyModalDlg::CMyModalDlg(CWnd* pParent, CMainWnd* pMainWnd) : CDialog(IDD_MYMODALDLG, pParent) { m_pMainWnd = pMainWnd; }
-
修改模态对话框的
OnInitDialog
事件,在对话框初始化完成后,通过SetWindowPos
函数将主窗口置顶。添加以下代码:c++ m_pMainWnd->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-
修改模态对话框的
OnDestroy
事件,在对话框销毁前,通过SetWindowPos
函数将主窗口恢复正常。添加以下代码:c++ m_pMainWnd->SetWindowPos(&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-
修改主窗口类(CMainWnd)的
OnShowWindow
事件,在窗口显示和隐藏时根据m_bIsModalDialogActive
变量决定是否将主窗口置顶。添加以下代码:c++ if (!m_bIsModalDialogActive) { if (bShow && !IsWindowVisible()) { SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); } else if (!bShow && IsWindowVisible()) { SetWindowPos(&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); } }
通过以上步骤,将在模态对话框弹出时,主窗口依然保持置顶效果。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决评论 打赏 举报无用 1-