我做了一个基于对话框的mfc程序,现在想加一个托盘的实现,具体怎么做,在哪个函数中加,请大家帮帮我,谢谢

解决方案 »

  1.   

    在MSDN中查
    System Tray Balloon Tips and Freeing Resources Quickly in .NET
      

  2.   

    1.CTMyDlg::CTMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTMyDlg::IDD, pParent)
    { //{{AFX_DATA_INIT(CTshutDlg)
            ....
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    //加载托盘区图标,IDR_MAINFRAME是某一位图
    m_nWinVersion = WIN_UNKNOWN;
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}2.处理
    void CTMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    if(nID == SC_MINIMIZE)//最小化到托盘的函数 
       OnButtonMinmize();//你自己定义的一个最小化窗体的函数
    else if(nID == SC_CLOSE)//单击 X 后退出程序 
       OnButtonQuit();//自定义的退出程序的函数
    else
       CDialog::OnSysCommand(nID, lParam);
    }
    }3.用ClassWizard,添加消息响应:
    BEGIN_MESSAGE_MAP(CTMyDlg, CDialog)
    //{{AFX_MSG_MAP(CTMyDlg)
     .....
    ON_MESSAGE(WM_NOTIFYICON,OnWM_NOTIFYICON)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()添加函数
    void CTMyDlg::OnWM_NOTIFYICON(WPARAM wParam,LPARAM lParam)
    {//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 
    UINT nID = (UINT)wParam;
    UINT uMouseMsg = (UINT)lParam;
    switch(uMouseMsg)
    {
        case WM_LBUTTONDBLCLK://当双击的时候

    ShowWindow(SW_SHOW);
    BringWindowToTop();
    CenterWindow();
        break;
           }
    }
    就按以上步骤作一定可以的,祝你好运!
      

  3.   

    补充:
    void CTMyDlg::OnButtonMinmize() //用于加载托盘图
    {
       NOTIFYICONDATA nc;
       nc.cbSize = sizeof(NOTIFYICONDATA);
       nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
       nc.hWnd = m_hWnd;  //接收托盘消息是主程序窗口 
       lstrcpy(nc.szTip,"我的程序");  //鼠标停留在托盘图标上时显示的信息    
       nc.uCallbackMessage = WM_NOTIFYICON;  //自定义的消息名称 
       nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
       nc.uID = IDC_NOTIFYICON;
       Shell_NotifyIcon(NIM_ADD, &nc);  //在托盘区添加图标 
       m_bNotifyIconShow = TRUE; ShowWindow(SW_HIDE);
    }对应退出时
    void CTMyDlg::OnButtonQuit() 
    {
    CDialog::OnOK();  //程序退出,从托盘区删除图标
    NOTIFYICONDATA nc;
    nc.cbSize = sizeof(NOTIFYICONDATA);
    nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    nc.hWnd = m_hWnd;
        nc.uCallbackMessage = WM_NOTIFYICON;
    nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nc.uID = IDC_NOTIFYICON;
    Shell_NotifyIcon(NIM_DELETE, &nc);}
      

  4.   

    我的一个程序里封装的托盘操作类,直接用就行了。[code=c++]
    // TrayMan.h: interface for the CTrayMan class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)
    #define AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    class CTrayMan  
    {
    public:
    CTrayMan();
    virtual ~CTrayMan(); CWnd *m_pWnd;
    void SetWindow(CWnd *pWnd)
    {
    ASSERT(pWnd);
    m_pWnd = pWnd;
    }; BOOL RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL);
    BOOL UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage);
    BOOL ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL); BOOL ModifyIcon(UINT uID, HICON hIcon);
    BOOL ModifyMessage(UINT uID, UINT uMessage);
    BOOL ModifyTip(UINT uID, LPCTSTR lpszTip);
    };#endif // !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)// TrayMan.cpp: implementation of the CTrayMan class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "StickyNote.h"
    #include "TrayMan.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CTrayMan::CTrayMan()
    {
    }CTrayMan::~CTrayMan()
    {
    }BOOL CTrayMan::RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
    {
    ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
    nfd.cbSize = sizeof(NOTIFYICONDATA);
    nfd.hWnd = m_pWnd->m_hWnd;
    nfd.uID = uID;
    nfd.uCallbackMessage = uMessage;
    nfd.hIcon = hIcon;
    nfd.uFlags = NIF_ICON | NIF_MESSAGE;
    if (lpszTip)
    {
    lstrcpyn(nfd.szTip, lpszTip, 64);
    nfd.uFlags |= NIF_TIP;
    }
    return Shell_NotifyIcon(NIM_ADD, &nfd);
    }BOOL CTrayMan::UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage)
    {
    ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
    nfd.cbSize = sizeof(NOTIFYICONDATA);
    nfd.hWnd = m_pWnd->m_hWnd;
    nfd.uID = uID;
    nfd.uCallbackMessage = uMessage;
    nfd.hIcon = hIcon;
    nfd.uFlags = NIF_ICON | NIF_MESSAGE;
    return Shell_NotifyIcon(NIM_DELETE, &nfd);
    }BOOL CTrayMan::ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
    {
    UnregisterNotifyIcon(uID, hIcon, uMessage);
    return RegisterNotifyIcon(uID, hIcon, uMessage, lpszTip);
    }BOOL CTrayMan::ModifyIcon(UINT uID, HICON hIcon)
    {
    ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
    nfd.cbSize = sizeof(NOTIFYICONDATA);
    nfd.hWnd = m_pWnd->m_hWnd;
    nfd.uID = uID;
    nfd.hIcon = hIcon;
    nfd.uFlags = NIF_ICON;
    return Shell_NotifyIcon(NIM_MODIFY, &nfd);
    }BOOL CTrayMan::ModifyMessage(UINT uID, UINT uMessage)
    {
    ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
    nfd.cbSize = sizeof(NOTIFYICONDATA);
    nfd.hWnd = m_pWnd->m_hWnd;
    nfd.uID = uID;
    nfd.uCallbackMessage = uMessage;
    nfd.uFlags = NIF_MESSAGE;
    return Shell_NotifyIcon(NIM_MODIFY, &nfd);
    }BOOL CTrayMan::ModifyTip(UINT uID, LPCTSTR lpszTip)
    {
    ASSERT(m_pWnd->m_hWnd); NOTIFYICONDATA nfd;
    nfd.cbSize = sizeof(NOTIFYICONDATA);
    nfd.hWnd = m_pWnd->m_hWnd;
    nfd.uID = uID;
    nfd.uFlags = NIF_ICON | NIF_MESSAGE;
    nfd.szTip[0] = '\0';
    if (lpszTip)
    {
    lstrcpyn(nfd.szTip, lpszTip, 64);
    }
    nfd.uFlags = NIF_TIP;
    return Shell_NotifyIcon(NIM_MODIFY, &nfd);
    }
    [/code]
      

  5.   

    盖个楼,上个回复代码太难看了。btw: csdn的ubb太不友好了。
    // TrayMan.h: interface for the CTrayMan class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)
    #define AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    class CTrayMan
    {
    public:
      CTrayMan();
      virtual ~CTrayMan();  CWnd *m_pWnd;
      void SetWindow(CWnd *pWnd)
      {
        ASSERT(pWnd);
        m_pWnd = pWnd;
      };  BOOL RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL);
      BOOL UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage);
      BOOL ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip=NULL);  BOOL ModifyIcon(UINT uID, HICON hIcon);
      BOOL ModifyMessage(UINT uID, UINT uMessage);
      BOOL ModifyTip(UINT uID, LPCTSTR lpszTip);
    };#endif // !defined(AFX_TRAYMAN_H__85DA35DF_B355_471E_B8DB_86E433470EC1__INCLUDED_)// TrayMan.cpp: implementation of the CTrayMan class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "StickyNote.h"
    #include "TrayMan.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CTrayMan::CTrayMan()
    {
    }CTrayMan::~CTrayMan()
    {
    }BOOL CTrayMan::RegisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
    {
      ASSERT(m_pWnd->m_hWnd);  NOTIFYICONDATA nfd;
      nfd.cbSize = sizeof(NOTIFYICONDATA);
      nfd.hWnd = m_pWnd->m_hWnd;
      nfd.uID = uID;
      nfd.uCallbackMessage = uMessage;
      nfd.hIcon = hIcon;
      nfd.uFlags = NIF_ICON | NIF_MESSAGE;
      if (lpszTip)
      {
        lstrcpyn(nfd.szTip, lpszTip, 64);
        nfd.uFlags |= NIF_TIP;
      }
      return Shell_NotifyIcon(NIM_ADD, &nfd);
    }BOOL CTrayMan::UnregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage)
    {
      ASSERT(m_pWnd->m_hWnd);  NOTIFYICONDATA nfd;
      nfd.cbSize = sizeof(NOTIFYICONDATA);
      nfd.hWnd = m_pWnd->m_hWnd;
      nfd.uID = uID;
      nfd.uCallbackMessage = uMessage;
      nfd.hIcon = hIcon;
      nfd.uFlags = NIF_ICON | NIF_MESSAGE;
      return Shell_NotifyIcon(NIM_DELETE, &nfd);
    }BOOL CTrayMan::ReregisterNotifyIcon(UINT uID, HICON hIcon, UINT uMessage, LPCTSTR lpszTip)
    {
      UnregisterNotifyIcon(uID, hIcon, uMessage);
      return RegisterNotifyIcon(uID, hIcon, uMessage, lpszTip);
    }BOOL CTrayMan::ModifyIcon(UINT uID, HICON hIcon)
    {
      ASSERT(m_pWnd->m_hWnd);  NOTIFYICONDATA nfd;
      nfd.cbSize = sizeof(NOTIFYICONDATA);
      nfd.hWnd = m_pWnd->m_hWnd;
      nfd.uID = uID;
      nfd.hIcon = hIcon;
      nfd.uFlags = NIF_ICON;
      return Shell_NotifyIcon(NIM_MODIFY, &nfd);
    }BOOL CTrayMan::ModifyMessage(UINT uID, UINT uMessage)
    {
      ASSERT(m_pWnd->m_hWnd);  NOTIFYICONDATA nfd;
      nfd.cbSize = sizeof(NOTIFYICONDATA);
      nfd.hWnd = m_pWnd->m_hWnd;
      nfd.uID = uID;
      nfd.uCallbackMessage = uMessage;
      nfd.uFlags = NIF_MESSAGE;
      return Shell_NotifyIcon(NIM_MODIFY, &nfd);
    }BOOL CTrayMan::ModifyTip(UINT uID, LPCTSTR lpszTip)
    {
      ASSERT(m_pWnd->m_hWnd);  NOTIFYICONDATA nfd;
      nfd.cbSize = sizeof(NOTIFYICONDATA);
      nfd.hWnd = m_pWnd->m_hWnd;
      nfd.uID = uID;
      nfd.uFlags = NIF_ICON | NIF_MESSAGE;
      nfd.szTip[0] = '\0';
      if (lpszTip)
      {
        lstrcpyn(nfd.szTip, lpszTip, 64);
      }
      nfd.uFlags = NIF_TIP;
      return Shell_NotifyIcon(NIM_MODIFY, &nfd);
    }
      

  6.   

    使用方法简述,很简,应该能看懂吧?
    // 窗口类定义中定义常量
    #define ID_TRAYICON 10001
    #define WM_TRAYNOTIFY (WM_USER+300)// 窗口类定义总加以下定义
    CTrayMan m_tray;
    CMenu m_menu;
    afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);// 窗口消息映射里加如下映射
    ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)// 窗口初始化时执行如下代码
    m_menu.LoadMenu(IDR_TRAYMENU);
    m_tray.SetWindow(this);
    m_tray.RegisterNotifyIcon(ID_TRAYICON, m_hiconTray, WM_TRAYNOTIFY, "StickyNote");
    // 实现方法:当在托盘图标上点右键时弹出菜单
    LRESULT CStickyNoteDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
    {
      UINT uID = (UINT)wParam;
      UINT uMouseAction = (UINT)lParam;  if (uID == ID_TRAYICON)
      {
        if (uMouseAction == WM_RBUTTONUP)
        {
          CPoint pt;
          GetCursorPos(&pt);
          CMenu *pmenu = m_menu.GetSubMenu(0);
          SetForegroundWindow();
          pmenu->TrackPopupMenu(TPM_RIGHTALIGN, pt.x, pt.y, this, NULL);
          PostMessage(WM_NULL);
        }
      }
      return NULL;
    }
      

  7.   

    用Shell_NotifyIcon函数。响应WM_CLOSE消息,隐藏对话框,不要真正关闭。
      

  8.   

    我是这么写的:
    LRESULT CAccess_to_opsrvDlg::onShowTask(WPARAM wParam,LPARAM lParam) 
    //wParam接收的是图标的ID,而lParam接收的是鼠标的行为 

        if(wParam!=IDR_MAINFRAME) 
            return 1; 
        switch(lParam) 
        {    
            case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭” 
            {             LPPOINT lpoint = new tagPOINT; 
                ::GetCursorPos(lpoint);//得到鼠标位置 
                CMenu menu; 
                menu.CreatePopupMenu();//声明一个弹出式菜单 
                //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 
                //隐藏),将程序结束。 
                menu.AppendMenu(MF_STRING,WM_DESTROY, "关闭"); 
                //确定弹出式菜单的位置 
                menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y, this); 
                //资源回收 
                HMENU hmenu=menu.Detach(); 
                menu.DestroyMenu(); 
                delete lpoint; 
            } 
            break; 
            case WM_LBUTTONDBLCLK://双击左键的处理 
            { 
                this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿 
            } 
            break; 
        } 
        return 0;
    }
    怎么改成接受WM_CLOSE消息,这个消息响应函数的参数确定吗
      

  9.   

    LRESULT CAccess_to_opsrvDlg::onShowTask(WPARAM wParam,LPARAM lParam)  
    这个消息响应函数的参数确定吗
      

  10.   

    主要是Shell_NotifyIcon()方法
    搭配NOTIFYICONDATA 结构和标志位: NIM_DELETE,NIM_ADD,NIM_MODIFY.