永发信息网

MFC如何创建无模式对话框?

答案:2  悬赏:80  手机版
解决时间 2021-05-14 17:25
MFC如何创建无模式对话框?
最佳答案
无模式对话框
1、首先创建对话框模板资源
2、从CDialog类派生自己的无模式对话框类:CModelessDlg
3、在合适的位置动态创建(new)CModelessDlg的对象:pDlg
4、调用pDlg的Create函数创建无模式对话框
5、调用pDlg的ShowWindow函数显示无模式对话框;
6、覆盖OnOK和OnCancel函数,执行DestroyWindow函数销毁无模式对话框
7、覆盖PosNcDestroy函数,执行delete this;
全部回答
具体实现步骤如下: 在资源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以上版本)。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
CAD图打印
天书奇谈里怎么开宝箱
给我一个3.13猎人升级天赋具体加法,要精确到
泌阳县陶瓷饰家地址有谁知道?有点事想过去
怎么能彻底解决W980死机问题
谁有手机免费看小说的网址阿,飞库,起点知道
腿脚浮肿怎么办
有什么最好的方式去释放压力
学生的单词怎么写,学生的英文单词是什么
广州,深圳到南宁,北海的机票现在大概多少票
完美世界人物形象设计修改的具体步骤,有FLAS
龙沙区东吉旅店地址在哪里啊
81级的金头陀(强化)能卖多少?
车船税第四年多少钱,小汽车车船税是多少钱一
qq三国怎么点亮的啊?
推荐资讯
合肥瑞泰和园
从小被欺骗,长大后会变成什么样子。
飞车过年会出售绝版的车吗?
沙洋县完美全国统一专卖(锦蕴日用品商行)在什
DNF武神miss怎么那么多
天门市泰洁洗衣(人民大道西)地址是什么,有没
我的会计证是08年6月发的,到现在一直没从事
分手了 是选择淡忘还是继续执著?
非主流画里经常出现的图案是什么
尿道结石怎么办?
穿越怎么打空格//
朋友间的问题
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?