在VC++6.0中使用气泡提示(转)

首先需要更新一下VC6.0的SDK,方法如下: 把ShellAPI.h文件中的关于任务栏提示的函数和常量替换为下面的内容:

Tray notification definitions


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;
#ifdef UNICODE
typedef NOTIFYICONDATAW NOTIFYICONDATA;
typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
#else
typedef
NOTIFYICONDATAA NOTIFYICONDATA;
typedef PNOTIFYICONDATAA PNOTIFYICONDATA;
#endif // UNICODE


#define NOTIFYICONDATAA_V1_SIZE     FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
#define NOTIFYICONDATAW_V1_SIZE     FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
#ifdef UNICODE
#define NOTIFYICONDATA_V1_SIZE      NOTIFYICONDATAW_V1_SIZE
#else
#define
NOTIFYICONDATA_V1_SIZE      NOTIFYICONDATAA_V1_SIZE
#endif

#define
NOTIFYICONDATAA_V2_SIZE     FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
#define NOTIFYICONDATAW_V2_SIZE     FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
#ifdef UNICODE
#define NOTIFYICONDATA_V2_SIZE      NOTIFYICONDATAW_V2_SIZE
#else
#define
NOTIFYICONDATA_V2_SIZE      NOTIFYICONDATAA_V2_SIZE
#endif


#if
(_WIN32_IE >= 0x0500)
#define NIN_SELECT          (WM_USER + 0)
#define NINF_KEY            0x1
#define NIN_KEYSELECT       (NIN_SELECT | NINF_KEY)
#endif

#if
(_WIN32_IE >= 0x0501)
#define NIN_BALLOONSHOW     (WM_USER + 2)
#define NIN_BALLOONHIDE     (WM_USER + 3)
#define NIN_BALLOONTIMEOUT  (WM_USER + 4)
#define NIN_BALLOONUSERCLICK (WM_USER + 5)
#endif


#define
NIM_ADD         0x00000000
#define NIM_MODIFY      0x00000001
#define NIM_DELETE      0x00000002
#if (_WIN32_IE >= 0x0500)
#define NIM_SETFOCUS    0x00000003
#define NIM_SETVERSION  0x00000004
#define     NOTIFYICON_VERSION 3
#endif

#define
NIF_MESSAGE     0x00000001
#define NIF_ICON        0x00000002
#define NIF_TIP         0x00000004
#if (_WIN32_IE >= 0x0500)
#define NIF_STATE       0x00000008
#define NIF_INFO        0x00000010
#endif
#if
(_WIN32_IE >= 0x600)
#define NIF_GUID        0x00000020
#endif

#if
(_WIN32_IE >= 0x0500)
#define NIS_HIDDEN              0x00000001
#define NIS_SHAREDICON          0x00000002

// says this is the source of a shared icon

// Notify Icon Infotip flags
#define NIIF_NONE       0x00000000
// icon flags are mutually exclusive
// and take only the lowest 2 bits
#define NIIF_INFO       0x00000001
#define NIIF_WARNING    0x00000002
#define NIIF_ERROR      0x00000003
#define NIIF_ICON_MASK  0x0000000F
#if (_WIN32_IE >= 0x0501)
#define NIIF_NOSOUND    0x00000010
#endif
#endif

SHSTDAPI_(BOOL) Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
SHSTDAPI_(BOOL) Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
#ifdef UNICODE
#define Shell_NotifyIcon  Shell_NotifyIconW
#else
#define
Shell_NotifyIcon  Shell_NotifyIconA
#endif // !UNICODE


End Tray Notification Icons

 

在stdafx.h文件中添加以下内容:

#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0500 //为 IE 5.0 及更新版本改变为适当的值。
#endif


自定义消息及处理函数:

#define MYWM_NOTIFYICON WM_USER+1
afx_msg void OnMyIconNotify(WPARAM wParam,LPARAM lParam);
ON_MESSAGE(MYWM_NOTIFYICON,OnMyIconNotify
)

