青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
2009-12-09 15:08

VC6.0下實(shí)現(xiàn)系統(tǒng)托盤的氣泡提示窗口

Windows中與托盤圖標(biāo)相關(guān)的提示有兩類:一類是傳統(tǒng)的信息提示方式,當(dāng)光標(biāo)移到圖標(biāo)上時顯示;另一類是新式的信息提示即氣球提示,它是由你的程序來控制顯示。氣球提示有點(diǎn)像連環(huán)漫畫中的文字氣球。

首先需要更新一下VC6.0的SDK(ShellAPI.h文件)

使用下面是這個結(jié)構(gòu)的定義的最新版本(For IE5.0+),其中已經(jīng)加入了新的成員:

typedef struct _NOTIFYICONDATA {
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
} NOTIFYICONDATA, *PNOTIFYICONDATA;

1.把ShellAPI.h文件中的關(guān)于任務(wù)欄提示的函數(shù)和常量替換為下面的內(nèi)容(重要):

屏蔽掉以前的源文件,如下
////
//// Tray notification definitions
////


////
//// End Tray Notification Icons
////

2.在次添加如下的新文件
//start
////
//// 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
////
///end

3.在stdafx.h文件中添加:

#ifndef _WIN32_IE // 允許使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0500 //為 IE 5.0 及更新版本改變?yōu)檫m當(dāng)?shù)闹怠?br />#endif
4.添加函數(shù)(需要先添加系統(tǒng)托盤圖標(biāo))

//添加成員變量
NOTIFYICONDATA m_nid;

BOOL CMyCatchFun::ShowBalloonTip(
CWnd* pWnd,
LPCTSTR szMsg,
LPCTSTR szTitle,
UINT uTimeout,
UINT uCallbackMessage
)
{
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.uTimeout = uTimeout;
m_nid.uVersion = NOTIFYICON_VERSION;
m_nid.dwInfoFlags = NIIF_INFO; //如果前面修改錯誤,這里會發(fā)生"未定義標(biāo)識符"錯誤
m_nid.uFlags = NIF_MESSAGE|NIF_INFO|NIF_ICON;
m_nid.uID = IDR_MAINFRAME;
m_nid.hWnd = pWnd->m_hWnd;
m_nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nid.uCallbackMessage = uCallbackMessage;
_tcscpy(m_nid.szInfoTitle,szTitle);
_tcscpy(m_nid.szInfo,szMsg);
return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
}
5.修改氣球提示信息

void CMyDlg::OnButton1()
{
_tcscpy(m_nid.szInfoTitle,"提醒你");
_tcscpy(m_nid.szInfo,"內(nèi)容改變");
m_nid.uTimeout=1000;
m_nid.uVersion=NOTIFYICON_VERSION;
Shell_NotifyIcon(NIM_MODIFY,&m_nid);
}

在NOTIFYICONDATA.uFlags中的標(biāo)志之一是NIF_TIP,用它來設(shè)置傳統(tǒng)的信息提示,即鼠標(biāo)要移動到圖標(biāo)上。新的標(biāo)志NIF_INFO(由于_WIN32_IE >= 0x0500條件定義,因此在編譯時,請注意包含最新版本的頭文件shellapi.h,并保證鏈接最新版本的庫文件shell32.lib,分發(fā)程序時用最新版本的運(yùn)行時動態(tài)鏈接庫shell32.dll)便是為顯示氣球提示所用的。也就是說,要顯示氣球提示,那么在調(diào)用Shell_NotifyIcon函數(shù)時必須用NIF_INFO標(biāo)志。提示文本填入szInfo域,標(biāo)題文本填入szInfoTitle。你甚至可以在NOTIFYICONDATA.uTimeout中設(shè)置一個超時時間,當(dāng)經(jīng)過指定的毫秒數(shù)之后,氣球提示自動隱藏。
為了示范氣球提示的實(shí)現(xiàn)原理,我對本文前面兩個部分的例子以及CTrayIcon類進(jìn)行了修改。CTrayIcon類中添加了一個新的方法ShowBalloonTip,這個方法有兩個重載函數(shù),既可以用文本串來調(diào)用,也可以用資源ID來調(diào)用。用資源ID時,可以有選擇地加載文本串,并調(diào)用ShowBalloonTip的文本串版本,原型如下:

BOOL CTrayIcon::ShowBalloonTip(LPCTSTR szMsg, LPCTSTR szTitle, UINT uTimeout, DWORD dwInfoFlags) { m_nid.cbSize=sizeof(NOTIFYICONDATA); m_nid.uFlags = NIF_INFO; m_nid.uTimeout = uTimeout; m_nid.dwInfoFlags = dwInfoFlags; strcpy(m_nid.szInfo,szMsg ? szMsg : _T("")); strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T("")); return Shell_NotifyIcon(NIM_MODIFY, &m_nid); }

