自定義事件與函數映射實現
對于人工生成的DialogBar等對象,要實現其控件(如編輯框、復合框、圖標)對Windows事件的響應,并不能像工具條或選單欄那樣通過ClassWizard來自動映射,必須進行人工映射操作。但從函數到映射信息,如果都是人工操作,則會造成程序連接時的LINK2001錯誤,正確利用ClassWizard操作,則能較好的避免這種錯誤,方法如下:
?、?通過右鍵單擊類名法加入所需的信息處理函數。
?、?在該類的頭文件中修改函數定義格局:
//{{AFX—MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX—MSG
afx—msg LRESULT ShowHello(WPARAM wParam,LPARAM lParam);
DECLARE—MESSAGE—MAP()
一定要注意: ①
事件處理函數是通過剪粘操作實現的,而非人工加入。②
該函數是從VC++環境自動加入處轉移而來的,其轉到的位置應在AFX—MSG
()與AFX—MSG結構塊之外,DECLARE—MESSAGE—MAP()之前,函數之后有分號。
?、?在類的CPP文件中的消息映射中把事件消息與其處理函數相映射。
BEGIN—MESSAGE—MAP(CMainFrame, CMDIFrameWnd)
//{{AFX—MSG—MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON—WM—CREATE()
//}}AFX—MSG—MAP
ON—MESSAGE(WM—USER+42,ShowHello)
END—MESSAGE—MAP()
注意: ①
事件種類的定義可以通過查找事件對象(控件)的屬性(HelpOnline)得到。如對編輯框可通過查找CEdit類的屬性決定為ON—EN—CHANGE
等事件。② 該函數的位置應在AFX—MSG—MAP ( )與AFX—MSG—MAP結構塊之外,END—MESSAGE—MAP()之前,函數之后無分號。
任務欄圖標控制
對任務欄的狀態區,通常用圖標等顯示以表示程序的運行,或便于進行某特性設置或信息查詢等操作。
應用程序圖標的加入與刪除是通過調Win 32外殼函數Shell—NotifyIcon(DWORD
dwMessage, PNOTIFYICONDATA pnid)來實現的;彈出選單是用CMenu類實現。對圖標的事件響應和選單的事件響應是通過人工的事件信息映射實現的。
圖標的加入與刪除:
BOOL bRc; NOTIFYICONDATA niData; HICON hicon;
hicon=AfxGetApp()->LoadIcon(IDI—ICON1);
niData.cbSize=sizeof(NOTIFYICONDATA);
niData.hWnd=m—hWnd;
niData.uID=123; // 該值返回交給應用程序的wParam
niData.uFlags=NIF—ICON|NIF—MESSAGE|NIF—TIP;
niData.uCallbackMessage=WM—USER+42;
niData.hIcon=hicon;
sprintf(niData.szTip,"我的圖標");
bRc=Shell—NotifyIcon(NIM—ADD,&niData); //加入圖標
Shell—NotifyIcon(NIM—DELETE,&niData);
//刪除圖標
圖標的事件消息映射:
在頭文件中的事件處理函數定義:
afx—msg LRESULT ShowHello(WPARAM wParam,LPARAM lParam);
afx—msg void Leng();
DECLARE—MESSAGE—MAP()
在CPP文件中的事件函數映射:
ON—MESSAGE(WM—USER+42,ShowHello)
//響應圖標的各種Windows典型信息
ON—BN—CLICKED(WM—USER+51,Leng) //響應彈出選單被擊事件
END—MESSAGE—MAP()
處理函數的實現:
LRESULT CMainFrame::ShowHello(WPARAM wParam, LPARAM lParam)
{ if(wParam= =123) { CMenu ContextMenu; CPoint pos;
switch(lParam) {
case WM—LBUTTONDOWN:
GetCursorPos(&pos);
ContextMenu.CreatePopupMenu();
ContextMenu.AppendMenu(MF—STRING,WM—USER+51,_T("這是什么...?"));
ContextMenu.AppendMenu(MF—STRING,WM—USER+52,_T("屬性..."));
SetForegroundWindow(); //
ContextMenu.TrackPopupMenu(TPM—RIGHTALIGN|TPM—RIGHTBUTTON,
pos.x,pos.y,this,NULL);
break;
default: break; }
}
return 0;
}