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

    xiaoxiao2026-08-27  1

    头文件:

    #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); }

    转载请注明原文地址: https://ju.6miu.com/read-1311629.html
    最新回复(0)