您的位置:首页 > 其它

MFC程序任务栏托盘图标的实现

2013-04-21 13:49 375 查看
1.首先自定义函数

//添加任务栏托盘图标,Tray托盘

BOOL CChatRoomDlg::TrayMyIcon(BOOL bAdd)//bAdd为TRUE就添加,bAdd为FALSE就不添加。

{

BOOL bRet = FALSE;

NOTIFYICONDATA tnd;

tnd.cbSize = sizeof(NOTIFYICONDATA);

tnd.hWnd = GetSafeHwnd();//就是m_hWnd

tnd.uID = IDR_MAINFRAME;

if(bAdd == TRUE)

{

tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//uFlags这个参数为了标识下面的哪个参数可用

tnd.uCallbackMessage = WM_TRAYICON_MSG;//NIF_MESSAGE,任务栏托盘图标在被鼠标点击时触发的消息

tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//NIF_ICON

//_tcscpy_s(tnd.szTip,sizeof(tnd.szTip),_T("聊天室v1.0"));//NIF_TIP

memcpy(tnd.szTip,_T("聊天室v1.0"),sizeof(tnd.szTip));

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;

}

2.下面的函数是自定义的动态菜单的命令响应函数,在命令响应函数中调用TrayMyIcon();函数就可以实现点击该菜单时,程序界面消失,在任务栏托盘中显示一个图标。

//添加任务栏托盘图标

void CChatRoomDlg::OnMenuitemtray()

{

TrayMyIcon();

}

3.添加鼠标移动到任务栏托盘图标上时的自定义消息

#define WM_TRAYICON_MSG (WM_USER+100)//任务栏图标显示的消息(nd.uCallbackMessage = WM_TRAYICON_MSG;)

在消息映射中添加消息和消息响应函数的映射

ON_MESSAGE(WM_TRAYICON_MSG, OnTrayCallBackMsg)

下面是定义的是响应该消息的回调函数

//任务栏托盘图标的响应函数,鼠标只要放到任务栏托盘图标,就会触发WM_TRAYICON_MSG,消息调用这个函数

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();

TrayMyIcon(FALSE);

break;

default:

break;

}

return NULL;

}

至此就可以实现程序任务栏托盘图标的显示了,可以在switch中增加其他的消息响应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: