自定义事件与函数映射实现
对于人工生成的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;
}