MFC创建新的对话框时,当新窗口是主窗口的子窗口时,任务栏程序图标只显示主窗口图标;但当新窗口与主窗口不为父子窗口关系时,任务栏程序图标会显示两个图标,有时候我们需要隐藏新窗口图标,只显示主窗口图标。可以通过先创建一个以桌面为父窗口的隐藏窗口,然后新创建窗口以隐藏窗口为父窗口的方法来实现。
一、创建新窗口
1.在资源视图插入Dialog
2.为Dialog创建类
3.创建对话框
MFC对话框有两种方式,分别是模态对话框和非模态对话框。
(1)模态对话框
void CtestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//创建一个模态对话框
CSecondDlg sd;
sd.DoModal();
}
模态对话框使用时,无法对父窗口进行操作,任务栏只显示主窗口图标。
(2)非模态对话框
a.非模态对话框使用时,可以对父窗口进行操作。新创建非模态对话框默认为主窗口的子窗口,任务栏只显示主窗口图标,但主窗口最小化或者隐藏窗口等操作时,非模态对话框也会随着进行相同的操作。
CSecondDlg* sd = NULL;
void CtestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
sd = new CSecondDlg();
sd->Create(IDD_SECOND); //创建一个非模态对话框,父窗口时主窗口
sd->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
}
任务栏只显示主窗口图标
主窗口最小化,新窗口也最小化
b.非模态对话框不是主窗口的子窗口时,主窗口最小化或者隐藏窗口等操作时,非模态对话框不会随着进行相同的操作,但任务栏会显示主窗口和新窗口图标。
CSecondDlg* sd = NULL;
void CtestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
sd = new CSecondDlg();
sd->Create(IDD_SECOND,GetDesktopWindow()); //创建一个非模态对话框,以桌面为父窗口
sd->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
}
任务栏会显示主窗口和新窗口图标
主窗口最小化,新窗口没有最小化
二、隐藏任务栏窗口图标
CSecondDlg* sd = NULL;
CHideDlg* hd = NULL;
void CtestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//创建隐藏对话框
hd = new CHideDlg();
hd->Create(IDD_HIDE, GetDesktopWindow());//创建一个非模态对话框,以桌面为父窗口
hd->ShowWindow(SW_HIDE); //隐藏非模态对话框
//新创建对话框以隐藏对话框为父窗口
sd = new CSecondDlg();
sd->Create(IDD_SECOND, hd); //创建一个非模态对话框,以隐藏非模态对话框为父窗口
sd->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
}
任务栏只显示主窗口图标
主窗口最小化,新窗口没有最小化
这个方法可以让任务栏只显示主窗口图标,且主窗口不会影响新创建的非模态对话框。同理,如果主窗口用SetParent设置隐藏窗口为父窗口,就可以把主窗口图标也隐藏了。