gpt4 book ai didi

c++ - MFC 强制 CMultiDocTemplate 中的 CFormView 始终位于顶部

转载 作者:行者123 更新时间:2023-11-28 02:07:15 27 4
gpt4 key购买 nike

我知道如何强制 CDialog 始终位于程序中所有其他窗口的顶部……非模态。如下面的测试方法(代码)所示,您没有使用 *.DoModal 创建。我明白这一点。

void CMFCTestAApp::OnOpenNonModalDialog()
{
//dialogTest new_dialog;
//new_dialog.DoModal();

dialogTest* test_dialog = NULL;
test_dialog = new dialogTest();
if(test_dialog != NULL)
{
if(test_dialog->Create(IDD_TestA_DIALOG))
test_dialog->ShowWindow(SW_SHOWNORMAL);
}
}

但是,我对从 CMultiDocTemplate/CFormView 继承的东西做同样的事情却没有成功

问题:有没有一种方法可以将 CFormView 填充到顶部的 CMultiDocTemplate 中(在前台......就像非模态 CDialog 的行为),即使该窗口不是具有焦点的窗口。所以换句话说,我希望从 CFormView 继承的 classX 始终位于从 CView 继承的 classY 的前面。

部分成功:我能够取得部分成功。当 classY 的 OnActivateView 方法被点击时(这是应该在后台的类/窗口),然后,在它的 OnActivateView 中,我将遍历所有 classX 对象(我想要在前面的对象)并将它们带到前面使用classx->bringToTop();这确实有效,但是,出现了大量的闪烁……我猜是因为 (1) 到调用 classY 的 OnActivateView 时,classY 已经被带到所有 classX 对象的前面并且因为 (2) OnActivateView 不仅被调用一次,而且被调用大约六次(不知道为什么这么多次)......每个对象的 OnActivateView 随时被调用任何其他窗口被激活(不仅仅是当你关心的窗口被激活时)。

问题:谁能有更好的方法来实现我所缺少或不知道的这个?我已经尝试测试 classx->SetWindowPos(&classx->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE) 但这没有影响。我猜我在错误的地方使用了它,或者它在代码的另一部分中被撤消了。

最佳答案

尝试在对话框中添加 WM_ACTIVATETOPLEVEL 消息,并在发生 WA_INACTIVE 事件时使用 SetWindowPos()。

像这样:

void CMFCTestAApp::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialogEx::OnActivate(nState, pWndOther, bMinimized);

// TODO: Add your message handler code here

if (nState == WA_INACTIVE)
{
::SetWindowPos( this->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
}
}

关于c++ - MFC 强制 CMultiDocTemplate 中的 CFormView 始终位于顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com