第一步:窗口最小化到托盘,显示图标。
这一步在网上一搜,真的很多文章,基本上都可以用吧。有的是在OnSize中最化时画图标,隐藏窗口;有的是在初始化时画图标,在OnSysCommand中判断最大化和最小化时进行窗口显示隐藏。我选择了后者。一开始在后面的步骤遇到了麻烦,最后第二种方法完成了。谅没再去试第一种方法。在OnSysCommand中显示隐藏,效果挺好的。
我的开发环境是VS2008,创建一个对话框应用程序,选中包含最小化框(因为要最小化到托盘)。因为我的程序只是设计成在屏幕右小角显示一个小窗口来开启、停止、配置服务的一些操作。所以不要最大化功能。
1、XXXDlg.h中声明一个方法用作显示托盘图标。void _fnToTray();
XXXDlg.cpp中实现如下
//在桌面右下角显示托盘图标
void CXXXDlg::_fnToTray()
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.hWnd = m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = WM_SYSTEMTRAY;
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
wcscpy_s(nid.szTip, _T("服务管理器"));
::Shell_NotifyIcon(NIM_ADD,&nid );
}
2、修改CXXXDlg::OnSysCommand(UINT nID, LPARAM lParam)方法,橙色为增加的代码
void CXXXDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else if(nID == SC_MAXIMIZE) //最大化
{
this->ShowWindow(SW_SHOW);
}
else if(nID == SC_MINIMIZE) //最小化,把他隐藏起来
{