添加变量: NOTIFYICONDATA m_nData;

 

在任务栏通知区添加图标和提示的代码:

m_nData.cbSize=sizeof(NOTIFYICONDATA);
m_nData.hWnd=GetSafeHwnd();
m_nData.uFlags=NIF_MESSAGE|NIF_INFO|NIF_ICON;
m_nData.uCallbackMessage=MYWM_NOTIFYICON;
m_nData.uID=IDR_MAINFRAME;
m_nData.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nData.dwInfoFlags=NIIF_INFO;

_tcscpy
(m_nData.szInfoTitle,"管理员");
_tcscpy(m_nData.szInfo,"欢迎使用");

Shell_NotifyIcon(NIM_ADD,&m_nData);

修改气泡提示的代码:

void CTipDlg::OnButton1()
{
_tcscpy(m_nData.szInfoTitle,"提醒你"
);
_tcscpy(m_nData.szInfo,"内容改变"
);
m_nData.uTimeout=1000
;
m_nData.uVersion=NOTIFYICON_VERSION;
Shell_NotifyIcon(NIM_MODIFY,&m_nData
);

}

删除的代码:
BOOL CTipDlg::DestroyWindow()
{
  Shell_NotifyIcon(NIM_DELETE,&m_nData
);
  return CDialog::DestroyWindow
();
}

 

消息处理函数:

void CTipDlg::OnMyIconNotify(WPARAM wParam,LPARAM lParam)
{
UINT uMouseMsg=LOWORD(lParam);
switch(uMouseMsg)
{
case WM_LBUTTONDBLCLK:
SendMessage(WM_CLOSE,0,0);
break;

case WM_LBUTTONDOWN:
Shell_NotifyIcon(NIM_MODIFY,&m_nData);
break;
}
}

具体使用方法请参考源代码和相关资料!

顺便提供一下在VB中的使用方法:

'添加两个菜单'注意:要运行本全程,您必须安装  Win2000/XP  或更高版本的操作系统(Shell  version  5  or  better)
'在窗口中添加菜单如下:
'        标题                  名称
'        测试                  mnuTest
'        ...关于            mnuabout
'        ...退出            mnuexit
'然后将以下代码复制到窗体代码区:
Option Explicit
'向窗口发送消息
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long , ByVal wMsg As Long , ByVal wParam As Long , lparam As Any ) As Long
'获取鼠标坐标(全屏幕)
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI ) As Long
Private
Type POINTAPI
       X  As Long
      
As Long
End
Type
'设置窗口为前景窗口
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long ) As Long
'***********************最小化到任务栏要使用的API、常数、枚举等开始*************************
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long , lpData As NOTIFYICONDATA ) As Long
Private
Type NOTIFYICONDATA
       cbSize  As Long   'NOTIFYICONDATA类型的大小,用Len(变量名)获得即可
      
hwnd  As Long   '窗体的名柄
      
uId  As Long   '图标资源的ID号,通常使用  vbNull
      
uFlags  As Long   '使哪些参数有效它是以下枚举类型中的  NIF_INFO  Or  NIF_ICON  Or  NIF_TIP  Or  NIF_MESSAGE  四个常数的组合
      
uCallBackMessage  As Long   '接受消息的事件
      
hIcon  As Long   '图标名柄
      
szTip  As String * 128     '当鼠标停留在图标上时显示的Tip文本
      
dwState  As Long   '通常为  0
      
dwStateMask  As Long   '通常为  0
      
szInfo  As String * 256     'Tip文本正文
      
uTimeoutOrVersion  As Long       '由于VB中没有Union类型,只能用Long型代替
      
szInfoTitle  As String * 64     'Tip文本的标题
      
dwInfoFlags  As Long
End
Type
Private Const NOTIFYICON_VERSION = 3
Private Const NOTIFYICON_OLDVERSION = 0
'操作任务栏图标的常数
Private Const NIM_ADD = &H0      '添加图标
Private Const NIM_MODIFY = &H1      '修改图标
Private Const NIM_DELETE = &H2      '删除图标
Private Const NIM_SETFOCUS = &H3
Private Const NIM_SETVERSION = &H4
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4
Private Const NIF_STATE = &H8
Private Const NIF_INFO = &H10
Private Const NIS_HIDDEN = &H1
Private Const NIS_SHAREDICON = &H2
'Tip上的图标
Private Const NIIF_NONE = &H0      '没有图标
Private Const NIIF_WARNING = &H2      '“警告”图标(黄色的“!”)
Private Const NIIF_ERROR = &H3      '“错误”图标(红色的“X”)
Private Const NIIF_INFO = &H1      '“消息”图标(蓝色的“i”)
Private Const WM_MOUSEMOVE = &H200                '在图标上移动鼠标
Private Const WM_LBUTTONDOWN = &H201            '鼠标左键按下
Private Const WM_LBUTTONUP = &H202                '鼠标左键释放
Private Const WM_LBUTTONDBLCLK = &H203        '双击鼠标左键
Private Const WM_RBUTTONDOWN = &H204            '鼠标右键按下
Private Const WM_RBUTTONUP = &H205                '鼠标右键释放
Private Const WM_RBUTTONDBLCLK = &H206        '双击鼠标右键
Private Const WM_SETHOTKEY = &H32                  '响应您定义的热键
Private Const SC_RESTORE = &HF120 &      '还原窗口
Private Const WM_SYSCOMMAND = &H112      '系统消息
Private nfIconData   As NOTIFYICONDATA
Public Enum TipType
   [ttAdd] = NIM_ADD
   [ttModify] = NIM_MODIFY
   [ttDelete] = NIM_DELETE
End Enum
'***********************最小化到任务栏要使用的API、常数、枚举等结束*************************
'显示、修改或删除  Balloon  ToolTip
Private Sub ShowToolTip (frmName As Form , ttTipType As TipType , Optional strTip As String = "" , Optional strTitle As String = "" , Optional strInfo As String = "" )
If ttTipType = ttDelete Then
   Call
Shell_NotifyIcon (NIM_DELETE , nfIconData )
  
Exit Sub
End If
With
nfIconData
       .cbSize = Len (nfIconData )
       .
hwnd = frmName .hwnd
       .uId = vbNull
       .uFlags = NIF_INFO Or NIF_ICON Or NIF_TIP Or NIF_MESSAGE
       .hIcon = frmName .Icon
       .szTip = strTip & vbNullChar
       .dwState = 0
      
.dwStateMask = 0
      
.szInfo = strInfo & vbNullChar
       .uTimeoutOrVersion = 5000
      
.szInfoTitle = strTitle & vbNullChar
       .dwInfoFlags = NIIF_INFO
       .uCallBackMessage = WM_LBUTTONUP
End With
Call
Shell_NotifyIcon (ttTipType , nfIconData )
End Sub

Private Sub
Form_Load ()
Call ShowToolTip ( Me , ttAdd , "Hello!" , "Hello!" , "看到了吗?这个就是  Balloon  ToolTip!" )
End Sub
Private Sub
Form_Unload (Cancel As Integer )
Call ShowToolTip ( Me , ttDelete )
End Sub
Private Sub
Form_MouseUp (Button As Integer , Shift As Integer , X As Single , Y As Single )
Dim Result   As Long
Dim
Msg   As Long
'X的值依赖与显示模式的设置
If Me .ScaleMode = vbPixels Then
  
Msg = X
Else
  
Msg = X / Screen .TwipsPerPixelX
End If
Select Case
Msg
   Case WM_LBUTTONDOWN
       '在这里加入鼠标左键释放时你想做的操作
      
If Me .WindowState = vbMinimized Then
           Me
.Show
           SendMessage Me .hwnd , WM_SYSCOMMAND , SC_RESTORE , 0      '还原窗口大小
      
Else
           Me
.WindowState = vbMinimized
           Me .Hide
       End If
End Select
End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值