這個函數(shù)很容易理解,同時也夠繁瑣的,要把文本串載緩沖里拷來拷去。缺省的dwInfoFlags設(shè)置為NIIF_INFO,在文本旁邊顯示信息圖標(biāo);其它可能的標(biāo)志是NIIF_ERROR——表示出錯,NIIF_WARNING——表示警告,NIIF_NONE——沒有圖標(biāo)。有關(guān)修改后的CTrayIcon以及TrayTest3源代碼請下載本文的例子。
只有一種方法可以顯示氣球提示(Shell_NotifyIcon),但終止的方法有多種。用戶可以在氣球上單擊鼠標(biāo),也可以單擊關(guān)閉按鈕(在Windows 2000里沒有關(guān)閉按鈕,如圖一),或者Windows用超時機(jī)制來終止氣球提示。那么是如何知道所發(fā)生的事件是什么呢?每當(dāng)創(chuàng)建托盤圖標(biāo)時,你可以提供一個HWND和消息ID來接收事件發(fā)生的通知。如果用戶單擊氣球提示,Windows發(fā)送NIN_BALLOONUSERCLICK;如果超時或者單擊關(guān)閉按鈕,Windows則發(fā)送NIN_BALLOONTIMEOUT。就我所知,目前還沒有辦法區(qū)分是超時還是單擊了關(guān)閉按鈕。下表中列出的是所有與氣球提示相關(guān)的通知消息:

通知消息 描述
NIN_BALLOONSHOW 顯示氣球提示時發(fā)送
NIN_BALLOONHIDE 氣球提示消失時發(fā)送;例如,當(dāng)圖標(biāo)被刪除,如果因?yàn)槌瑫r或是用戶單擊鼠標(biāo)氣球消失,此消息不會被發(fā)送
NIN_BALLOONTIMEOUT 當(dāng)由于超時或者用戶單擊氣球上的關(guān)閉按鈕(X),使氣球消失時發(fā)送此消息
NIN_BALLOONUSERCLICK 當(dāng)用戶在氣球提示上或托盤圖標(biāo)上單擊鼠標(biāo)(此時氣球處于顯示狀態(tài))時發(fā)送此消息


在測試過程中,我發(fā)現(xiàn)一個奇特的現(xiàn)象:在Windows XP中,只要你的托盤程序擁有焦點(diǎn),氣球提示便不會超時。顯然,你只有轉(zhuǎn)到其它應(yīng)用程序,才能啟動計(jì)時器。在Windows 2000里好像沒有這個問題。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情不卡| 亚洲视频1区| 在线免费观看日本欧美| 欧美福利视频网站| 久久精品一区蜜桃臀影院| 日韩一区二区免费看| 欧美国产日韩xxxxx| 久久综合九色综合久99| 久久国产精品久久久| 亚洲视频碰碰| av成人免费在线| 日韩午夜剧场| 亚洲精品国产日韩| 最新日韩在线视频| 亚洲欧洲日产国产综合网| 国产精品久久久久久久久久直播| 久久久久**毛片大全| 中文日韩在线视频| 一区二区三区视频在线观看| 日韩视频三区| 亚洲视频日本| 香蕉久久国产| 亚洲一区二区三区免费在线观看| 国产一区二区三区丝袜| 国内伊人久久久久久网站视频| 国产麻豆精品在线观看| 韩日成人在线| 亚洲国产黄色| 日韩性生活视频| 亚洲欧美国产高清va在线播| 欧美制服丝袜第一页| 久久夜色精品国产欧美乱极品| 免费看黄裸体一级大秀欧美| 欧美一区二区大片| 久久全国免费视频| 亚洲一区二区三区在线播放| 一区精品在线播放| 亚洲黄色一区| 亚洲尤物精选| 羞羞答答国产精品www一本 | 黄色亚洲在线| 亚洲福利久久| 中文一区二区| 亚洲国产精品成人综合| 99视频超级精品| 欧美亚洲色图校园春色| 巨胸喷奶水www久久久免费动漫| 欧美激情bt| 亚洲欧美中日韩| 久久一区欧美| 99热免费精品| 久久夜色撩人精品| 欧美体内谢she精2性欧美| 国产精品夜夜嗨| 99re6这里只有精品| 久久国产视频网站| 亚洲欧洲日韩综合二区| 香蕉精品999视频一区二区 | 国产日韩在线一区| 国产视频一区在线| 在线亚洲高清视频| 欧美暴力喷水在线| 亚洲男人第一av网站| 欧美激情1区2区3区| 久久动漫亚洲| 国产精品美女久久久免费| 91久久亚洲| 久久精品免费电影| 日韩亚洲综合在线| 蜜桃久久精品乱码一区二区| 日韩视频不卡| 欧美激情视频一区二区三区免费| 国产精品国产三级国产aⅴ9色| 亚洲国产精品www| 欧美一区二区三区久久精品茉莉花| 欧美韩国一区| 久久久噜噜噜久久狠狠50岁| 欧美国产精品中文字幕| 在线观看欧美日韩国产| 久久激情综合网| 亚洲一本大道在线| 欧美午夜理伦三级在线观看| 亚洲精品永久免费精品| 欧美成人精品激情在线观看| 久久成人羞羞网站| 黄网站色欧美视频| 亚洲视频在线看| 日韩香蕉视频| 欧美亚一区二区| 亚洲一区二三| 亚洲永久免费观看| 欧美破处大片在线视频| 日韩视频不卡| 日韩一区二区精品在线观看| 一区二区免费在线视频| 国产精品久久久久久av下载红粉 | 免费成人毛片| 欧美激情精品久久久久久大尺度| 99综合视频| 欧美亚洲免费电影| 亚洲精品日韩综合观看成人91| 亚洲精品一区二区三区蜜桃久| 国产精品日日摸夜夜添夜夜av| 久久香蕉国产线看观看网| 欧美aa在线视频| 亚洲欧美中日韩| 欧美黑人多人双交| 亚洲欧美乱综合| 久久综合色一综合色88| 亚洲综合国产激情另类一区| 久久亚洲精品伦理| 久久成人人人人精品欧| 欧美夫妇交换俱乐部在线观看| 午夜精品一区二区三区四区| 欧美成人黄色小视频| 久久精品99国产精品日本| 欧美高清自拍一区| 玖玖在线精品| 国产视频观看一区| 一本一本久久| 亚洲乱码国产乱码精品精| 午夜一级久久| 亚洲欧美精品suv| 欧美日韩精品一区二区三区| 鲁大师影院一区二区三区| 国产午夜精品视频| 野花国产精品入口| 亚洲乱码久久| 欧美成人一区二免费视频软件| 久久久噜噜噜久噜久久| 国产精品成人aaaaa网站| 一区二区三区久久久| 久久久美女艺术照精彩视频福利播放| 亚洲午夜女主播在线直播| 欧美电影美腿模特1979在线看| 久久久人成影片一区二区三区观看| 国产精品卡一卡二| 免费亚洲一区二区| 国产亚洲美州欧州综合国| 亚洲一区久久| 性伦欧美刺激片在线观看| 欧美日韩在线播放三区四区| 亚洲一区二区三区影院| 欧美午夜一区二区| 99国产欧美久久久精品| 9国产精品视频| 欧美激情一区三区| 亚洲国内欧美| 99re6热只有精品免费观看 | 国产精品素人视频| 午夜精品久久久| 久久精品av麻豆的观看方式| 国产曰批免费观看久久久| 欧美伊人久久| 免费日韩成人| 99国产精品久久久久老师 | 精品二区久久| 蜜桃av一区| 99精品视频一区| 久久成人精品无人区| 在线观看国产成人av片| 欧美成人dvd在线视频| 亚洲日本视频| 久久国产精彩视频| 亚洲高清成人| 国产精品二区在线| 久久激情综合网| 亚洲人久久久| 久久久久久久久蜜桃| 亚洲精品久久久久久久久| 欧美精品在线播放| 欧美一区二区三区的| 欧美国产免费| 午夜宅男欧美| 亚洲伦伦在线| 国产一区美女| 欧美日韩精品在线| 欧美一区二区三区免费视频| 亚洲国内精品在线| 久久精品亚洲乱码伦伦中文| 亚洲精品久久久久久下一站| 国产精品久久久久av| 欧美成人dvd在线视频| 性欧美激情精品| 日韩一二三在线视频播| 美女久久一区| 先锋影音国产精品| 日韩一级片网址| 黄色成人在线免费| 国产精品分类| 欧美高清免费| 久久久久久亚洲精品不卡4k岛国| 亚洲欧洲另类| 美女网站久久| 久久精品国产77777蜜臀| 亚洲欧美在线免费观看| 日韩一区二区免费高清| 狠狠久久亚洲欧美| 国产日韩欧美一区在线| 国产精品青草综合久久久久99|