• 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
    ";   //需要传递的变量可以是此函数的局部变量也可以是工程的全局变量
    
    // 通过第一个参数或者第二个参数传递都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
    ");
    // 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;
    } 
  • 相关阅读:
    自动化测试面试题及答案
    Jmeter读取CSV数据显示EOF问题
    C++中类继承public,protected和private关键字作用详解及派生类的访问权限
    汇编实验:寻址方式在数据访问中的应用
    集成运放综合应用的仿真模拟
    集成运算放大电路线性区运用的仿真实验
    共射/共源放大电路的仿真实验
    二极管特性的仿真实验
    各主流排序算法详细介绍(时间/空间复杂度,适用范围和稳定性)
    三大自由之二 部分
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/8068761.html
Copyright © 2020-2023  润新知