• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

VC++编程

发布: 2007-7-04 20:47 | 作者: admin | 来源:  网友评论 | 查看: 25次 | 进入软件测试论坛讨论

领测软件测试网 冷山述

  自定义事件与函数映射实现


  对于人工生成的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;

   }

 

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网