MFC中实现对话框最小化到托盘功能

来源:互联网 发布:淘宝下载安装最新版本 编辑:程序博客网 时间:2024/04/27 02:40

头文件:

#define WM_SHOWTASK WM_USER+1

class XxxDlg : public CDialogEx
{
// Construction
public:
    XxxDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    enum { IDD = IDD_MFCTESTAPPLICATION_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam);
    DECLARE_MESSAGE_MAP()
public:
    NOTIFYICONDATA m_nid;
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnDestroy();
};

cpp文件:

CMFCTestApplicationDlg::CMFCTestApplicationDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMFCTestApplicationDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}

BEGIN_MESSAGE_MAP(CMFCTestApplicationDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_MESSAGE(WM_SHOWTASK, OnShowTask)
    ON_WM_SIZE()
    ON_WM_DESTROY()
END_MESSAGE_MAP()


BOOL CMFCTestApplicationDlg::OnInitDialog()
{
    CDialogEx::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)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        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

    // TODO: Add extra initialization here
    CMenu* menu = this->GetSystemMenu(FALSE);   
    menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);

    m_nid.cbSize  = (DWORD)sizeof(NOTIFYICONDATA);
    m_nid.hWnd    = this->m_hWnd;
    m_nid.uID     = IDR_MAINFRAME;
    m_nid.uFlags  = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
    m_nid.uCallbackMessage = WM_SHOWTASK;             // 自定义的消息名称
    m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
    wcscpy_s(m_nid.szTip, _T("自制播放器"));                // 信息提示条为"服务器程序"
    Shell_NotifyIcon(NIM_ADD, &m_nid);                // 在托盘区添加图标

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMFCTestApplicationDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);
    if(nType == SIZE_MINIMIZED)
    {
        ShowWindow(SW_HIDE); // 当最小化时,隐藏主窗口             
    }
    // TODO: Add your message handler code here
}


void CMFCTestApplicationDlg::OnDestroy()
{
    CDialogEx::OnDestroy();

    // TODO: Add your message handler code here
    // 系统关闭时在托盘区删除图标
    Shell_NotifyIcon(NIM_DELETE, &m_nid);
}


0 0
原创粉丝点击