MFC如何将对话框最小化到任务栏,点击之后还原到桌面?
如题,本人用MFC做了一游戏登陆器,但是没有最小化按钮,系统自带的按钮不符合要求,请问MFC如何将对话框最小化到任务栏,点击之后还原到桌面?
[解决办法]
最小化到托盘可以吗http://wenku.baidu.com/view/b5c0482c453610661ed9f4e0.html
[解决办法]
SetWindowPlacement Function
这个函数设置指定窗口的显示状态和恢复,最小化,最大化时的位置。
--------------------------------------------
The SetWindowPlacement function sets the show state and the restored, minimized, and maximized positions of the specified window.
Syntax
BOOL SetWindowPlacement( HWND hWnd,
WINDOWPLACEMENT *lpwndpl
);
[解决办法]
// 先添加一个成员变量NOTIFYICONDATA m_Nid; // 托盘// 然后添加如下成员函数// 初始化显示托盘void CRunDlg::InitPrompt(void){ // 设置托盘图标 m_Nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); m_Nid.hWnd = 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(IDR_MAINFRAME)); wcscpy(m_Nid.szTip, _T("仓库管理系统")); Shell_NotifyIcon(NIM_ADD, &m_Nid); // 在托盘区添加图标}// 添加托盘消息响应afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);ON_MESSAGE(WM_SHOWTASK, &CRunDlg::OnShowTask)// 托盘菜单消息函数LRESULT CRunDlg::OnShowTask(WPARAM wParam, LPARAM lParam){ if(wParam != IDR_MAINFRAME) // 判断图标ID是否相符 return 1; switch(lParam) { case WM_RBUTTONUP: {// 按鼠标右键 CPoint point; GetCursorPos(&point); CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, [color=#FF0000]IDM_SHOW_WINDOW[/color], _T("显示")); menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出")); SetForegroundWindow(); // 解决菜单失去焦点不消失的BUG menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); menu.DestroyMenu(); } break; case WM_LBUTTONDBLCLK: // 双击鼠标左键 OnShowWindow(); break; } return 0;}// 菜单项单击"显示"响应函数afx_msg void OnShowWindow();ON_COMMAND(IDM_SHOW_WINDOW, &CRunDlg::OnShowWindow)// 托盘菜单"显示"响应函数void CRunDlg::OnShowWindow(){ if(IsWindowVisible()) SendMessage(WM_SYSCOMMAND, SC_RESTORE, (LPARAM)m_hWnd); else ShowWindow(SW_SHOW);}// 重写窗口过程函数,来拦截MFC窗口“最小化”按钮点击消息响应让程序最小化到托盘LRESULT CRunDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){ // TODO: 在此添加专用代码和/或调用基类 // 单击最小化按钮 if (message == WM_SYSCOMMAND && wParam == SC_MINIMIZE) { //AfxMessageBox(_T("是否最小化窗口到托盘")); ShowWindow(SW_HIDE); // 隐藏主窗口 return 0; } return CDialog::DefWindowProc(message, wParam, lParam);}