MFC各个控件之间运用SendMessage()传送CString和char[]字符串,以及int类型数据

LRESULT SendMessage(
  HWND hWnd,      // handle to destination window
  UINT Msg,       // message
  WPARAM wParam,  // first message parameter,消息的第一个参数
  LPARAM lParam   // second message parameter,消息的第二个参数,
);
注意1:传递的到底是什么?是字符串,int数据,指针?
参数是一个数据,只能容纳一个数,而不能是一长串数据。这个数可以是一个int数据,也可以是一个指针(指针本质上就是一个数据)。因此,若传递int,可以直接传递;若要传递字符串或者结构体变量,则只能将字符串或者结构体变量的指针赋予参数进行传递,而不是完整的字符串数据或者结构体变量。

 注意2:两个消息参数

WPARAM  和 
lParam的区别 ?
wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:
一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同。

 

实例:

实例一,发送char[]字符串

发送Message:

复制代码
void CDlg2::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here

char s0[]="123456FEDBCA\r\n";   //需要传递的变量可以是此函数的局部变量也可以是工程的全局变量

// 通过第一个参数或者第二个参数传递都OK
::SendMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0, (LPARAM)s0);    // OK
// ::SendMessage(pMainFrame->pDlg4->m_hWnd ,UM_MESSAGE_EDIT_ADD_STRING,(WPARAM)&s0,0);  // OK


//  运用PostMessage 还未测试,据说不同,只能用全局变量,因为POST完之后不会等待消息处理完再进入下一步;而Send会
// 等待消息处理完之后再进行下一步,因此系统在这短时间内不会将本函数内的变量销毁。本人会继续验证PostMessage的功能。
// ::PostMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0, (LPARAM)s1); 

}
复制代码

接收处理Message:

复制代码
LRESULT CDlg4::OnMsgAddString(WPARAM wParam, LPARAM lParam)
{

int nMsgLen ;
CString str;
char *pStr0= (char *)wParam; // OK
// char *pStr0= (char *)lParam;   // OK
str.Format(_T("%S"),pStr0);

nMsgLen = m_Edit.GetWindowTextLength();
m_Edit.SetSel(nMsgLen, nMsgLen);
m_Edit.ReplaceSel(*pStr1);

return TRUE;
} 
复制代码

 

实例二,发送CString字符串

发送Message:

复制代码
void CDlg2::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here

CString s1=_T("123456\r\n");
// CString 本身是一个类,s1为其实例对象,因此传递的时候必须是这个对象的指针,而不是这个对象。依次类推,不仅可以传递字符串,还一个传递一个自定义的结构体对象或者一个其他类的对象。
 
//运用第一个参数传递,OK
// ::SendMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING,(WPARAM)&s1,0);  
//运用第二个参数传递,OK
::SendMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0,(LPARAM)&s1);  //OK

//::PostMessage(pMainFrame->pDlg4->m_hWnd, UM_MESSAGE_EDIT_ADD_STRING, 0, (LPARAM)s1);

}
复制代码

接收处理Message:

复制代码
LRESULT CDlg4::OnMsgAddString(WPARAM wParam, LPARAM lParam)
{ 
int nMsgLen ;
//  指针,非对象
 CString *pStr1= (CString *)lParam;

nMsgLen = m_Edit.GetWindowTextLength();
m_Edit.SetSel(nMsgLen, nMsgLen);
m_Edit.ReplaceSel(*pStr1);

return TRUE;
} 
复制代码

 

posted @   rainbow70626  阅读(3527)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2016-12-20 JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素
2016-12-20 ASP.NET MVC的运行机制--url的全局分析
点击右上角即可分享
微信分享提示