激活模态对话框时隐藏主MFC窗口?

4
我有一个本地的C++ MFC应用程序。它有一个基于CWnd的主窗口,用户操作可以创建模态对话框。当对话框处于活动状态时,我希望主窗口消失,对话框可见,并且主窗口的图标保留在任务栏中。
我该怎么做?
如果我隐藏主窗口(ShowWindow(SW_HIDE)),则任务栏图标会消失。如果我最小化主窗口(SW_MINIMIZE),则图标仍然存在。但是,由于对话框是由主窗口拥有的,这也会隐藏对话框。
对话框创建后,单击任务栏图标会使对话框可见。自然地,我不想要求用户这样做。
即使我在对话框的OnInit处理程序中插入ShowWindow(SW_SHOW),对话框仍然不可见。Spy++显示其可见位已设置。如果我在OnInit中添加SetWindowActive,情况也是如此。
我不感兴趣改变UI设计。当对话框处于活动状态时,用户只与其交互,并且对主窗口中的任何内容都不感兴趣。因此,主窗口应该消失。
使用Windows VS2005在WinXP32下。
4个回答

1

好的,在创建对话框并将其显示为模态的代码块中,只要将桌面窗口作为对话框的父窗口,您就可以对应用程序的主窗口进行任何想要的操作(显示/隐藏)。通常,CDialog和派生类的构造函数在父窗口参数上都有一个默认值NULL,框架最终会将其替换为AfxGetMainWnd()。相反,将CWnd::GetDesktopWindow()作为对话框的父窗口传递,然后您可能就能够隐藏主窗口了。但是,您仍然可能会遇到任务栏的问题——但我会让其他人给出提示,因为我对此一无所知。


在任务栏中隐藏:https://dev59.com/xWw05IYBdhLWcg3weBvu - Flot2011
1
将GetDesktopWindow()传递给模态对话框的构造函数会得到一个未拥有的窗口(Spy++),但模态窗口不可见。模态对话框在任务栏上添加了额外的图标。在模态对话框的OnInitDialog处理程序中添加ShowWindow(SW_SHOW)和/或SW_RESTORE没有任何效果。单击任务栏图标将恢复相应的窗口。代码: 'CMyDialog *pDlg=new CMyDialog(GetDesktopWindow()); // 以桌面为父级创建 ShowWindow(SW_MINIMIZE); // 最小化主窗口 pDlg->DoModal();'在CMyDialog::OnInitDialog中:'ShowWindow(SW_RESTORE); ShowWindow(SW_SHOW); // 以防万一 - Woody20

1
在OnInitDialog中添加以下代码。
//Set windows size zero, the windows disappear.
MoveWindow(0,0,0,0);

//If you want it invisible on taskbar. add following codes.
DWORD dwStyle = GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
dwStyle &=~WS_EX_APPWINDOW;   
dwStyle |= WS_EX_TOOLWINDOW;     
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, dwStyle);

0
也许你可以将主窗口调整为非常小的尺寸,并始终将其置于模态对话框后面。

0

你正在与操作系统作斗争。 模态对话框定义为禁用但不隐藏“主”(父)窗口。 如果您想要另一个窗口,请创建第二个窗口,但不要告诉操作系统将其视为覆盖第一个窗口的模态对话框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接