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

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

关注【以下回答由 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);
}
}
通过以上步骤,将在模态对话框弹出时,主窗口依然保持置顶效果。