今天在弄这个东东 其它的网上都有 我在这里更喜欢这样的方法:
下面这个方法是生成和删除托盘图标的方法
void CMYDlg::toTray(BOOL show) //如果show为真 就是要显示窗口 否则放到托盘
{
NOTIFYICONDATA pnid;
pnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//该结构体大小
pnid.hWnd=m_hWnd; //窗口句柄
pnid.uID=(UINT)m_hIcon; //图标句柄
pnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; /*图标有效|自定义消息有效|鼠标指向显示文字有效*/
pnid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
pnid.hIcon=m_hIcon; //图标句柄
strcpy(pnid.szTip,"这是我的托盘图标");//鼠标指到那所显示的文字
if(!show)
{
Shell_NotifyIcon(NIM_ADD,&pnid);//在托盘区添加图标
ShowWindow(SW_HIDE);//隐藏主窗口
}
else
{
Shell_NotifyIcon(NIM_DELETE,&pnid);//删除托盘图标
ShowWindow(SW_SHOW);//显示主窗口
}
}
以上方法的中的 这句: ShowWindow(SW_SHOW);//显示主窗口 执行了生并不能把窗口显示在最前面 而只是在任务栏上有显示 那么我们把 SW_SHOW 换成 SW_RESTORE);//用原来的大小和位置显示主窗口,就能够把我们的窗口显示到最前面了
而我们怎么知道一个窗口的最小化按钮被点击了呢???
可以重载这个函数:
void CtestMinDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (nType == SIZE_MINIMIZED) //SIZE_MINIMIZED就表示最小化按钮被点击了 那么托盘上的图标也就要消失了 下面这句就是删除图标了
{
toTray(FALSE);
}
}
LRESULT CtestMinDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
toTray(TRUE); //这句则是使show为真 就是显示窗口
//this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿 ,我们这儿不采用了
}
break;
}
return 0;
}
如果我写的有的地方 你不清楚的 你可以在网上查其它相关的 我这个只是对网上其它的一个优化