仿MSN,在任务栏注册一个图标.和拦截关闭WM_CLOSE消息.

要想在任务栏注册一个图标,须要用到一个API,
BOOL Shell_NotifyIcon(      
    DWORD dwMessage, //指几个宏,如果是增加就是:NIM_ADD,删除图标就是:NIM_DELETE     PNOTIFYICONDATA lpdata //一个指向NOTIFYICONDATA结构的指针 );
在这里我们主要是关注结构
typedef struct _NOTIFYICONDATA {
    DWORD cbSize; //本结构的大小,就是sizeof(NOTIFYICONDATA);
    HWND hWnd; //关联的窗口名柄.this->m_hWnd
    UINT uID; //就是你指定操作的ICON ID,DEFAULT就是IDR_MAINFRAME
    UINT uFlags; //NIF_ICON|NIF_MESSAGE|NIF_TIP 
    UINT uCallbackMessage; //这里是一个自定义消息的CALL BACK MESSAGE如;WM_MYMSG
    HICON hIcon; //图标句柄.系统图标就是:AfxGetApp()->LoadIconA(IDR_MAINFRAME);
    TCHAR szTip[64]; //显示的TIPS,
    DWORD dwState;
    DWORD dwStateMask;
    TCHAR szInfo[256];
    union {
        UINT uTimeout;
        UINT uVersion;
    };
    TCHAR szInfoTitle[64];
    DWORD dwInfoFlags;
    GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
根据这个结构要求,我们要定义一个自定义消息.可以在文件头中加入
#define WM_MYMSG (WM_USER+1)
只要是定义了这个结构,就可以用Shell_NotifyIcon函数注册一个ICON了
可以将以下代码加入到窗口的OnInitDialog()中.
NOTIFYICONDATA m_Notify;  
 m_Notify.cbSize=sizeof(NOTIFYICONDATA);
 m_Notify.hWnd=this->m_hWnd;
 m_Notify.hIcon=AfxGetApp()->LoadIconA(IDR_MAINFRAME);
 m_Notify.uID=IDR_MAINFRAME;
 m_Notify.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
 m_Notify.uCallbackMessage=WM_MYMSG; //这就是自订义的消息.
 strcpy_s(m_Notify.szTip,_T("LiJun Mail Sniffer"));
 Shell_NotifyIcon(NIM_ADD,&m_Notify);
但是,现在还不能对自订消息进行处理,在类中加一个自定义消息处理函数声明:
afx_msg LRESULT OnDeng(WPARAM wParam,LPARAM lParam);
再加入映射:
BEGIN_MESSAGE_MAP()
....
ON_MESSAGE(WM_MYMSG,OnDeng)
...
END_MESSAGE_MAP()
函数实现:下面的示例是右健弹出一个MENU.
LRESULT 类名::OnDeng(WPARAM wParam, LPARAM lParam){
 POINT pt;
 GetCursorPos(&pt);
 if(wParam==IDR_MAINFRAME){
 
  if(lParam==WM_RBUTTONDOWN)
  {
           m_Menu.GetSubMenu(0)->TrackPopupMenuEx(0,pt.x,pt.y,this,NULL);
  }else if(lParam==WM_LBUTTONDOWN)
  {
         ShowWindow(SW_SHOW);
         UpdateWindow();
  }
  
 }
最后,我们要在程序退出后删除掉这个注册ICON:
可以在OnDestroy()中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_Notify);
如果要拦截WM_CLOSE消息,不让关闭程序,其实很简单,对于单文档应用程序,
只要在On_Close()中重新写入代码即可.如下:
void 类名::OnClose(){
    if(不想关闭)
 {    
   ShowWindow(SW_HIDE); //HIDE WINDOW
   return;
 }
 CWnd::OnClose();
}
阅读更多

没有更多推荐了,返回首页