本來(lái)想自己寫(xiě),結果時(shí)間啊有點(diǎn)太晚了.... 在網(wǎng)上找個(gè)《VC中自定義消息實(shí)現》轉貼一下,然后在講如何在自定義消息中傳入字符串。u 自定義消息
我們可以通過(guò)一下兩種方法來(lái)自定義一個(gè)消息:
1) 方法一
Step 1:使用WM_TASKBARCREATED來(lái)確定一個(gè)沒(méi)有被windows本身?yè)屨?div style="height:15px;">
的消息值,在想添加消息文件中添加代碼:
const UINT WM_USERDEFMSG = ::RegisterWindowMessage(_T("UserDefMsg"));
Step 2:定義消息的處理過(guò)程:在處理消息的類(lèi)(如Dlg類(lèi)或者M(jìn)ainFrame等)
添加消息處理函數聲明:
afx_msg LRESULT OnUserDefMsg(WPARAM wParam,LPARAM lParam);
在實(shí)現文件中添加消息處理實(shí)現,這里給出一個(gè)實(shí)現例子:
LRESULT ××××::OnUserDefMsg(WPARAM wParam,LPARAM lParam)
//××××代表處理該消息的類(lèi)名
{
MessageBox("響應了自定義的消息,^_^","自定義消息響應",MB_ICONQUESTION | MB_OK);
return 0;
}
Step 3:添加消息處理宏,在處理該消息的類(lèi)的消息宏中添加自定義消息的宏,即在BEGIN_MESSAGE_MAP代碼塊中添加代碼:
ON_REGISTERED_MESSAGE(WM_USERDEFMSG, OnUserDefMsg)
自定義消息完畢。
2) 方法二
Step 1:定義消息值,這里不通過(guò)RegisterWindowMessage獲取,而是自定義方式實(shí)現,
在想添加消息文件中添加代碼:
#define WM_USERDEFMSG (WM_USER + 101)
Microsoft推薦自定義消息值至少為WM_USER + 100。
Step 2:同方法一中實(shí)現;
Step 3:同方法一中,但是宏名稱(chēng)改為ON_MESSAGE。
u 發(fā)送消息
按照上面方式我們已經(jīng)自定義了消息,并為該消息實(shí)現了簡(jiǎn)單的處理過(guò)程,這里就通過(guò)
發(fā)送消息獲得自定義消息的響應。在要觸發(fā)自定義消息地方添加代碼:
::SendMessage(GetSafeHwnd(), WM_USERDEFMSG, 0L, 0L);
這樣你就觸發(fā)了該自定義消息,并將得到提示對話(huà)框顯示。
下面是第二種增加自定義消息方法的步驟:
第一步:定義消息。開(kāi)發(fā)Windows應用程序時(shí),Microsoft推薦用戶(hù)自定義消息至少是WM_USER+100,因為很多新控件也要使用WM_USER消息。
第二步:實(shí)現消息處理函數。該函數使用WPRAM和LPARAM參數并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 處理用戶(hù)自定義消息
...
return 0;
}
第三步:在類(lèi)頭文件的AFX_MSG塊中說(shuō)明消息處理函數:
class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函數
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
第四步:在用戶(hù)類(lèi)的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數中。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
如果用戶(hù)需要一個(gè)整個(gè)系統唯一的消息,可以調用SDK函數RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。
u 傳參字符串
char szText[1024];
......
m_pWnd->SendMessage(WM_MYMESSAGE,(UINT)szText,(UINT)lParam);
響應消息時(shí):
LRESULT ××××::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
char szPack[1024];
memcpy(szPack,(char*)wParam,1024);
......
}