利用Visual C++实现系统托盘程序Word文档格式.docx

上传人:b****5 文档编号:21185260 上传时间:2023-01-28 格式:DOCX 页数:10 大小:21.30KB
下载 相关 举报
利用Visual C++实现系统托盘程序Word文档格式.docx_第1页
第1页 / 共10页
利用Visual C++实现系统托盘程序Word文档格式.docx_第2页
第2页 / 共10页
利用Visual C++实现系统托盘程序Word文档格式.docx_第3页
第3页 / 共10页
利用Visual C++实现系统托盘程序Word文档格式.docx_第4页
第4页 / 共10页
利用Visual C++实现系统托盘程序Word文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

利用Visual C++实现系统托盘程序Word文档格式.docx

《利用Visual C++实现系统托盘程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用Visual C++实现系统托盘程序Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

利用Visual C++实现系统托盘程序Word文档格式.docx

NIM_ADD:

添加一个图标到任务栏。

NIM_MODIFY:

修改状态栏区域的图标。

NIM_DELETE:

删除状态栏区域的图标。

NIM_SETFOCUS:

将焦点返回到任务栏通知区域。

当完成用户界面操作时,任务栏图标必须用此消息。

例如,如果任务栏图标正显示上下文菜单,但用户按下"

ESCAPE"

键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。

NIM_SETVERSION:

指示任务栏按照相应的动态库版本工作。

第二个参数pnid是NOTIFYICONDATA结构的地址,其内容视dwMessage的值而定。

这个结构在SHELLAPI.H文件中定义如下:

typedefstruct_NOTIFYICONDATA{

DWORDcbSize;

//结构大小(sizeofstruct),必须设置

HWNDhWnd;

//发送通知消息的窗口句柄

UINTuID;

//图标ID(由回调函数的WPARAM指定)

UINTuFlags;

UINTuCallbackMessage;

//消息被发送到此窗口过程

HICONhIcon;

//任务栏图标句柄

CHARszTip[64];

//提示文本

}NOTIFYICONDATA;

该结构中uFlags的值分别为:

#defineNIF_MESSAGE0x1//表示uCallbackMessage有效

#defineNIF_ICON0x2//表示hIcon有效

#defineNIF_TIP0x4//表示szTip有效

在该结构的成员中,cbSize为该结构所占的字节数,hWnd为接受该图标所发出的消息的窗口的句柄(鼠标在任务栏上程序图标上动作时图标将发出消息,这个消息用户要自己定义),uID为被显示图标的ID,uFlags指明其余的几个成员(hIcon、uCallBackMessage和szTip)的值是否有效,uCallbackMessage为一个用户自定义的消息,当用户在该图标上作用一些鼠标动作时,图标将向应用程序的主框架窗口(hWnd成员中指定的窗口)发出该消息,为了使程序的主框架得到该通知消息,需要设置NOTIFYICONDATA结构的flag成员的值为NIF_MESSAGE。

hIcon为将在任务栏上显示的图标句柄,szTip鼠标停留在该图标上时显示的提示字符串。

尽管Shell_NotifyIcon函数简单实用,但它毕竟是个Win32API,为此本实例将它封装在了一个C++类中,这个类叫做CTrayIcon,有了它,托盘编程会更加轻松自如,因为它隐藏了NOTIFYICONDATA、消息代码、标志以及一些繁琐的细节。

二、编程步骤

  1、启动VisualC++6.0,生成一个单文档的应用程序TrayTest,取消文档视图支持;

  2、在CMainFrame类中添加自定义消息#defineWM_MY_TRAY_NOTIFICATIONWM_USER+0,并在该类中为此自定义消息手动添加消息映射ON_MESSAGE(WM_MY_TRAY_NOTIFICATION,OnTrayNotification)和消息响应函数afx_msgLRESULTOnTrayNotification(WPARAMwp,LPARAMlp);

  3、设计二个图标添加到项目中,其ID标志分别为"

IDI_MYICON"

、"

IDI_MYICON2"

,作为托盘显示时的图标;

  4、在CMainFrame类中添加下述变量:

