用VS2005的VC++实现的Demo要求,程序一启动就最小化到托盘,还有点托盘的图标,直接显示出来,不要先显示在任务栏上,然后去点任务栏才显示出来。网上也很多介绍的,就是没有比较详细的,最好能给个Demo。先表示感谢!

解决方案 »

  1.   

    文档+代码系统托盘编程完全指南(一)
    http://www.vckbase.com/document/viewdoc/?id=492
    系统托盘编程完全指南(二)
    http://www.vckbase.com/document/viewdoc/?id=495
    系统托盘编程完全指南(三)
    http://www.vckbase.com/document/viewdoc/?id=498
      

  2.   

    要的是 用VS2005的VC++实现的Demo.
      

  3.   

    没用过VS2005, VS2005和VC6使用托盘没什么区别吧  
      

  4.   

    运行后隐藏窗口,托盘,点击后,MoveWindow,ShowWindow
      

  5.   

    1.新建一个主菜单,在第一个根菜单中添加"关闭",标识符ID_MENU_CLOSE
    2.自定义个WM_SHOWTASK,分为如下几步:
    (1)在stdafx.h文件中添加消息的定义:
    #define WM_SHOWTASK  WM_USER+1
    (2)在MainFrm中添加消息的声明:
    afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam);
    (3)在BEGIN与END宏之间添加如下语句:
    ON_MESSAGE(WM_SHOWTASK,&CMainFrame::OnShowTask)
    其中ON_MESSAGE用户处理自定义消息,它的第一个参数是消息代码,第二个参数是消息体方法名
    (4)创建消息体:
    LRESULT CMainFrame::OnShowTask(WPARAM wParam,LPARAM lParam)
    {
    //该消息的wParam是图标的标识符,lParam是消息代码
    }
    3.在类中定义如下成员变量:
    NOTIFYICONDATA notify;
    CMenu* menuPopup;
    4.在窗体的OnCreate方法体中加入NOTIFYICONDATA定义语句:
    notify.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
    notify.hIcon=AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDR_MAINFRAME));
    notify.hWnd=this->GetSafeHwnd();
    CString hello=_T("欢聚"); 
    _tcscpy_s(notify.szTip, hello.GetBuffer());  
    notify.uCallbackMessage=WM_SHOWTASK;
    notify.uFlags=NIF_MESSAGE|NIF_TIP|NIF_ICON;
    notify.uID=IDR_MAINFRAME;
    notify.uTimeout=2000;
    5.为了单击图标时呈现窗体,右击图标呈现菜单,需要实现WM_SHOWTASK方法体
    在CMainFrame::OnShowTask方法中加入:
    if(wParam!=IDR_MAINFRAME) return 0;
        switch(lParam)
    {
    case WM_RBUTTONDOWN:
    {
    this->SetForegroundWindow(); //加入此句使得当鼠标离开菜单时,菜单消失. 
        POINT point; 
                ::GetCursorPos(&point);//得到鼠标位置 
                CMenu menu; 
    menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU1));//声明一个弹出式菜单 

                //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 
                //隐藏),将程序结束。 
    menuPopup=menu.GetSubMenu(0);
                //确定弹出式菜单的位置 
                menuPopup->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); 
                //资源回收 
    break;
    }
    case WM_LBUTTONDOWN:
    ShowWindow(SW_SHOW);
    Shell_NotifyIcon(NIM_DELETE,&notify);
    break;

    }
    return 0;
    6.当窗体最小值时,呈现托盘图标
    声明如下方法:
    virtual LRESULT WindowProc(UINT message,WPARAM wParam,LPARAM lParam);
    实现此方法:
    LRESULT CMainFrame::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
    {
    if(message==WM_SYSCOMMAND)
    {
    if(wParam==SC_MINIMIZE)
    {
                Shell_NotifyIcon(NIM_ADD,&notify);
    ShowWindow(SW_HIDE);
    return 0;
    }
    }

    return CFrameWnd::WindowProc(message,wParam,lParam);
    }
    7.实现关闭菜单项的事件:
    加下如下消息声明:
    afx_msg void OnClose();
    注册此消息:
    ON_COMMAND(IDC_BUTTON1,&CNotifyIConsDlg::OnButton1)
    实现消息体:
    void CMainFrame::OnClose()
    {
    ::PostQuitMessage(0);
    }
    8.当窗体关闭时,托盘图标要自动消失:
    重载OnDestory方法:
    virtual void OnDestroy();
    实现方法体:
    void CMainFrame::OnDestroy()
    {
         Shell_NotifyIcon(NIM_DELETE,&notify);
    }