首先
新建一个muen菜单 id 为 IDR_MUEN2
添加两个 子选项 一个 是显示 一个 是退出 还可以自己设定
然后给两个子选项添加事件处理 注意选择要给哪一个Dlg添加事件
要注意选择
void CBBSDlg::OnMenuShow()
{
ShowWindow(SW_RESTORE);
TrayMyIcon(FALSE);
// TODO: 在此添加命令处理程序代码
}
和
void CBBSDlg::OnMenuExit()
{
// TODO: 在此添加命令处理程序代码
TrayMyIcon(FALSE);
CBBSDlg::OnCancel();
}
然后再类向导选择消息 添加自定义消息
我的消息设置为WM_TRAYICON_MSG 的
处理消息名称为 OnTrayiconMsg
然后加上
#define WM_TRAYICON_MSG (WM_USER+100)//自定义消息
afx_msg LRESULT CBBSDlg::OnTrayiconMsg(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONUP:
{
CMenu mMenu, *pMenu = NULL;
CPoint pt;
mMenu.LoadMenu(IDR_MENU2);
pMenu = mMenu.GetSubMenu(0);
GetCursorPos(&pt);
SetForegroundWindow();
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
break;
}
case WM_LBUTTONDBLCLK:
ShowWindow(SW_RESTORE);
SetForegroundWindow();
break;
default:break;
}
return NULL;
}
添加托盘实现代码
bool CBBSDlg::TrayMyIcon(bool bAdd)
{
BOOL bRet = FALSE;
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = m_hWnd;
tnd.uID = IDR_MAINFRAME;
if ( bAdd == TRUE ) {
tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnd.uCallbackMessage = WM_TRAYICON_MSG;
tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
_tcscpy_s(tnd.szTip, sizeof(tnd.szTip), _T("BBS_YDC_123"));
ShowWindow(SW_MINIMIZE);
ShowWindow(SW_HIDE);
bRet = Shell_NotifyIcon(NIM_ADD, &tnd);
}else{
ShowWindow(SW_SHOWNA);
SetForegroundWindow();
bRet = Shell_NotifyIcon(NIM_DELETE, &tnd);
}
return bRet;
}
//实现托盘
TrayMyIcon();
首先声明我看得教程是vc聊天室里面的托盘
资料内容是
---------------------------------------------------------------------------
VC 驿站
WwW.CcTry.Com
多抽出一分钟时间学习.让你的生命更加精彩.
C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
动画教程只是起到技术交流的作用.请大家不用利用此方法做非法用途.
由此动画造成的任何后果和动画作者及本站无关.
---------------------------------------------------------------------------
大家好,我是Syc QQ:7657318 QQ 技术交流群:84780266
今天给大家做的教程是:
Vc++ 打造局域网聊天室(10)---任务栏托盘功能的实现
---------------------------------------------------------------------------
1、封装 “其他功能” 按钮响应函数:
void CChatRoomDlg::OnBnClickedOther()
{
CPoint pt;
CRect mRect;
CMenu mMenu, *pMenu = NULL;
GetDlgItem(IDC_OTHER)->GetWindowRect(&mRect);
pt = mRect.BottomRight();
pt.y = mRect.top+10;
mMenu.LoadMenu(IDR_MENU1);
pMenu = mMenu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
}
2、任务栏托盘函数的封装:
BOOL CChatRoomDlg::TrayMyIcon(BOOL bAdd)
{
BOOL bRet = FALSE;
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = m_hWnd;
tnd.uID = IDR_MAINFRAME;
if ( bAdd == TRUE ) {
tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnd.uCallbackMessage = WM_TRAYICON_MSG;
tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
_tcscpy_s(tnd.szTip, sizeof(tnd.szTip), _T("聊天室v1.0"));
ShowWindow(SW_MINIMIZE);
ShowWindow(SW_HIDE);
bRet = Shell_NotifyIcon(NIM_ADD, &tnd);
}else{
ShowWindow(SW_SHOWNA);
SetForegroundWindow();
bRet = Shell_NotifyIcon(NIM_DELETE, &tnd);
}
return bRet;
}
3、消息响应函数的添加:
#define WM_TRAYICON_MSG (WM_USER+100)
ON_MESSAGE(WM_TRAYICON_MSG, OnTrayCallBackMsg)
LRESULT CChatRoomDlg::OnTrayCallBackMsg(WPARAM wparam, LPARAM lparam)
{
switch(lparam)
{
case WM_RBUTTONUP:
{
CMenu mMenu, *pMenu = NULL;
CPoint pt;
mMenu.LoadMenu(IDR_MENU2);
pMenu = mMenu.GetSubMenu(0);
GetCursorPos(&pt);
SetForegroundWindow();
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
break;
}
case WM_LBUTTONDBLCLK:
ShowWindow(SW_RESTORE);
SetForegroundWindow();
break;
default:break;
}
return NULL;
}
备注:本节课是《Vc++打造局域网聊天室》系列课程的最后一课,所有的功能也都给大家实现并讲解了,不知道大家学的怎么样!还是希望大家多实践,多写代码,以此来提高能力。
本程序代码已打包给大家,大家可以参考!
由于本作者能力有限,在《Vc++打造局域网聊天室》系列课程中如有错误信息,请指正!