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;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM