1 模态非模态对话框
由于我们这里使用按下菜单栏的选项弹出对话框,所以放在框架类中使用。注意:按下选项可以使用左键按下事件或者选项对应的处理事件。我们使用后者,这点需要区分好。
‘
1)先在菜单栏添加对话框的选项。
2)在资源视图添加对话框。
3)添加模态对话框的处理程序。
4)上面创建好了模态对话框,这里开始创建非模态对话框,重复2,3步骤即可。
5)编写模态对话框代码。
void CMainFrame::OnDialogExecmt()
{
// TODO: 在此添加命令处理程序代码
CDialog dlg(IDD_DIALOG1);
dlg.DoModal();//阻塞,所以模态会导致无法处理程序其它内容
}
6)编写非模态对话框代码。由于非模态对话框一直存在,但是对应的局部变量被释放了,所以会出现问题,我们需要使用成员变量,并且放在框架的OnCreate创建,否则第二次再创建就会出问题。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
//实际就这一句,上面都是系统创建的代码
m_dlg.Create(IDD_DIALOG2);
return 0;
}
void CMainFrame::OnDialogShowfmt()
{
// TODO: 在此添加命令处理程序代码
m_dlg.ShowWindow(SW_NORMAL);
}
7)结果。
模态对话框结果:
非模态对话框结果,可以看到我们可以操作其本身窗口,而不需要先关闭对话框,而模态只能关闭对话框才能继续操作窗口本身。
2 自定义对话框
1)按下图操作。
此时操作完成后可以在类视图中看到MyDialog类。
2)添加刚刚自定义的对话框与菜单栏相关联。
3)编写代码。右击菜单栏中的自定义对话框选项,点击处理事件,然后就会弹出下面的函数,前面已经说过,不再多说。
void CMainFrame::OnDialogMydialog()
{
// TODO: 在此添加命令处理程序代码
CDialog dlg(IDD_DIALOG3);
dlg.DoModal();
}
结果,正常显示,大家可以按照自己的方法处理程序。