生活随笔
收集整理的這篇文章主要介紹了
MFC中SendMessage的用法与相应函数的添加
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 先來個基本知識介紹
[cpp] view plaincopy print?
SendMessage的基本結構如下:????SendMessage(????????HWND?hWnd,??????????UINT?Msg,?????????WPARAM?wParam,???????????????LPARAM?lParam);?????其中一些參數的由來如下:??????????????????
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;
2.?SendMessage用法實例
[cpp] view plaincopy print?
void?CTScrollWinView::OnLButtonDblClk(UINT?nFlags,?CPoint?point)???????????{???????????????????????????::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK?,0,0);?????????????CScrollView::OnLButtonDblClk(nFlags,?point);???????????}????
void CTScrollWinView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK ,0,0); CScrollView::OnLButtonDblClk(nFlags, point); }
這是我用VC2008下建立的一個多文檔選項卡式工程里面的一段代碼,是為了實現在子窗口雙擊后發送一個不帶參數的消息(其ID為WM_USER+1)給主窗口, 如上為部分代碼, 其中WM_CHILDFRAMEDBCLK是自定義的消息ID, AfxGetMainWnd()->m_hWnd是獲得主窗口(這里不能使用GetParent()->m_hWnd或者GetParentFrame()->m_hWnd, 因為這是獲得父窗口,但父窗口不一定是主窗口,一定要注意,不然消息就會發錯導致接收不到。
3. 在接收消息的窗體以及線程所在的頭文件里定義:
[cpp] view plaincopy print?
#define?WM_CHILDFRAMEDBCLK??WM_USER+1???//?do?something????
#define WM_CHILDFRAMEDBCLK WM_USER+1 // do something
4. 然后接下來定義一個消息需要映射的函數,如下:
[cpp] view plaincopy print?
afx_msg?LRESULT?OnChlidFrameDBClick(WPARAM?wParam,?LPARAM?lParam);????
afx_msg LRESULT OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam);
注意格式必須是:兩個參數必不可少,返回類型一定為LRESULT,網上很多文章都忽略了這兩點,這也是網上文章普遍錯誤的地方。
5. 添加消息函數映射 ??
[cpp] view plaincopy print?
ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick)????
ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick) 注意這里必須是ON_MESSAGE, 不能使用ON_COMMAND, 前者主要針對用戶自定義消息,后者針對WM_COMMAND命令,比如菜單、工具欄等.
6. 實現消息函數:
我們在接收窗體里定義一個這樣的事情(過程),
[cpp] view plaincopy print?
LRESULT?CMainFrame::OnChlidFrameDBClick(WPARAM?wParam,?LPARAM?lParam)??????????{????????????????CancelFullScreenWin();??????????????return?0;??????????}????
LRESULT CMainFrame::OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam) { CancelFullScreenWin(); // 這里調用了一個使子窗口全屏的自寫函數,我就不貼出來了,以后專題將的時候會提到 return 0; }
總結
以上是生活随笔為你收集整理的MFC中SendMessage的用法与相应函数的添加的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。