hur.cn - 华软网

 热门搜索

SDI及MDI程序如何最小到系统托盘?

  作者:未知    来源:网络    更新时间:2010/12/7
如题,当最小化或关闭时才最小化到系统托盘。
---华软 网友回答---
C++">void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);

// TODO: 在此处增加消息措置惩罚程序代码
if(nType==SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE);
m_trayIcon.SetIcon(        
        HICON hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        LPCSTR lpTip = "投影仪";

        UINT msg;
m_nid.uFlags = 0;

//设定图标 
if(hicon)
{
//判断是要在系统托盘中增加照旧要删除图标
msg = m_nid.hIcon ? NIM_MODIFY : NIM_ADD;
m_nid.hIcon = hicon;
m_nid.uFlags |= NIF_ICON;
}
else
{
//删除图标 
if(m_nid.hIcon==NULL)
{
//已被删除
return TRUE;
}
msg = NIM_DELETE;
}

if(lpTip)
{
strncpy(m_nid.szTip,lpTip,sizeof(m_nid.szTip));
}

if(m_nid.szTip[0])
{
m_nid.uFlags |= NIF_TIP;
}

if(m_nid.uCallbackMessage && m_nid.hWnd)
{
m_nid.uFlags |= NIF_MESSAGE;
}

BOOL bRet = Shell_NotifyIcon(msg, &m_nid);

if(msg==NIM_DELETE || !bRet)
{
m_nid.hIcon = NULL;
}

}
}

---华软网友回复---
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(IDR_MAINFRAME));
memset(m_nid.szTip,0,sizeof(m_nid.szTip));
memcpy(m_nid.szTip,arrTrayNote,sizeof(arrTrayNote));
Shell_NotifyIcon(NIM_ADD, &m_nid);                // 在托盘区增加图标


ON_MESSAGE(WM_SHOWTASK,OnShowTask)


LRESULT CMainDlg::OnShowTask(WPARAM wParam, LPARAM lParam)

{
if(wParam != IDR_MAINFRAME)
{
return 1;
}
switch(lParam)
{
case WM_RBUTTONUP:                                        // 右键起来时弹出菜单
{
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint);                    // 获得鼠标位置
CMenu menu;
menu.CreatePopupMenu();                    // 声明一个弹出式菜单
menu.AppendMenu(MF_STRING, WM_DESTROY,_T("退出程序"));
menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTALIGN, lpoint->x ,lpoint->y, this);
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK:                                 // 双击左键的措置惩罚
{
::ShowWindow(this->m_hWnd, SW_SHOWNA); 
this->ShowWindow(SW_SHOWNORMAL);         // 显示主窗口
::SetWindowPos(this->m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
}
break;
}
return 0;
}


void CMainDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if(nType == SIZE_MINIMIZED) 
{
ShowWindow(SW_HIDE); // 当最小化市,隐藏主窗口    
}
}

---华软网友回复---
1楼的,以下语句是否是应该改一下
m_trayIcon.SetIcon(        
HICON hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
改成  
HICON hicon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_trayIcon.SetIcon(hicon)
---华软网友回复---
当关闭或最小化的时候ShowWindow(SW_HIDE);隐藏窗口      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。