VC++實現小托盤的處理

jopen 12年前發布 | 27K 次閱讀 C/C++開發 C/C++

    // 實驗一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);  
}  </pre><br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!