7.3动态创建按钮

单击对话框中某个按钮,就动态创建一个新按钮。
首先将程序代码恢复到创建模态对话框那个时候的代码。非模态对话框实现起来比较困难。

为该对话框添加一个按钮:
鼠标双击ResourceView->IDD_DIALOG,打开资源编辑窗口。
用鼠标单击控制面板上面的按钮控件,在对话框适当位置上拖出一个适当大小的按钮;用鼠标右键单击该按钮,选择属性对话框,将按钮的ID改为IDC_BTN_ADD,Caption改为Add。

现在实现单击Add,就动态创建一个按钮的功能。
1、为Add按钮单击消息添加消息响应函数:
鼠标右键单击Add按钮->ClassWizard->选择BN_CLICKED消息,类名CTestDlg,成员函数名默认OnBtnAdd->Add Function,Edit Code。
就定义到该消息响应函数。按钮的单击属于通告消息。

现在在按钮单击消息响应函数中实现创建一个按钮的功能:
为CTestDlg类添加一个私有的CButton成员变量:m_btn。创建按钮由CButton类成员函数Create函数来实现。
在这里插入图片描述

void CTestDlg::OnBtnAdd() 
{
 // TODO: Add your control notification handler code here
 m_btn.Create("NEW",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);
}

如果没有WS_VISIBLE,一定要调用该按钮对象的ShowWindow函数。运行如下图。在这里插入图片描述

但是当我们再次单击Add按钮时,就会出现一个非法操作对话框。
原因:再次单击时,由于m_btn对象已经和一个按钮窗口绑定了,不能重复绑定另一个按钮窗口。
因此为CTestDlg类添加一个私有BOOL类型成员变量:m_bIsCreated,用来表示是否创建了按钮窗口。在该类的构造函数中初始化为FALSE。

void CTestDlg::OnBtnAdd() 
{
 // TODO: Add your control notification handler code here
 if(m_bIsCreated==FALSE)
 {
  m_btn.Create("NEW",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);
  m_bIsCreated=TRUE;
 }
 else
 {
  m_btn.DestroyWindow();
  m_bIsCreated=FALSE;
 }
}

如果绑定了,就销毁这个按钮窗口,解除绑定。

因为CWnd对象有一个成员变量:m_hWnd,用来保存与窗口对象相关联的窗口句柄,若窗口对象没有与任何一个窗口相关联,它的值就为NULL。

void CTestDlg::OnBtnAdd() 
{
 // TODO: Add your control notification handler code here
 if(m_btn.m_hWnd==NULL)
 {
  m_btn.Create("NEW",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);
 }
 else
 {
  m_btn.DestroyWindow();
 }
}

同样能实现上述功能。

7.4控件的访问

现在在对话框上面放置3个静态文本控件和3个编辑框控件。
将静态文本框控件的文本设置为:“Numer1”,“Numer2”,“Numer3”。
在这里插入图片描述

7.4.1控件的调整

为了调整对话框上多个控件的位置,或者设置它们大小和间距,可以利用Layout菜单或者用Dialog工具栏上相应的按钮来调整。
1、利用control键选中三个静态文本控件,单击Dialog工具栏上面Align Left,使三个控件按照左边框对齐;单击Dialog工具栏上面Make Same Size,使三个控件具有相同的大小;单击Dialog工具栏上面Space Down,使三个控件之间有相同的间距。
2、利用同样的方法对三个编辑框控件进行操作。
3、只有当前编辑窗口为对话框编辑窗口时,Layout菜单和Dialog工具栏才会出现,Dialog工具栏在窗口的底部。
在这里插入图片描述

7.4.2静态文本控件

下面实现:当单击Number1这个静态文本时,将其文本变成“数值1”。
1、在此控件上鼠标右键单击,属性ID是IDC_STATIC;在此控件上鼠标右键单击,选择ClassWizard,然后发现Object IDs列表中根本没有这个ID;其他两个静态文本框属性ID也是IDC_STATIC。
2、因为静态文本框主要是起到标签作用,不来响应鼠标单击这类消息,所以他们ID都是一样。
3、所以要想让静态文本框响应鼠标单击消息,需要修改其ID,才能为它添加鼠标单击消息响应函数。
4、将Number1的ID改为IDC_NUMBER1,然后打开ClassWizard,就可以在Object IDs列表中看到这个ID了。
5、Message列表中选择BN_CLICKED消息->Add Function->Edit Code。

6、控件也是窗口,要想获得静态文本控件上面的文本,需要利用CWnd类成员函数:GetWindowText。但是首先得获得这个静态控件对象,利用CWnd类成员函数:GetDlgItem。设置静态对象的文本,利用CWnd类成员函数:SetWindowText。
CWnd* GetDlgItem( int nID ) const;

void CTestDlg::OnNumber1() 
{
 // TODO: Add your control notification handler code here
 CString str;
 if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1")
 {
  GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1");
 }
 else
 {
  GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1");
 }
}

if语句是一个逗号表达式,表达式的结果是返回最后一个表达式的返回值。
运行,发现没有达到预期效果。

原因:静态文本控件在默认状态下是不发送通告消息的。(控件一般都是发送通告消息)。
解决方法:打开Number1静态文本控件属性->style->勾选Notify(通告)
运行,就能正常执行了。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值