关于托盘的一点总结
2006-07-20 11:37:31 来源:WEB开发网if (start_minimized)
PostMessage(WM_CLOSE);
当我们鼠标移走的时候就发送一个CLOSE命令,关闭窗口。我们在文件VioletPlay.cpp中加上一句代码时程序运行的时候即可以在托盘中显示又可以在桌面上显示:
dlg.start_minimized=GetProfileInt(_T(""),_T("StartMinimized"),FALSE);
我们在这里在显示主程序的对话框之前加上这句代码,起到一个“拦截”作用。 这样我们就实现了最初的功能,即在托盘中出现了一个图标,但是这还是远远不够的,我们在来一步步实现其他的功能。
3、虽然我们有了一个托盘菜单,但是我们到现在还不能通过单击鼠标右键使它出现,因为我们的程序还不能响应这个消息,下面我们通过重载函数:afx_msg LONG OnTrayNotification( WPARAM wparam, LPARAM lparam )并在里面加上响应代码来实现这个功能。
我们用switch…case…结构来响应鼠标右键这一消息,当然如果你愿意也是可以用if语句来实现同样的功能的。
代码如下:
LONG CVioletPlayDlg::OnTrayNotification(WPARAM wparam, LPARAM lparam)
{
switch ( lparam )
{
case WM_RBUTTONDOWN:
{// 用户在托盘图标上单击鼠标右键,弹出上下文菜单隐藏/显示对话框。
CMenu oMenu;
if (oMenu.LoadMenu(IDR_TUOPAN))
{
CMenu* pPopup = oMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint oPoint;
if (IsWindowVisible())// 根据对话框窗口的显示/隐藏状态修改菜单名称
oMenu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"隐藏(&H)");
else
oMenu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"显示(&S)");
// 确定鼠标位置以便在该位置附近显示菜单
GetCursorPos( &oPoint );
SetForegroundWindow();
pPopup->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
oPoint.x, oPoint.y, this);
}
}
break;
// 单击/双击鼠标左键均显示出对话框
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
OnShow();
break;
}
return 0;
}
在上述代码中我们同时实现了动态改变菜单“显示/隐藏”的功能,当程序主界面出现时,菜单中变为“隐藏”表示如果我们再单击它时程序主界面就隐藏起来了。如果为隐藏状态时菜单中变为“显示”表示当我们单击它时可以显示程序主界面。 另外,在上面代码的最后三句表示不管我们是单击还是双击鼠标左键它发送的命令都是一样的即出现主程序界面,即OnShow()。
我们在对托盘菜单中的命令一个一个的分析。 这里的“退出”菜单我们使程序真正的退出,因此它接受的命令为 ::PostQuitMessage(0),使程序真正退出,注意前面我们也说了,其它的两个“退出”皆为隐藏。因为程序的使用者也许并不知道这一点,所以我们有必要在这里设计一个对话框进行提醒,如果要求这一点我们就把点击“退出”菜单所发送的命令改为调用一个AfxMessageBox,当是使用者点击“是”才实现真正的退出。点击“否”而不退出。
代码如下:
void CVioletPlayDlg::OnClose()
{
if(AfxMessageBox("真的要退出吗",MB_YESNO)==IDYES)
{
AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_BLEND);
KillTimer(0);
::PostQuitMessage(0);
}
}
当你点击了文件菜单中的退出时也是同样的道理只是当你点击“是”时只能隐藏主界面,而当你点击“否”时,不能隐藏主界面。我们只需要把上面代码中的退出命令:::PostQuitMessage(0)改为隐藏命令ShowWindow(SW_HIDE)就可以了。
到现在为止我们实现了托盘图标的所有功能。
注意:类CSystemTray继承于CWnd是public形式,类的定义和实现可以参考文件:VioletPlay,文件名分别为SystemTray.h和SystemTray.cpp 源文件见:VioletPlay (注,有一些代码用的是VCKBASE网站中,我只对其进行了分析和总结。再此表示谢意和歉意)
更多精彩
赞助商链接