MFC----对话框(一)
2011年03月14日
一.对话框的创建和显示
1.在MFC中,所有的控件类都是由CWnd类派生来的,因此,控件实际上也是窗口,实际上,控件通常是作为对话框的子窗口而创建的。
2.有两种类型的对话框:模态对话框和非模态对话框。
3.在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。
4.创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能时创建并显示一个模态对话框。
例:CTestDlg dlg;
dlg.DoModal();
5.如果要创建非模态对话框,则需要利用CDialog类的Create成员函数。当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将这个对话框显示出来。在创建非模态对话框时,不能把对话框对象定义为局部对象。对于这个问题,有两种解决办法,一种就是把这个对话框对象定义为视类的成员变量;另一种方式就是将它定义为指针,在堆上分配内存。在堆上分配的内存,与程序的整个生命周期是一致的。
例:CTestDlg *pDlg=new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
上面程序仍有问题,首先,定义的pDlg这个指针变量是一个局部对象,这样当它的生命周期结束时,它保存的内存地址就丢失了,那么在程序中也就无法再引用它所指向的那块内存了。这个问题的解决办法有两种:一是将这个指针变量定义为视类的成员变量,然后再视类的析构函数中调用delete函数来释放这个指针变量所指向的那块内存。二是在CTestDlg类中重载PostNcDestroy虚函数,释放this指针所指向的内存。
二.动态创建按钮
例:m_btn.Create();
m_btn.DestroyWindow();
三.控件的访问
逗号表达式的结果是最后一个表达式的返回值。
静态文本控件在默认状态下是不发送通告消息的,并不会选中Notify这个选项。为了使一个静态文本控件能够响应鼠标单击消息,那么需要进行两个特殊的步骤:第一步,改变它的ID;第二步,在它的属性对话框中选中Notify选项。
C语言提供了一个这样的转换函数:atoi,可以将一个由数字组成的字符串转换为相应的数值。还有另一个相反的函数:itoa()。
在DoDataExchage函数内部实现了对话框控件与类成员变量的关联。在程序代码中从来不直接调用这个函数,而是通过CWnd类的另一个成员函数UpDateData来调用。
MFC提供了多种以DDX_为前缀的函数,这些函数分别用于不同控件的数据交换。
MFC也提供了多个以DDV_为前缀的数据校验函数。
DDX――Dialog Data Exchage,对话框数据交换; DDV――Dialog Data Validation,对话框数据校验。
共有七种访问对话框控件的方式:
1.GetDlgItem()->Get(Set)WindowText()
2.GetDlgItemText()/SetDlgItemText()
3.GetDlgItemInt()/SetDlgItemInt()
4.将控件和整型变量相关联
5.将控件和控件变量相关联
6.SendMessage()
7.SendDlgItemMessage()
四.对话框伸缩功能的实现
CRect类有两个成员函数 可以用来判断一个矩形是否为空:IsRectEmpty(), IsRectNull()\
调用CWnd类的GetWindowRect可以获得对话框的位置。
利用SetWindowPos()函数来设置对话框的位置。
五.输入焦点的传递
在MFC中,默认情况下,当在对话框中按下回车键时,会选择对话框中默认按钮的消息响应函数来处理这一事件。
如果想要获得对话框中某个控件的下一个控件的句柄,可以调用GetNextWindow函数、GetWindow()、GetNextDlgTabItem(),最后一个函数是查找具有Tab stop属性的控件,并按Tab顺序依次查找各控件。
SetWindowLong函数可以修改窗口已指定的过程函数。
GetFocus()和SetFocus()
2011年03月14日
一.对话框的创建和显示
1.在MFC中,所有的控件类都是由CWnd类派生来的,因此,控件实际上也是窗口,实际上,控件通常是作为对话框的子窗口而创建的。
2.有两种类型的对话框:模态对话框和非模态对话框。
3.在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。
4.创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能时创建并显示一个模态对话框。
例:CTestDlg dlg;
dlg.DoModal();
5.如果要创建非模态对话框,则需要利用CDialog类的Create成员函数。当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将这个对话框显示出来。在创建非模态对话框时,不能把对话框对象定义为局部对象。对于这个问题,有两种解决办法,一种就是把这个对话框对象定义为视类的成员变量;另一种方式就是将它定义为指针,在堆上分配内存。在堆上分配的内存,与程序的整个生命周期是一致的。
例:CTestDlg *pDlg=new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
上面程序仍有问题,首先,定义的pDlg这个指针变量是一个局部对象,这样当它的生命周期结束时,它保存的内存地址就丢失了,那么在程序中也就无法再引用它所指向的那块内存了。这个问题的解决办法有两种:一是将这个指针变量定义为视类的成员变量,然后再视类的析构函数中调用delete函数来释放这个指针变量所指向的那块内存。二是在CTestDlg类中重载PostNcDestroy虚函数,释放this指针所指向的内存。
二.动态创建按钮
例:m_btn.Create();
m_btn.DestroyWindow();
三.控件的访问
逗号表达式的结果是最后一个表达式的返回值。
静态文本控件在默认状态下是不发送通告消息的,并不会选中Notify这个选项。为了使一个静态文本控件能够响应鼠标单击消息,那么需要进行两个特殊的步骤:第一步,改变它的ID;第二步,在它的属性对话框中选中Notify选项。
C语言提供了一个这样的转换函数:atoi,可以将一个由数字组成的字符串转换为相应的数值。还有另一个相反的函数:itoa()。
在DoDataExchage函数内部实现了对话框控件与类成员变量的关联。在程序代码中从来不直接调用这个函数,而是通过CWnd类的另一个成员函数UpDateData来调用。
MFC提供了多种以DDX_为前缀的函数,这些函数分别用于不同控件的数据交换。
MFC也提供了多个以DDV_为前缀的数据校验函数。
DDX――Dialog Data Exchage,对话框数据交换; DDV――Dialog Data Validation,对话框数据校验。
共有七种访问对话框控件的方式:
1.GetDlgItem()->Get(Set)WindowText()
2.GetDlgItemText()/SetDlgItemText()
3.GetDlgItemInt()/SetDlgItemInt()
4.将控件和整型变量相关联
5.将控件和控件变量相关联
6.SendMessage()
7.SendDlgItemMessage()
四.对话框伸缩功能的实现
CRect类有两个成员函数 可以用来判断一个矩形是否为空:IsRectEmpty(), IsRectNull()\
调用CWnd类的GetWindowRect可以获得对话框的位置。
利用SetWindowPos()函数来设置对话框的位置。
五.输入焦点的传递
在MFC中,默认情况下,当在对话框中按下回车键时,会选择对话框中默认按钮的消息响应函数来处理这一事件。
如果想要获得对话框中某个控件的下一个控件的句柄,可以调用GetNextWindow函数、GetWindow()、GetNextDlgTabItem(),最后一个函数是查找具有Tab stop属性的控件,并按Tab顺序依次查找各控件。
SetWindowLong函数可以修改窗口已指定的过程函数。
GetFocus()和SetFocus()