七 对话框

1.模态与非模态对话框

模态对话框创建

CTestDlg dlg;

dlg.DoModal();

 

非模态对话框的创建

CTestDlg *pDlg =new CTestDlg();

pDlg->Create(IDD_DIALOG1,this);

pDlg->ShowWindow(SW_SHOW);

这里第一个参数是对话框资源的ID和或话框模板的名称。

第二个参数是对话框的父窗口。

 

这里需要注意以下几点

1.  Create创建非模态对话框要用ShowWindow才会显示出来。

2.  这里用指针是因为要在堆上分配内存,在堆上分配内存是整个程序的生命周期一致的。这样做又会遇到一个问题,当这个函数体结速时,生命周期结束了,指针变量被销毁了。所指向的内存丢失了。

解决方法有两种:

一.     将指针变量声明为类的成员变量。在类的析构函数里,用delete函数释方指向的那块内存。

二.     CTestDlg中重载PostNcDestory函数,释放this指针指向的内存,delete this;

3.  如果用的是局部变量,在函数结束时会销毁局部变量。CTestDlg 被销毁了当然不会显示出来。还有一种解决方法是声明为类的成员变量。这样生命周期跟类一致。

4.  为什以模态对话框的可以用局部变量呢?这是因为模态对话框的实现机制,在弹出对话框后,创建模态对话框的函数被中止了,模态对话框关闭后,才继续执行创建函数体其它部份。

5.  对于非模态对话框,如果有ID值为IDOKIDCANCEL的按钮就必须重写OnOKOnCancel函数,在重写的函数中调用DestoryWindow函数销毁销口。因为基类虚函数OnOk按钮最终调用的EndDialog函数只会隐藏非模态窗口,但会销毁模态窗口。

2.动态创建按钮

知识点:按钮这类消息属于通告消息。

 

m_btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);

这里需要注意一下如果没有指定WS_VISIBLE随后一定要ShowWindow按钮才会显示出来。

但这样会有一个出现问题,因为用一个按钮动态的创建了另一个按钮后新创建的窗口就会与按钮相关联,已经绑定在一起了,再次创建就会出现问题。如何解决呢?

static BOOL  m_bIsCreated=FALSE;//只在第一次分配内存时赋值了,以后都不会重新赋值。

   if(m_bIsCreated==FALSE)

   {

      m_btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);

      m_bIsCreated=TRUE;

   }

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值