您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:104 来源:vckbase.com

本文章共5310字,分4页,当前第3页,快速翻页:
 
// 注册用于托盘的自定义消息

#define WM_MY_TRAY_NOTIFICATION WM_USER 0

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

……

  // 请通知我

  m_trayIcon.SetNotificationWnd(this,

                        WM_MY_TRAY_NOTIFICATION);

                           m_trayIcon.SetIcon(IDI_MYICON);

  return 0;

}
消息一旦注册,接下来你便可以用通常的消息映射方式处理托盘通知消息。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

  ON_MESSAGE(WM_MY_TRAY_NOTIFICATION,

             OnTrayNotification)

             // (or ON_REGISTERED_MESSAGE)

END_MESSAGE_MAP()



LRESULT 

CMainFrame::OnTrayNotification(WPARAM wp, LPARAM lp)

{                    

……

       // 显示消息

……

return m_trayIcon.OnTrayNotification(wp, lp);

}      
当消息处理器得到控制,WPARAM的值是在构造CTrayIcon时指定的ID;LPARAM为鼠标事件(如WM_LBUTTONDOWN)。当你得到通知消息后,可以做任何想做的的事情;例子程序TrayTest此时是显示通知信息,细节请参考源代码。完成消息的处理之后,调用CTrayIcon::OnTrayNotification进行缺省处理。此虚拟函数(所以你可以改写)实现我前面提到过的缺省的UI行为。尤其是处理WM_LBUTTONDBLCLK和WM_RBUTTONUP。CTrayIcon寻找与图标ID相同的某个菜单(如IDR_TRAYICON),如果找到,则当用户右键单击图标时CTrayIcon显示这个菜单;当用户数双击图标时,CTrayIcon执行第一个菜单命令。只有两件事情需要进一步交待:
逆风编程精品
第一件事情是:在显示菜单之前,CTrayIcon让第一个菜单项为默认,所以它以黑体显示。但如何用黑体来显示某个菜单项呢?我在\MSDEV\INCLUDE\*.H搜索了一番,发现了Get/SetMenuDefaultItem。这个函数没有相关的CMenu打包类,所以我必须直接调用它们。
// 让第一个菜单项为默认(黑体):

::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);       
这里0表示第一个菜单项,TRUE说明用位置表示菜单项的ID。为什么MFC没有打包Get/SetMenuDefaultItem函数呢?微软的家伙们解释那是因为这些函数(其它的还有::Get/SetMenuItemInfo, ::LoadImage等)还没有在最新的Windows版本中实现。一旦在最新的Windows版本中实现了,便会马上添加到MFC中。
第二件事情是上下文菜单的显示:
      ::SetForegroundWindow(m_nid.hWnd); ::TrackPopupMenu(pSubMenu->m_hMenu, ...);      
为了让TrackPopupMenu在托盘的上下文中正确运行,你必须首先调用SetForegroundWindow,否则,当用户按下ESCAPE键或者在菜单之外单击鼠标时,菜单不会消失。为解决这个问题,我花费了数个小时,最后还是在MSDN上找到了解决方法。为了解详情,请参考MSDN的Q135788。最让我哭笑不得的是我花了那么多时间来关注这个问题,最后微软的这帮家伙在MSDN上给你来了一个问题的结论是:“This behavior is by design.....”真是气刹人也。
正如你所看到的,CTrayIcon使得托盘应用的编程变得易如反掌。TrayTest1要做的事情不外乎调用CTrayIcon::OnTrayNotification实现一个通知消息处理器,提供一个与图标ID相同的菜单。就这么简单。
// (TRAYTEST.RC文件)

IDR_TRAYICON MENU DISCARDABLE 

BEGIN

    POPUP "托盘(&T)"

    BEGIN

        MENUITEM "打开(&O)",                    ID_APP_OPEN

        MENUITEM "关于 TrayTest(&A)...",        ID_APP_ABOUT

        MENUITEM SEPARATOR

        MENUITEM "退出TrayTest 程序(&S)",       ID_APP_SUSPEND

    END

END
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 下一页>>
相关文章

枚举声明,模板函数特化
COM 组件注册方法
关于SendMessage
初试驱动---OV511 摄像头驱动开发
定制编辑框的上下文菜单
ATL布幔之下的秘密(5)
如何在NT下获取进程的路径
如何更改其它程序 ListView 控件中某个 Ite
利用辅助线程更新用户界面UI
一个简单的读写注册表实例
点对点视频会议程序:VideoNet
乱砍设计模式之二:STATE 模式——履胡之肠
ATL 实现定制的 IE 浏览器栏、工具栏和桌面
对“仅通过崩溃地址找出源代码的出错行”一
COM插件模型浅谈
Windows 2000驱动程序的设计
MFC 编写的仿 Windows 计算器
用VC实现支持多语言的程序
连接 COM 与.NET 的桥梁(二)——COM 服务
浅谈PDFlib中文输出(一)如何使用Acrobat标

相关评论


本文章所属分类:首页 VC++

  热门关键字: