|
【代码】VC2008+XP系统下显示托盘气球 |
亮出13cm 十九级 |
新建一个mfc对话框程序,添加一个按钮,双击后把下面的代码复制进去:
NOTIFYICONDATA note; //note.cbSize=sizeof(NOTIFYICONDATA); note.cbSize = NOTIFYICONDATA_V2_SIZE; note.hWnd=this->GetSafeHwnd(); note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;//NIF_INFO必须包含 note.uID=IDR_MAINFRAME; //note.uCallbackMessage=WM_SHELLNOTIFY; lstrcpy(note.szTip,_T("内容3")); note.dwInfoFlags=NIIF_INFO; note.uTimeout=3000; lstrcpy(note.szInfo,_T("内容1")); lstrcpy(note.szInfoTitle,_T("内容2")); note.hIcon=LoadIcon(NULL,IDI_WINLOGO); Shell_NotifyIcon(NIM_ADD,¬e);
|
亮出13cm 十九级 |
最终效果。xp下也能显示哦
|
亮出13cm 十九级 |
在这段代码中,关键是:
note.cbSize = NOTIFYICONDATA_V2_SIZE; 网上大多数代码都是写的
//note.cbSize=sizeof(NOTIFYICONDATA); 所以导致了xp下无法弹出气球。
|
亮出13cm 十九级 |
反正记住只需要使用note.cbSize = NOTIFYICONDATA_V2_SIZE; 就能在xp下显示气球了,用不着define什么东西
|
亮出13cm 十九级 |
【vb2008下显示气球的方法】
Dim ac As NotifyIcon ac = New NotifyIcon ac.BalloonTipIcon = ToolTipIcon.Info ac.Visible = True ac.BalloonTipText = TextBox2.Text '这是内容 ac.BalloonTipTitle = TextBox1.Text '这是标题 ac.Icon = Icon ac.ShowBalloonTip(5000)
最终效果:
|
亮出13cm 十九级 |
因为vb2008里面只能用Windows Forms
|
亮出13cm 十九级 |
Windows Forms有一个特大缺点就是不能使用系统风格的菜单。因此我也不想用它
|
亮出13cm 十九级 |
【案例】VC++中先显示托盘图标,再显示气球的案例 nid.cbSize=NOTIFYICONDATA_V2_SIZE; nid.hWnd=m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO; //nid.uCallbackMessage=WM_SHOWTASK; nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //设置图标 wcscpy_s(nid.szTip,L"ddddddd"); //图标提示信息 //启动时不显示气球 lstrcpy(nid.szInfo,_T("")); lstrcpy(nid.szInfoTitle,_T("")); Shell_NotifyIcon(NIM_ADD,&nid); 然后添加一个函数,用来显示气球 void CMainFrame::ShowBalloon(CString title, CString content, unsigned int timeout, DWORD icon) { lstrcpy(nid.szInfo,content); lstrcpy(nid.szInfoTitle,title); nid.uTimeout=timeout; nid.dwInfoFlags=icon; Shell_NotifyIcon(NIM_MODIFY,&nid); } void CMainFrame::ShowBalloon(CString title, CString content) { ShowBalloon(title,content,5000,NIIF_INFO); } 这样就可以先显示托盘图标,然后显示气球了
调用时直接用ShowBalloon(标题,内容)
|
亮出13cm 十九级 |
补充一下,如果要响应鼠标点击托盘气球的消息,可以在WindowProc函数中(也就是网上说的响应托盘右键菜单的地方),加上:
if (lParam==NIN_BALLOONUSERCLICK) {
//这里你自己处理吧 AfxMessageBox(L"str"); }
就可以了。
比如把windows防火墙关掉,托盘就会弹出一个气泡,点击那个气泡就会弹出“安全中心”窗口,就是用的这个方法。
|