C++ vc中怎麼使用SendMessage自訂訊息函數

來源:互聯網
上載者:User

標籤:

 


vc中怎麼使用SendMessage自訂訊息函數:

SendMessage的基本結構如下:
SendMessage(
    HWND hWnd,  //訊息傳遞的目標視窗或線程的控制代碼。
    UINT Msg, //訊息類別(這裡可以是一些系統訊息,也可以是自己定義,下文具體介紹,)
    WPARAM wParam, //參數1 (WPARAM 其實是與UINT是同種類型的,
  //在vc編譯器中右鍵有個“轉到WPARAM的定義”的選項可以查看。
    LPARAM lParam); //參數2
其中一些參數的由來如下:
//typedef unsigned int UINT;
//typedef UINT WPARAM;
//typedef LONG LPARAM;
//typedef LONG LRESULT;
例如可以用以下語句:
::SendMessage(this->m_hWnd, WM_MY_DOSOME, (WPARAM) 0, (LPARAM) 0);
這裡我發送的訊息是本表單接收的,所以控制代碼用:this->m_hWnd
這裡的訊息類別WM_MY_DOSOME就是我自訂的,
在接收訊息的表單或線程所在的標頭檔裡:
#define WM_MY_DOSOME WM_USER+1 // do something
當然你還可以定義更多如:
#define WM_DOOTHER WM_USER+2 // do other

表示要做一些事情。
到這裡,可能大家還是對訊息類別有點模糊,不要擔心,我下面很快就講到。
我們發了一個訊息出去,那麼接收方要能識別這個訊息是幹什麼,就是通過訊息類別來區分,
並且開始去做這個訊息對應要處理的事情。如下:
一:編寫一個事情:
我們在接收表單裡定義一個這樣的事情(過程),
afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2)
{
 MessageBox("收到訊息了,我要開始做一些事情了。","收到",MB_OK);
 //可以運用iParam1,iParam2 來做一些事情。
 return 0;
}
這個事情有3點大家要注意,非常重要:
1:使用了afx_msg,並且要將afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2)
改寫到標頭檔的 
//{{AFX_MSG
//。。。改寫到這裡,顏色會變成灰的。這一點非常重要。
//}}AFX_MSG
2:參數有2個,WPARAM iParam1,LPARAM iParam2,哪怕沒有東西傳進來也要寫,不然會吃苦頭的,vc裡不會提醒你少寫了一個,
但一些莫名奇妙的事情會發生。
3:類型用 LRESULT,完了要return 0;
二:讓接收方知道什麼時候做這個事情:
我們在
//{{AFX_MSG_MAP
//。。。這裡寫上
ON_MESSAGE(WM_MY_DOSOME,DoSomeThing)
//如果還有其他訊息就再寫一個
ON_MESSAGE(WM_DOOTHER,DoOther)
//}}AFX_MSG_MAP
到這裡,當你用SendMessage,發了一個WM_MY_DOSOME類型的訊息過來的時候,
接收方就會去做DoSomeThing(WPARAM iParam1,LPARAM iParam2)
發了一個WM_DOOTHER類型的訊息過來的時候,
接收方就會去做DoOther(WPARAM iParam1,LPARAM iParam2)當然,這裡DoOther我還沒有定義,
這樣就是一個完整的訊息發送與接受過程,我沒有詳細講參數,iParam1,因為還沒有用到很複雜的情況,
大家要是有心得我們可以一起提高。


在標頭檔裡
#define WM_MYMSG  WM_USER+5 //自訂一個訊息


afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自訂訊息的處理函式宣告



在.cpp檔案裡
ON_MESSAGE(WM_MYMSG, OnMyMessage)
//利用ON_MESSAGE()宏在自訂訊息與其處理函數間建立映射關係

void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//從lParam中取出CString對象的指標,並將字串內容在IDC_MSGEDIT中顯示出來
{

    CString *str;
    str=(CString *)lParam;

    SetDlgItemText(IDC_EDIT,*str);
}


按下按鈕發送訊息
void CModelessDlg::OnMsgBTN() 
{

 CString str= "自訂訊息被觸發了!";

SendMessage(WM_MYMSG, 0, (LPARAM) &str);
 //給ModelessDlg自己發一個自訂的訊息

}

C++ vc中怎麼使用SendMessage自訂訊息函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.