自定義訊息處理示例

2021-05-27 19:06:51 字數 2686 閱讀 4000

我們在前兩篇中簡單介紹了mfc程式的訊息處理,並簡單了解了滑鼠和

鍵盤訊息。今天我們自定義乙個訊息並處理之~~

【預備知識】(參考:《mfc擴充套件程式設計例項》一書)

[1]怎樣使用mfc傳送乙個訊息

可以用下列目標視窗的控制代碼直接呼叫windows api:

lresult res=::sendmessage(hwnd hwnd ,     //hwnd是目標視窗的控制代碼

uint msg ,    //變數msg是訊息,

wparam wparam ,//wparam和lparam變數包含訊息的參

lparam lparam);//數,如滑鼠單擊**或選擇了什麼選單項    

目標視窗返回的訊息結果放在變數res中。

[2]怎樣用mfc寄送乙個訊息

用mfc寄送乙個訊息與傳送乙個訊息幾乎相同,但寄送時用bool postmessage( ) ,而不是用sendmessage( );返回值res也不一樣,res不是乙個由目標視窗返回的值,而是乙個布林值

,用來表示訊息是否成功地放到訊息佇列中。一旦訊息被寄送後,應用程式在後台傳送它,

通過getmessage()或peekmessage()獲取。

[3]自定義訊息的id(識別符號)

windows保留了0和wm_user-1之間的整數範圍,作為系統定義的視窗訊息;還有乙個

從wm_user一直到ox7fff的整數範圍,留給自定義訊息用。可以用乙個簡單的#define語句

定義訊息:

#define wm_mymessage1 wm_user

#define wm_mymessage2 wm_user+1

: : :

然後,可以像處理任何其他視窗訊息一樣用sendmessage(wm_mymessage1, wparam, lparam)

或postmessage(wm_mymessage1, wparam, lparam).傳送或寄送這些訊息。

可以用下面的巨集在訊息映像中獲取這些新訊息:

on_message(wm_mymessage1, handler)

(on_message是系統定義的"使用者自定義訊息對映巨集",這裡我們不討論定義自己的訊息對映巨集)

在這裡,處理函式將具有如下格式:

lresult handler(wparam, lpa r a m )

【完成程式】

[1]生成單文件應用程式mydefmsg,其餘均預設。

[2]定義使用者訊息

將"const wm_usermsg = wm_user + 10"加入到" mydefmsgview.h"中cmydefmsgview類的聲名的上面

const wm_usermsg = wm_user + 10

class cmydefmsgview : public cview

;為什麼要"wm_user + 10"?——"+其它數行不行"?——可以,只要滿足"從wm_user一直到ox7fff的整數範圍"即可!!!!!

[3]聲名使用者訊息響應函式

在cmydefmsgview類的聲名中加入訊息響應函式onmyfunction():

const wm_usermsg = wm_user + 10

class cmydefmsgview : public cview

;[4]定義使用者訊息響應函式

在"mydefmsgview.cpp "中新增onmyfunction()函式體,並編寫**。為簡單起見,只彈出了

乙個訊息框:

/// cmydefmsgview message handlers

void cmydefmsgview::onmyfunction()

[5]填寫訊息對映

在"mydefmsgview.cpp "檔案的訊息對映表中加入on_message(wm_usermsg,onmyfunction)

緊接在//}}afx_msg_map之後(你可以試著改變一下位置)

begin_message_map(cmydefmsgview, cview)

//}afx_msg_map

on_message(wm_usermsg,onmyfunction)//我們填寫的訊息對映

// standard printing commands

on_command(id_file_print, cview::onfileprint)

on_command(id_file_print_direct, cview::onfileprint)

on_command(id_file_print_preview, cview::onfileprintpreview)

end_message_map()

[6]編寫傳送自定義訊息的**

首先按照上篇介紹的方法,為cmydefmsgview類加入wm_rbuttondown訊息,在wm_rbuttondown訊息的處理函式onrbuttondown(uint nflags, cpoint point)中加入傳送自定義訊息的**:

void cmydefmsgview::onrbuttondown(uint nflags, cpoint point) 

[7]在cmydefmsgview類的ondraw()函式中加入pdc->textout(0,0,"按下滑鼠右鍵,測試自定義訊息!");

void cmydefmsgview::ondraw(cdc* pdc)

[8]編譯執行。

就到這裡!!!祝大家進步!!!

VC 對於自定義訊息處理

無模式對話方塊與有模式對話方塊不同的是在建立後其他視窗都可以繼續接收使用者輸入,因此無模式對話方塊有些類似乙個彈出視窗。建立無模式對話方塊需要呼叫 bool cdialog create uint nidtemplate,cwnd pparentwnd null 之後還需要呼叫 bool cdial...

wxWidgets自定義訊息及處理

使用者自定義訊息通常從wxevent派生,下面,以乙個使用者自定義的projectevent為例,說明自定義訊息的步驟 首先,在標頭檔案中宣告訊息。userevent.h class projectevent wxevent wxdeclare event project event,project...

自定義訊息

自定義訊息的響應和資源訊息的響應有很多類似之處 資源訊息的響應是以資源的id號作為標識的 自定義的訊息要自己宣告訊息id。一 定義 第一步要宣告訊息 definewm mymsgwm user 200 第二步要在類宣告中宣告訊息對映 declare message map 第三步要在類宣告中定義訊息...