VC++实现小托盘的处理

jopen 11年前

    // 实验一Dlg.cpp : implementation file        //                #include "stdafx.h"        #include "实验一.h"        #include "实验一Dlg.h"                //添加的头文件        #include "shlwapi.h"        #define WM_NOTIFYICON   WM_USER+1                //        #ifdef _DEBUG        #define new DEBUG_NEW        #undef THIS_FILE        static char THIS_FILE[] = __FILE__;        #endif                /////////////////////////////////////////////////////////////////////////////        // CAboutDlg dialog used for App About                class CAboutDlg : public CDialog        {        public:            CAboutDlg();                // Dialog Data            //{{AFX_DATA(CAboutDlg)            enum { IDD = IDD_ABOUTBOX };            //}}AFX_DATA                    // ClassWizard generated virtual function overrides            //{{AFX_VIRTUAL(CAboutDlg)            protected:            virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support            //}}AFX_VIRTUAL                // Implementation        protected:            //{{AFX_MSG(CAboutDlg)            //}}AFX_MSG            DECLARE_MESSAGE_MAP()        };                CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)        {            //{{AFX_DATA_INIT(CAboutDlg)            //}}AFX_DATA_INIT        }                void CAboutDlg::DoDataExchange(CDataExchange* pDX)        {            CDialog::DoDataExchange(pDX);            //{{AFX_DATA_MAP(CAboutDlg)            //}}AFX_DATA_MAP        }                BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)            //{{AFX_MSG_MAP(CAboutDlg)                // No message handlers            //}}AFX_MSG_MAP        END_MESSAGE_MAP()                /////////////////////////////////////////////////////////////////////////////        // CMyDlg dialog                CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)            : CDialog(CMyDlg::IDD, pParent)        {            //{{AFX_DATA_INIT(CMyDlg)                // NOTE: the ClassWizard will add member initialization here            //}}AFX_DATA_INIT            // Note that LoadIcon does not require a subsequent DestroyIcon in Win32            m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);        }                void CMyDlg::DoDataExchange(CDataExchange* pDX)        {            CDialog::DoDataExchange(pDX);            //{{AFX_DATA_MAP(CMyDlg)                // NOTE: the ClassWizard will add DDX and DDV calls here            //}}AFX_DATA_MAP        }                BEGIN_MESSAGE_MAP(CMyDlg, CDialog)            //{{AFX_MSG_MAP(CMyDlg)            ON_WM_SYSCOMMAND()            ON_WM_PAINT()            ON_WM_QUERYDRAGICON()            ON_BN_CLICKED(IDC_BUTTON1, OnButton1)            ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)   //消息映射部分加入            ON_COMMAND(ID_SHOW, OnShow)        //执行定义的函数            ON_COMMAND(ID_EXIT, OnExit)            //}}AFX_MSG_MAP        END_MESSAGE_MAP()                /////////////////////////////////////////////////////////////////////////////        // CMyDlg message handlers                BOOL CMyDlg::OnInitDialog()        {            CDialog::OnInitDialog();                    // Add "About..." menu item to system menu.                    // IDM_ABOUTBOX must be in the system command range.            ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);            ASSERT(IDM_ABOUTBOX < 0xF000);                    CMenu* pSysMenu = GetSystemMenu(FALSE);            if (pSysMenu != NULL)            {                CString strAboutMenu;                strAboutMenu.LoadString(IDS_ABOUTBOX);                if (!strAboutMenu.IsEmpty())                {                    pSysMenu->AppendMenu(MF_SEPARATOR);                    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);                }            }                    // Set the icon for this dialog.  The framework does this automatically            //  when the application's main window is not a dialog            SetIcon(m_hIcon, TRUE);         // Set big icon            SetIcon(m_hIcon, FALSE);        // Set small icon                        //初始化NOTIFYICONDATA结构                    m_Nid.cbSize = sizeof(NOTIFYICONDATA);            m_Nid.hWnd = m_hWnd;            m_Nid.uID = 100;            m_Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;            m_Nid.uCallbackMessage = WM_NOTIFYICON;            m_Nid.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),                 MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, NULL);            StrCpy(m_Nid.szTip, _T("Demo"));                        return TRUE;  // return TRUE  unless you set the focus to a control        }                void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)        {            if ((nID & 0xFFF0) == IDM_ABOUTBOX)            {                CAboutDlg dlgAbout;                dlgAbout.DoModal();            }            else            {                CDialog::OnSysCommand(nID, lParam);            }        }                // If you add a minimize button to your dialog, you will need the code below        //  to draw the icon.  For MFC applications using the document/view model,        //  this is automatically done for you by the framework.                void CMyDlg::OnPaint()         {            if (IsIconic())            {                CPaintDC dc(this); // device context for painting                        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);                        // Center icon in client rectangle                int cxIcon = GetSystemMetrics(SM_CXICON);                int cyIcon = GetSystemMetrics(SM_CYICON);                CRect rect;                GetClientRect(&rect);                int x = (rect.Width() - cxIcon + 1) / 2;                int y = (rect.Height() - cyIcon + 1) / 2;                        // Draw the icon                dc.DrawIcon(x, y, m_hIcon);            }            else            {                CDialog::OnPaint();            }        }                // The system calls this to obtain the cursor to display while the user drags        //  the minimized window.        HCURSOR CMyDlg::OnQueryDragIcon()        {            return (HCURSOR) m_hIcon;        }                void CMyDlg::OnButton1()         {            // TODO: Add your control notification handler code here            //隐藏窗口            ShowWindow(SW_HIDE);                        //在任务栏中添加图标             Shell_NotifyIcon(NIM_ADD, &m_Nid);        }                void CMyDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)        {            if (wParam == 100)            {                if (lParam == WM_LBUTTONDBLCLK)      //当点击左键的时候                {                    //删除任务栏中的图标                     Shell_NotifyIcon(NIM_DELETE, &m_Nid);                    //显示窗口                    ShowWindow(SW_SHOWNORMAL);                    UpdateWindow();                }                        else             if (lParam == WM_RBUTTONDOWN || lParam == WM_LBUTTONDOWN)  //当点击右键的时候                {                    //显示快捷子菜单                    CMenu menu;                     if (!menu.LoadMenu(IDR_MENU1))                    {                        return;                    }                    CPoint point;                     GetCursorPos(&point);                     SetForegroundWindow();                    CMenu* pSubMenu = menu.GetSubMenu(0);                    if (pSubMenu == NULL)                    {                        return;                    }                    pSubMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,                         point.x, point.y, this, NULL);                     PostMessage(WM_NULL, 0, 0);                  }            }        }                void CMyDlg::OnShow()   //菜单项的显示实现        {            //删除任务栏中的图标             Shell_NotifyIcon(NIM_DELETE , &m_Nid);            //显示窗口            ShowWindow(SW_SHOWNORMAL);            UpdateWindow();        }                void CMyDlg::OnExit()     //菜单项的退出实现        {            //删除任务栏中的图标             Shell_NotifyIcon(NIM_DELETE, &m_Nid);            //关闭窗口            SendMessage(WM_CLOSE);        }