第七章、对话框(一)
1. 所有的控件类都是由Cwnd类派生而来的,实际上,空间也是窗口;
2. 模态对话框垄断了用户的输入;
3. 在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的;对话框资源也有一个相应的基类:CDialog
对资源的操作是通过一个类来完成的,那么就需要创建一个类与这个新建的对话框资源相关联;(在对话框资源上左键双击,创建一个关联的类)
4. 头文件大小写无所谓,一样能识别;
5.模态对话框的创建
用生成的类创建一个新的对象,然后调用CDialog类的成员函数:DoModal
CTestDlgdlg;
dlg.DoModal();
需要注意的是必须在视类中添加新生成的类的头文件定义,不然无法识别;
5. 非模态对话框的创建
//创建非模态对话框
CTestDlg *pDlg = newCTestDlg;//注意这里的指针是个局部变量
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_SHOW);//用create创建的必须得用这个显示
6. 对于非模态对话框来说,如果有一个ID值为IDOK,或者IDCANCEL的按钮,就必须重写基类的虚函数,并在重写的函数中调用DestroyWindow函数,以完成销毁对话框的工作;
7. 动态创建按钮
先添加一个CButton成员变量,然后用成员函数Create来实现
if (m_bIsCreated ==FALSE)//利用一个全局变量来判断,或者静态变量
{
//资源号123是随便给的
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;
}
因为按钮对象与一个窗口绑定在一起了,就要先销毁这个窗口;
第二种判断方法:
if (!m_btn.m_hWnd)
{
m_btn.Create("New",BS_DEFPUSHBUTTON| WS_VISIBLE |WS_CHILD,CRect(0,0,100,100),this,123);
}
else
{
m_btn.DestroyWindow();
}
8. 控件的访问
利用ctrl键来对已有的控件的复制和粘贴
9. 静态文本控件
静态文本框主要是起标签作用的,并不是用来响应诸如鼠标单击这类消息的,所以他们的ID都是一样的;默认都是IDC_STATIC;
获取静态文本控件上显示的文本
CString str;
if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str == "Number1:")
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");//设置
}
else
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
}
静态文本控件在默认状态下是不发送通告消息的,所以要改属性,选中Notify选项;
10.编辑框控件
实现输入两数字相加得出结果:第一种方法
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
num1 = atoi(ch1);//字符转换为int型
num2 = atoi(ch2);
num3 = num1+ num2;
itoa(num3,ch3,10);//10代表十进制
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
第二种方法:CWnd提供了GetDlgItemText函数等价于GetDlgItem和GetWindowText函数; 同样还有SetDlgItemText函数;
第三种方式:
int num1,num2,num3;
num1 = GetDlgItemInt(IDC_EDIT1);
num2 = GetDlgItemInt(IDC_EDIT2);
num3 = num1+ num2;
SetDlgItemInt(IDC_EDIT3,num3);
第四种方法:将编辑框分别与对话框类的三个成员变量相关联;(最简单的访问方式)
在DoDataExchange函数内部实现了对话框控件与类成员变量的关联;(DDX为前缀的函数分别用于不同控件的数据交换)
但是,为了让数据交换生效,就必须去调用DoDataExchange函数,但程序代码不是直接调用这个函数,而是需要去调用UpdateData这个函数;
UpdateData();
m_num3 = m_num1 + m_num2;
UpdateData(FALSE);
DDV为前缀的数据校验函数
第五种方法:把控件与一个变量相关联,即控件变量
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
m_edit1.GetWindowText(ch1,10);
m_edit2.GetWindowText(ch2,10);
num1 = atoi(ch1);
num2 = atoi(ch2);
itoa(num3,ch3,10);
m_edit3.SetWindowText(ch3);
10. 对话框伸缩功能的实现
static CRect rectLarge;
static CRect rectSmall;
if(rectLarge.IsRectNull())
{
CRectrectSeparator;
GetWindowRect(&rectLarge);
GetDlgItem(IDC_SEPERATOR)->GetWindowRect(&rectSeparator);
rectSmall.left =rectLarge.left;
rectSmall.top =rectLarge.top;
rectSmall.right =rectLarge.right;
rectSmall.bottom =rectSeparator.bottom;
}
if (str == "收缩<<")
{
SetWindowPos(NULL,0,0,rectSmall.Width(),rectLarge.Height(),SWP_NOMOVE| SWP_NOZORDER);
}
else
{
SetWindowPos(NULL,0,0,rectSmall.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);
}
11. 默认输入焦点可在资源的熟悉选项卡的styles可看到;
12. 对于一个WM_CHAR消息来说,它的wParam参数保存的就是字符的ASCII码;
13. 编辑控件框没有选中Multiline选项,即这个编辑框不支持多行,因此无法接收回车键按下的消息;
14. 当用户按下回车键的时候,Windows将会查看对话框中是否存在指定的默认按钮,如果有,就调用该默认按钮单击的响应函数,如果没有,就会调用虚拟的OnOK函数,即使对话框中没有包含默认的OK按钮;