基于消息的方式 访问控件

Windows程序都是基于消息的一个程序系统,我们要获取一个窗体的文本可以通过发送一个消息获取,只要知道窗体发送的消息是一个什么样的消息,就可以通过SendMessage获取这个消息。

WM_GETTEXT:

SendMessage(

HWND hWnd;

WM_GETTEXT:

wParam = (WPARAM) cchTextMax;

lParam = (LPARAM) lpszText;

 Param 表示要拷贝多少数目的字符

lParam 你所提供的buffer用来保存窗体的文本。

我们要获取的文本是谁的文本,句柄就是谁的句柄。

我们可以先获取这个控件的指针,所有跟窗口相关的类都有一个数据成员m_hWnd,保存了相对应的句柄。

例:

::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)chr1);
::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)chr1);
GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)chr1);
m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)chr1);

以上这4中代码都可以实现。

 

访问控件的方式:

也是发送消息,给一个对话框子控件发送消息。SendDlgItemMessage

LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

第一个参数这个控件的ID号,后边的参数,跟SendMessage就是一样的了。

例:

 int num1,num2,num3;
 char chr1[10],chr2[10],chr3[10];
 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)chr1);
 SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)chr2);
 num1=atoi(chr1);
 num2=atoi(chr2);
 num3=num1+num2;
 itoa(num3,chr3,10);
 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)chr3);

 

获取文本复选内容的消息。对于编辑框来说,我们可以在编辑框输入一些文本,获取复选部分的内容,而不是整个窗体的内容,

EM_GETSEL
wParam = (WPARAM) (LPDWORD) lpdwStart; // receives starting position
lParam = (LPARAM) (LPDWORD) lpdwEnd;  

获取一个复选的内容的消息,

wParam 表示开始的位置 要求是指向DWORD的一个指针。

lParam 表示结束的位置

EM_SETSEL
wParam = (WPARAM) (INT) nStart;    // starting position
lParam = (LPARAM) (INT) nEnd;     

设置复选的内容的消息。

 

例:

int num1,num2,num3;
 char chr1[10],chr2[10],chr3[10];
 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)chr1);
 SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)chr2);
 num1=atoi(chr1);
 num2=atoi(chr2);
 num3=num1+num2;
 itoa(num3,chr3,10);
 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)chr3);
 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,1,3);

但是我们运行的时候没有产生我们想要的结果。这是因为焦点不在复选的内容上。所以我们看不到复选的部分。如果想要产生我们想要的效果,就要将焦点转移到我们的编辑框上,我们需要用一个函数:

CWnd* SetFocus( );

用来设置窗口的焦点,返回一个先前具有输入焦点的窗口所对应的C++类的一个指针。

例:

int num1,num2,num3;
 char chr1[10],chr2[10],chr3[10];
 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)chr1);
 SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)chr2);
 num1=atoi(chr1);
 num2=atoi(chr2);
 num3=num1+num2;
 itoa(num3,chr3,10);
 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)chr3);
 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,1,3);

m_edit3.SetFocus();

 

如果将起始位置设为0,结束位置设为-1,那么所有文本将被选上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值