📄 07.4.3 编辑框控件.txt
字号:
可以看到, ClassWizard又添加了两个 DDV_Mi nMaxInt函数。通过这个函数,设定了两个编辑框控件的取值应在 O到 100之间。 MFC也提供了多个以 DDV一为前缀的数据校验函数,读者可以在 MSDN中查看一下这些函数。
~细iR眉 DDX一-Dialog Data Exchange,对话框数据交换;
DDV一一Dialog Data Validation,对话框数据校验。
5.第五种方式
下面,我们把编辑框控件再与一个变量相关联,但与上面不同的是,此次关联的是一个控件变量,即代表控件本身。我们先为 IDCEDIT1编辑框控件增加一个控件类型的变
量: m editl。同样,需要利用ClassWizard
打开增加成员变量对话框。这里,变量的3 类别应选择ControI.此时,变量类型会自V......h JYPe: 动变为CEdit,如图7.29所示。单击【OK】
际dlt 3 按钮完成控件变量的添加。利用同样的方Oeaul,... 法为 IDC EDIT2和 IDC EDIT3编辑框控-幅a:......,件分别增加一个控件类型的变量: m_edit2 和m-edit3。图7.29为控件增加一个与之关联的控件类型变量这时,在CTestDlg头文件中可以看到,为CTestDlg类增加了三个 CEdit类型的成员变量,代码如例7-23所示。
~IJ 7-23
// Dialog Data
// {{AFX_DATA(CTestDlg)
enum { 100 = IDD_DIALOGl } ;
CEdit ffi_edit3;
CEdit ffi_edit2;
CEdit ffi_edi t工;
int ffi_numl;
int ffi_ num2 ;
int ffi_num3 ;
//} }AFX_DATA
同时,在CTestDlg类的DoDataExchange函数中增加了三个 DDX Control函数,分别将一个对话框控件与一个控件变量相关联,代码如例7-24所示。
例7-24
void CTestDlg : : DoDataExchange (CDataExchange* pDX) { CDialog : : DoDataExchange (pDX) ;
// {{AFX_DATA_MAP(CTestDlg)
DDX_Control(pDX,工DC_EDIT3 , ffi_edit3);
DDX_Control(pDX,工DC_EDIT2 , ffi_edit2);
DDX_Control(pDX,工DC_EDIT1 , ffi_edit1);
DDX_Text(pDX , IDC_EDITl , ffi_num1) ; DDV_MinMaxlnt(pDX , ffi_ nuffi1 , 0 , 100); DDX_Text(pDX , IDC_ EDIT2 , ffi_ num2) ; DDV_MinMaxlnt(pDX , ffi_ nuffi2 , 0 , 100) ;
创建~~ 1245
第7
DDX_Text(pDX , 工 DC_EDIT3, m.一口um3) ;
II}}AFX_DATA_MAP
因为这些控件变量代表的就是控件本身,并且 CEdit类派生于 CWnd类,因此,可以利用这些控件变量调用 GetWindowText和 SetWindowText这两个函数来获取和设置编辑框的文本。通过这种方法实现上述加法功能的具体代码如例 7-25所示。
例 7-25
void CTestDlg::OnBtnAdd()
{ int numl , num2 , num3; char chl[10] , ch2[10] , ch3[10]i
m_editl.GetWindowText(chl , 10);
m_edit2.GetWindowText(ch2 , 10);
numl = atoi(chl);
num2 = atoi(ch2);
num3 = numl + num2;
itoa(口um3, ch3, 10);
m_edit3.SetWindowText(ch3) ;
读者可以试试这段代码,将会发现它同样实现了所需的功能。
6.第六种方式
前面已经介绍过, Windows程序都是基于消息的系统,因此,为了获取或设置窗口的文本,只要知道获取或设置窗口文本的消息,就可以通过 SendMessage来发送这条消息,从而获取或设置窗口的文本 o Windows系统中,获取窗口文本的消息是 WM_GETTEXT,发送该消息后,系统将把指定窗口的文本复制到调用者提供的一个缓存中。在这个消息的两个附加参数中, wParam指定将复制的字符数, lParam就是调用者提供的用来保存窗口文本的缓存地址。
而设置窗口文本的消息是 WMJETEXT,这个消息的wParam参数没有被使用,值为 0, lParam参数指定了用来设置窗口文本的字符串地址。
例 7-26就是利用 Platform SDK的 SendMessage函数,通过发送 WM_GETTEXT消息获取前两个编辑框控件的文本,接着将它们转换为相应的数值并完成加法计算,然后将结果转换为相应的字符串,最后再发送 WM S ENTTEXT消息,用得到的结果字符串设置第三个编辑框文本的实现代码。
void CTestDlg::OnBtnAdd()
{
1. int num1 , num2,num3 ;
2. char ch1[10] , ch2[10] , ch3[10] ; ,
3 . : : SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd , WM_GETTEXT , 10 , (LPARAM) ch1) ;
4. :: SendMessage(m_edit2 .m_hWnd, WM_GETTEXT , 10 , (LPARAM)ch2);
5 . num1 = atoi(chl) ;
6. num2 = atoi(ch2) ;
7 . num3 = numl + num2;
8 . itoa(num3 , ch3 , 10);
9 . m_edit3 . SendMessage(WM_SETTEXT , 0 , (LPARAM)ch3) ;
对于上述例 7-26所示代码,有以下几点说明:
· 因为
Platform SDK和 CWnd类都提供 SendMessage函数,所以,如果想要调用 PlatfOIII1 SDK的函数,则前面必须加上两个冒号( :: ) ,就像上述代码中第 3行和第 4行代码那样。
· 如果调用的是
SDK SendMessage函数,第 -个参数是窗口的句柄。根据前面的知识,我们知道每个窗口类对象都有一个保存了窗口句柄的成员 m hW时,因此对于编辑框控件来说,可以首先获取编辑框窗口对应的 C++对象的指针(即上述第 3行代码中调用 GetDIgItem函数的作用),然后通过该指针获得窗口句柄(即 CWnd类的 m hWnd成员变量)。
·
因为先前我们已经把编辑框控件与一个控件对象相关联了,所以可以直接利用该对象来获取其窗口句柄,即像上述第 4行代码那样,直接利用 m edit2对象获得第二个编辑框的窗口句柄: m_hWnd。
·
因为编辑框控件也是窗口,所以可以调用该对象的 SendMessage函数来发送相应消息,就像上述第 9行代码那样,直接调用 m edit3对象的 SendMessage函数通过发送 WM SETTEXT消息来设置第三个编辑框的文本。此时,像前面介绍的所有 CWnd类成员函数一样, SendMessage函数就不需要窗口句柄这个参数了。
. SendMessage函数的最后一个参数要求是 LPARAM类型,因此在代码中必须进行
强制转换。
读者可以试试上述代码,会发现它一样能够实现所需的功能。
7. 第七种方式
这种方式也是通过发送消息来完成对控件的访问,但这时是直接给对话框的子控件发送消息,使用的函数是 SendDlgItemMessage,该函数的声明形式如下所示 :
LRESULT SendDlgItemMessage ( int nID, UINT message, WPARAM wParam = 0 , LPARAM lParam = 0 );
可以看到,这个函数的后三个参数与 SendMessage函数的相同,它的第一个参数指定了将接收当前发送的这条消息的对话框控件。实际上, SendDlgltemMessage函数的功能相
当于把上面的 GetDlgltem和 SendMessage这两个函数组合起来了。因为 SendDlgItem Message函数本身就是在一个对话框中给它的子控件发送消息时使用的,所以在调用时,不必先获得子控件对象,再发送消息,可以直接给子控件发送消息。如例 7-27所示就是利用 SendDlgItemMessage函数实现本例所需功能的代码。
void CTestDlg : :OnBtnAdd()
int num1 , num2 , num3;
char ch1[101 , ch2[101 , ch3[101;
SendDlgltemMessage(IDC_EDIT1, WM_GETTEXT , 10 , (LPARAM)ch1);
SendDlg工temMessage(工DC_EDIT2, WM_GETTEXT , 10 , (LPARAM)ch2);
num1 = atoi(ch1);
n山n2 = atoi(ch2);
num3 = numl + num2;
itoa(num3 , ch3 , lO);
SendDlg工 temMessage(IDC_EDIT3, WM_SETTEXT , 0 , (LPARAM)ch3);
读者可以试试上述例 7-27所示的代码,会发现它一样能够实现所需的功能。
另外,如果要获得编辑框中复选的内容,可以利用 EM_GETSEL消息来实现。这个消息的 wParam参数将接收复选内容的开始位置, lParam参数将接收复选内容的结束位置。这两个参数都要求是指向 DWORD类型的指针。与 EM_GETSEL消息对应的是 EM_SETSEL消息,该消息用来设置编辑框控件中的复选内容。下面,我们利用这个消息设置上例中第三个编辑框的复选内容,可以在上述例 7-27所示代码的最后再加上下面这条语句:
SendDlg工temMessage(工DC_EDIT3, EM_SETSEL , l , 3);
EM开头的消息是指编辑框控件消息 ( Edit Control Message )。
Build并运行 Mybole程序,打开测试对话框,在前两个编辑框中输入两个数值,单击 Add按钮,求和结果出现在第三个编辑框中了,但是并没有看到复选的效果。我们知道,如果要对编辑框控件的内容进行复选,当前焦点应该位于这个编辑框上。可是,当我们单击 Add按钮后,焦点将位于这个按钮上。因此为了看到第三个编辑框上的复选内容,需要把焦点转移到这个编辑框上,这可以利用 CWnd类的一个成员函数: SetFocus来实现。在上面新添加的 SendDlgltemMessage函数之后再添加下面这条语句:
m_edit3.SetFocus();
Build并运行 Mybole程序,打开测试对话框,在前两个编辑框中输入两个数,单击
Add按钮,求和结果出现在第三个编辑框中了,并且看到刷刷刷 rm 巴J I 了复选的内容。如图 7.30所示。阳.er2: 1456 旦旦j 对于 EM_SETSEL消息,还有一种特殊的情况,如果
半
阳berl:罔_1 这个消息的 wParam参数值为 0, IParam参数值为一l,那么编辑框控件中的所有内容都将被复选。当你想选中编辑框中的所有内容,但又不知道内容的长度时,这将非常有
图 7.30编辑框内容的复选效果 用。上面总共介绍了七种访问对话框控件的方式,下面是对这些方式的一个总结:
. GetDIgltemO->Get(Set)WindowTextO
. GetDlgltemTextO/SetDlgltemTextO
. GetDIgltemIntO/SetDlgItemIntO
. ·将控件和整型变量相关联
·将控件和控件变量相关联
. SendMessageO
. SendDIgltemMessageO
读者在编写程序时,可以根据自己的需要选择其中的一种或两种方式来使用,其中最常用的是第一种、第四种和第五种。另外,在把控件和变量相关联时,可以根据需要与特定类型的变量相关联,例如如果需要得到编辑框控件中的字符串内容,可以把编辑框控件与一个 CString类型的变量相关联。在利用 MFC编程时, SendMessage和 ' SendDIglternMessage方法用得比较少。上述方法中,读者一定要掌握 GetDIgltem这个函数的用法,在对话框编程中经常会用到这个函数。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -