陈仲维与林伟健:实现非模态对话框
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 16:47:04
实现非模态对话框
(Abbey发表于2004-2-1 2:14:00)
在资源IDE中新建一个对话框IDD_ModelssDlg,并设置为可见;
利用Wizard为这个对话框建立一个类CModelessDlg;
为CModelessDlg添加一个数据成员CDialog * m_pParent;
为CModelessDlg添加一个新的构造子CModelessDlg(CDialog * pParent),在其中将pParent赋值给m_pParent;
CModelessDlg::CModelessDlg(CDialog *pParent)
{
m_pParent = pParent;
}
为CModelessDlg添加一个成员函数Create(),在其中调用CDialog::Create(CModelessDlg::IDD);
BOOL CModelessDlg::Create()
{
return CDialog::Create(CModelessDlg::IDD);
}
重载OnOK()和OnCancel(),添加对DestroyWindow()的调用以销毁非模态对话框本身。
void CModelessDlg::OnOK()
{
UpdateData();
DestroyWindow();
}
void CModelessDlg::OnCancel()
{
UpdateData(FALSE);
DestroyWindow();
}
在CVCDlg中添加一个数据成员CModelessDlg * m_MDlg;
在CVCDlg的构造子中调用m_MDlg = new CModelessDlg(this)以构造非模态对话框对象;
CVCDlg::CVCDlg(CWnd* pParent) : CDialog(CVCDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_MDlg = new CModelessDlg(this);
}
在CVCDlg的析构子中调用delete m_MDlg以析构非模态对话框对象;
CVCDlg::~CVCDlg()
{
if (m_MDlg != NULL)
delete m_MDlg;
}
在应用程序对话框模板中增加一个按钮并映射其点击消息至OnOpenDlg(),并在OnOpenDlg()中调用m_MDlg->Create()来创建并显示非模态对话框,将m_MDlg与显示的非模态窗口绑定;
void CVCDlg::OnOpenDlg()
{
if (m_MDlg->GetSafeHwnd() == NULL)
m_MDlg->Create();
else
m_MDlg->SetWindowPos(&wndTopMost,300,400,NULL,NULL,SWP_NOSIZE);
}
在OnOK()中调用if (m_MDlg->GetSafeHwnd() != NULL) m_MDlg->OnOK()以实现可能已经打开的非模态对话框的数据交换。注意要进行这样的调用必须将CModelessDlg中OnOK()设置为public型,并且此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg != NULL来作为测试条件。在OnCancel()中同样处理。
void CVCDlg::OnOK()
{
//此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg != NULL来作为测试条件,下同
if (m_MDlg->GetSafeHwnd() != NULL)
m_MDlg->OnOK(); //要进行这样的调用必须将CModelessDlg中OnOK()设置为public型
CDialog::OnOK();
}
void CVCDlg::OnCancel()
{
if (m_MDlg->GetSafeHwnd() != NULL)
m_MDlg->OnCancel(); //要进行这样的调用必须将CModelessDlg中OnCancel()设置为public型
CDialog::OnCancel();
}
另有:利用SetWindowPos()函数以设置窗口的位置,用CenterWindow()使窗口自动居中(基于VC++2.0以上版本)。
下载源代码
最新评论 [发表评论] 查看所有评论 推荐给好友 打印
生成非模态对话框时,在函数void CVCDlg::OnOpenDlg()中使用语句p_MDlg->Create(CModelessDlg::IDD,this);
不可以吗? ( wxg00544 发表于 2006-5-12 18:59:00)
为什么不在.h 中添加变量 m_MDlg
在INIT 中 CREATE
在DestoryWindow 中DestoryWindow ??? ( pepperdiyu 发表于 2004-8-13 14:41:00)
1)CDialog * m_pParent 有什么作用?
2)在vc.net中,照做,可非模式窗体未显示 ( vspath 发表于 2004-5-28 16:40:00)
欢迎加盟中国微型软件开发中心,网站正建设中。。。
为你量身定做各种小型软件,
http://minisoft.91x.net/
联系方式:
email:ldh5118@sohu.com
qq : 36201365 ( rbird5118 发表于 2004-4-14 15:55:00)
欢迎加盟中国微型软件开发中心,网站正建设中。。。
为你量身定做各种小型软件,
http://minisoft.91x.net/
联系方式:
email:ldh5118@sohu.com
qq : 36201365 ( rbird5118 发表于 2004-4-14 15:55:00)
.......................................................
More...
实现非模态对话框
在打开文件对话框上实现图象预览
js 确认对话框
通用对话框的使用
VB- 工具栏、对话框
对话对话框—浅析windows系统对话框规范
如何避免对话框闪屏
VC选择文件对话框CFileDialog
skinmagic改变对话框皮肤【转】
对话框-系统设置主界面
Product?license?has?expired?对话框?解决方法_weimeile...
工具--选项,在对话框中选定修订。
为对话框程序添加工具条和状态栏
OpenFileDialog对话框的Filter属性说明:
MFC基于对话框背景颜色的修改
总是弹出Windows Installer对话框解决方案
CFileDialog文件选择对话框的使用
在symbian上使用文件浏览对话框
VC:个性化对话框2_真永远
在另存为…对话框中添加快捷方式
关于模式与非模式对话框-new
MFC窗口/对话框 expected constant expression 'IDD
对话框上右下角显示resize icon(可以拖动改变对话框的大小)
(!!!)MSChart控件的属性与属性对话框