VC下创建一个新的窗口主要有两种模式,一种是创建后主窗口失去鼠标焦点,只有子窗口能获取到用户输入和用户操作,这种方式比如网页弹出警告框,我们必须先处理弹框内的操作才能再去控制浏览器,称之为有模式对话框;另外一种是创建新窗口后主窗口与子窗口都能获取到用户焦点,这种对话框为无模式对话框。
两者的创建方法都很简单,有一些不同的地方。我们打开VC6.0,用MFC Wizard创建一个简单的窗体程序。并创建两个窗体Dialog1(无模式对话框),Dialog2(有模式对话框)
主窗体如下图
点击无模式对话框,编辑代码如下:
void CTDlg::OnClickOne()
{
// TODO: Add your control notification handler code here
CTDlg *newwindow = new CTDlg();
newwindow->Create(IDD_DIALOG1);
newwindow->ShowWindow(true);
}
代码很简单,可是我们要注意不能在这个函数里面进行资源的回收,否则程序会报错,因为毕竟newwindow已经在内存中运行了,而且在创建完毕后必须调用ShowWindow函数设置对话框显示才行,不然不会在屏幕中显示出来。
资源的销毁回收需要在子对话框的关闭操作中去处理
void CDialog1::OnClose()
{
// TODO: Add extra validation here
CDialog::OnOK();
DestroyWindow();
}
调用DestroyWindow函数实现资源回收,防止内存泄露
创建有模式对话框更简单了,我们点击右侧的按钮输入下面代码
void CTDlg::OnClickTwo()
{
// TODO: Add your control notification handler code here
CDialog2 dlg;
int iRet=dlg.DoModal();
}
其中iRet可以获取对话框的返回状态,这钟有模式对话框不存在资源回收的问题,关闭对话框不用添加DestroyWindow的操作。但是有模式对话框用起来还是不方便,大多数应用程序应该还是偏爱无模式对话框。
无模式对话框的资源回收也可以由主窗体来做,子窗体在适合的时候发送消息给主窗体,主窗体类注册一个消息处理函数,在函数中delete掉子窗体的对象。我没有写过这种方式销毁窗体对象的代码,网上也有很多这种例子,大家可以百度百度。