CTrayIconm_trayIcon(用来操作图标的类对象)、CEditm_wndEdit(编辑框用来显示所跟踪到的鼠标消息)、intm_iWhichIcon(决定当前托盘使用哪个图标)、BOOLm_bShutdown(是否关闭当前拖盘程序标志)、BOOLm_bShowTrayNotifications(是否显示托盘消息标志);

  5、为程序的IDR_MAINFRAME添加处理菜单项和托盘的上下文菜单IDI_TRAYICON(具体的菜单项的标题和ID标志符参见代码部分),然后使用ClassWizard为各个菜单项添加处理函数;

  6、添加代码,编译运行程序。

///////////////////////////////////////////////CTrayIcon类的头文件;

#ifndef_TRAYICON_H

#define_TRAYICON_H

classCTrayIcon:

publicCCmdTarget{

 protected:

  DECLARE_DYNAMIC(CTrayIcon)

  NOTIFYICONDATAm_nid;

//structforShell_NotifyIconargs

 public:

  CTrayIcon(UINTuID);

  ~CTrayIcon();

  //Callthistoreceivetraynotifications

  voidSetNotificationWnd(CWnd*pNotifyWnd,UINTuCbMsg);

  BOOLSetIcon(UINTuID);

//mainvariantyouwanttouse

  BOOLSetIcon(HICONhicon,LPCSTRlpTip);

  BOOLSetIcon(LPCTSTRlpResName,LPCSTRlpTip)

  {returnSetIcon(lpResName?

   AfxGetApp()->

LoadIcon(lpResName):

NULL,lpTip);

}

  BOOLSetStandardIcon(LPCTSTRlpszIconName,LPCSTRlpTip)

  {returnSetIcon(:

LoadIcon(NULL,lpszIconName),lpTip);

  virtualLRESULTOnTrayNotification(WPARAMuID,LPARAMlEvent);

};

#endif

///////////////////////////////////////////////////CTrayIcon类的.CPP文件

#include"

stdafx.h"

trayicon.h"

#include//forAfxLoadString

IMPLEMENT_DYNAMIC(CTrayIcon,CCmdTarget)

CTrayIcon:

CTrayIcon(UINTuID)

 memset(&

m_nid,0,sizeof(m_nid));

//InitializeNOTIFYICONDATA

 m_nid.cbSize=sizeof(m_nid);

 m_nid.uID=uID;

//neverchangesafterconstruction

 AfxLoadString(uID,m_nid.szTip,sizeof(m_nid.szTip));

 //Useresourcestringastipifthereisone

~CTrayIcon()

 SetIcon(0);

//removeiconfromsystemtray

voidCTrayIcon:

SetNotificationWnd(CWnd*pNotifyWnd,UINTuCbMsg)

 //Setnotificationwindow.Itmustcreatedalready.

 ASSERT(pNotifyWnd==NULL  :

IsWindow(pNotifyWnd->

GetSafeHwnd()));

 m_nid.hWnd=pNotifyWnd->

GetSafeHwnd();

 ASSERT(uCbMsg==0  uCbMsg>

=WM_USER);

 m_nid.uCallbackMessage=uCbMsg;

BOOLCTrayIcon:

SetIcon(UINTuID)

 //SetsboththeiconandtooltipfromresourceID,Toremovetheicon,callSetIcon(0)

 HICONhicon=NULL;

 if(uID){

  AfxLoadString(uID,m_nid.szTip,sizeof(m_nid.szTip));

  hicon=AfxGetApp()->

LoadIcon(uID);

 }

 returnSetIcon(hicon,NULL);

SetIcon(HICONhicon,LPCSTRlpTip)

 //CommonSetIconforalloverloads.

 UINTmsg;

 m_nid.uFlags=0;

 if(hicon){

  //Settheicon

  msg=m_nid.hIcon?

NIM_MODIFY:

NIM_ADD;

  m_nid.hIcon=hicon;

//Addorreplaceiconinsystemtray

  m_nid.uFlags =NIF_ICON;

 }else{

  if(m_nid.hIcon==NULL)//removeiconfromtray

   returnTRUE;

//alreadydeleted

  msg=NIM_DELETE;

 if(lpTip)//Usethetip,ifany

  strncpy(m_nid.szTip,lpTip,sizeof(m_nid.szTip));

 if(m_nid.szTip[0])

  m_nid.uFlags =NIF_TIP;

 if(m_nid.uCallbackMessage&

&

m_nid.hWnd)//Usecallbackifany

  m_nid.uFlags =NIF_MESSAGE;

  BOOLbRet=Shell_NotifyIcon(msg,&

m_nid);

//Doit

 if(msg==NIM_DELETE  !

bRet)

  m_nid.hIcon=NULL;

//failed

 returnbRet;

LRESULTCTrayIcon:

OnTrayNotification(WPARAMwID,LPARAMlEvent)

 if(wID!

=m_nid.uID  (lEvent!

=WM_RBUTTONUP&

lEvent!

=WM_LBUTTONDBLCLK))

  return0;

 CMenumenu;

//装载上下文菜单;

 if(!

menu.LoadMenu(m_nid.uID))

 CMenu*pSubMenu=menu.GetSubMenu(0);

pSubMenu)

 if(lEvent==WM_RBUTTONUP){//设置第一个菜单项为默认菜单项目

  :

SetMenuDefaultItem(pSubMenu->

m_hMenu,0,TRUE);

  //将当前菜单作为上下文菜单;

  CPointmouse;

  GetCursorPos(&

mouse);

SetForegroundWindow(m_nid.hWnd);

TrackPopupMenu(pSubMenu->

m_hMenu,0,mouse.x,mouse.y,0,m_nid.hWnd,NULL);

 }else//doubleclick:

executefirstmenuitem

SendMessage(m_nid.hWnd,WM_COMMAND,pSubMenu->

GetMenuItemID(0),0);

 return1;

/////////////////////////////////MainFrm.h:

interfaceoftheCMainFrameclass

#if!

defined(AFX_MAINFRM_H__9ED70A69_C975_4F20_9D4E_B2877E3575D0__INCLUDED_)

#defineAFX_MAINFRM_H__9ED70A69_C975_4F20_9D4E_B2877E3575D0__INCLUDED_

#if_MSC_VER>

1000

#pragmaonce

#endif//_MSC_VER>

classCMainFrame:

publicCFrameWnd

  CMainFrame();

  DECLARE_DYNAMIC(CMainFrame)

  //Attributes

  //Overrides

  //ClassWizardgeneratedvirtualfunctionoverrides

  //{{AFX_VIRTUAL(CMainFrame)

  //}}AFX_VIRTUAL

  //Implementation

  virtual~CMainFrame();

  #ifdef_DEBUG

   virtualvoidAssertValid()const;

   virtualvoidDump(CDumpContext&

dc)const;

  #endif

//controlbarembeddedmembers

  CStatusBarm_wndStatusBar;

  CTrayIconm_trayIcon;

//mytrayicon

  CEditm_wndEdit;

//todisplaytraynotifications

  intm_iWhichIcon;

//whichHICONtouse

  BOOLm_bShutdown;

//OKtoterminateTRAYTEST

  BOOLm_bShowTrayNotifications;

//displayinfoinmainwindow

  //Generatedmessagemapfunctions

  //{{AFX_MSG(CMainFrame)

   afx_msgLRESULTOnTrayNotification(WPARAMwp,LPARAMlp);

   afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);

   afx_msgvoidOnToggleIcon();

   afx_msgvoidOnViewClear();

   afx_msgvoidOnViewNotifications();

   afx_msgvoidOnUpdateViewClear(CCmdUI*pCmdUI);

   afx_msgvoidOnUpdateViewNotifications(CCmdUI*pCmdUI);

   afx_msgvoidOnClose();

   afx_msgvoidOnAppOpen();

   afx_msgvoidOnAppSuspend();

   //NOTE-theClassWizardwilladdandremovememberfunctionshere.

   //DONOTEDITwhatyouseeintheseblocksofgeneratedcode!

  //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

///////////////////////////////////////////////CMainFrm.cpp

TrayTest.h"

MainFrm.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

//controlbarembeddedmem

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1