VC6.0 系统托盘、气泡提示、右键菜单

系统环境:Windows 7
软件环境:vc++6.0 SP6
本次目的:实现系统托盘、气泡提示、右键菜单的效果

      系统托盘的效果,大家应该都见过,比如QQ、杀毒软件之类的都会在任务栏驻留图标。

废话少说先上几张图片看看是不是你们要的:

  

下面就来好好的玩下托盘吧!

1:新建一个对话框程序,这不用教了吧。

2:如果你要做气泡提示的效果的话,就要先修改SHELLAPI.h文件

主要修改后的代码如下:

typedef struct _NOTIFYICONDATAA {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;
#if (_WIN32_IE < 0x0500)
        CHAR   szTip[64];
#else
        CHAR   szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
        DWORD dwState;
        DWORD dwStateMask;
        CHAR   szInfo[256];
        union {
            UINT  uTimeout;
            UINT  uVersion;
        } DUMMYUNIONNAME;
        CHAR   szInfoTitle[64];
        DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
        GUID guidItem;
#endif
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
typedef struct _NOTIFYICONDATAW {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;
#if (_WIN32_IE < 0x0500)
        WCHAR  szTip[64];
#else
        WCHAR  szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
        DWORD dwState;
        DWORD dwStateMask;
        WCHAR  szInfo[256];
        union {
            UINT  uTimeout;
            UINT  uVersion;
        } DUMMYUNIONNAME;
        WCHAR  szInfoTitle[64];
        DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
        GUID guidItem;
#endif
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;

在对话框头文件中声明变量:NOTIFYICONDATA m_nid;再在实现文件中声明自定义消息变量:#define WM_SHOWTASK (WM_USER +1);

然后在消息映射函数里面添加一条声明消息:

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);

3:在对话框实现文件CPP里面在BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间加入

ON_MESSAGE(WM_SHOWTASK,onShowTask)

4:在对话框初始化函数中加入气泡提示代码

m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.hWnd=m_hWnd;
m_nid.uFlags=NIF_MESSAGE|NIF_INFO|NIF_ICON;
m_nid.uID=100;
m_nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nid.dwInfoFlags=NIIF_INFO;


_tcscpy(m_nid.szInfoTitle,"托盘软件");//显示的标题信息
_tcscpy(m_nid.szInfo,"欢迎使用");//显示的内部信息

Shell_NotifyIcon(NIM_ADD,&m_nid);

5、引入菜单Menu,在资源视图中加入菜单IDR_MENU1如图:

 在menu中加入三个子菜单,如图:添加后系统会自动在resource.h文件中加入定义如图:


6、为这三个子菜单添加三个响应事件。在对话框头文件中加入 afx_msg void OnShow();afx_msg void OnHide(); afx_msg void OnExit();三个函数的声明,然后在实现文件中在

BEGIN_MESSAGE_MAP(CTipDlg, CDialog)

//{{AFX_MSG_MAP(CTipDlg)和

//}}AFX_MSG_MAP
END_MESSAGE_MAP()之间加入:
ON_COMMAND(ID_SHOW, OnShow)
ON_COMMAND(ID_EXIT, OnExit)
ON_COMMAND(ID_HIDE, OnHide)

在分别实现这三个函数的代码即可:

void CTipDlg::OnShow()
{
//删除任务栏中的图标 
//Shell_NotifyIcon(NIM_DELETE , &m_nid);
//显示窗口
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
}
void CTipDlg::OnHide()
{
//隐藏窗口
ShowWindow(SW_HIDE);
}
void CTipDlg::OnExit()
{
//删除任务栏中的图标 
Shell_NotifyIcon(NIM_DELETE, &m_nid);
//关闭窗口
SendMessage(WM_CLOSE);
}

7、初始化NOTIFYICONDATA结构实现将鼠标放在图标上就出现提示信息。在对话框初始化中加入以下代码:

//初始化NOTIFYICONDATA结构
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.hWnd = m_hWnd;
m_nid.uID = 100;
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_nid.uCallbackMessage = WM_SHOWTASK;
m_nid.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), 
MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, NULL);
_tcscpy(m_nid.szTip, _T("托盘软件"));
Shell_NotifyIcon(NIM_MODIFY,&m_nid);

8、最后实现监听鼠标事件函数即步骤三中的onShowTask函数。代码如下:

void CTipDlg::onShowTask(WPARAM wParam,LPARAM lParam)//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
// TODO: 在此添加控件通知处理程序代码
if (wParam == 100)
{
//WM_LBUTTONDBLCLK 鼠标双击消息
//WM_LBUTTONDOWN   鼠标单击消息
if ((lParam==WM_LBUTTONDOWN))
{
//删除任务栏中的图标 
//Shell_NotifyIcon(NIM_DELETE, &m_nid);
//显示窗口
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
}
        //WM_RBUTTONDOWN 鼠标右键事件
else if ((lParam == WM_RBUTTONDOWN))
{
//显示快捷子菜单
CMenu menu; 
if (!menu.LoadMenu(IDR_MENU1))
{
return;
}
CPoint point; 
GetCursorPos(&point); 
SetForegroundWindow();
CMenu* pSubMenu = menu.GetSubMenu(0);
if (pSubMenu == NULL)
{//在这里出问题
return;
}
pSubMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON, 
point.x, point.y, this, NULL); 
PostMessage(WM_NULL, 0, 0);  
}
}

}

好了,差不多就是这样,第一次写这种博客,水平有限写的不好,不过我已经上传了源代码到csdn上,可以去下。



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值