分享
 
 
 

在任务栏上显示图标

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在任务栏上显示图标

阿伦工作室 邱理

Windows 95/Windows NT任务栏的右边是一状态区,Windows95/Wi

ndowsNT在其上显示时间和一些小图标,这些图标代表着特定的功能或

程序,用鼠标单击、右击或双击这些图标,就会弹出功能菜单或程序窗

口等。你也许想把自己的程序图标也放在任务栏的状态区上,很简单,

VC++ 5.0提供了一个函数,让你很容易地实现该功能。

Shell_NotifyIcon()函数

该函数发送消息给系统在任务栏的状态区,增加、删除或修改图

标。Shell_NotifyI con()有两个参数:

1. DWORD dwMessage

消息标志值,为以下三个中之一:

NIM_ADD

在任务栏状态区增加图标

NIM_DELETE 从任务栏状态区删除图标

NIM_MODITY 修改任务栏状态区的图标

2. PNOTIFYICONDATA pnid

指向NOTIFYICONDATA结构的指针。NOTIFYICONDATA结构如下:

typedef struct _NOTIFYICONDATA { // nid

DWORD cbSize; // NOTIFYICONDATA 结构的大小

HWND hWnd; //接收回调消息的窗口句柄

UINT uID; //自定义的图标标志值

UINT uFlags; //标志后面的三个数据成员哪个有效,

//可由NIF_ICON,NIF_MESSAGE和

NIF_TIP组合。

UINT uCallbackMessage; //回调消息

HICON hIcon; //图标句柄

char szTip[64]; //提示字符。当把鼠标移到任务栏

//状态区该图标上时,系统显示该字符

} NOTIFYICONDATA, *PNOTIFYICONDATA;

如何在任务栏状态区实现程序图标及其功能

1. 首先生成一个单文档的工程文件。

2. 在StdAfx.h 添加自定义的消息:

//回调消息

#define MYWM_NOTIFYICON WM_USER+1

//在任务栏状态区显示图标的消息

#define MYWM_SHOWAPPICONIC WM_USER+2

3. 在MainFrm.h 里添加定义消息处理函数说明,该部分看起来如

下:

protected:

//{{AFX_MSG(CMainFrame)

afx_msg void OnSysCommand(UINT nID, LPARAM lParam); //手

工加

afx_msg void OnMyIconNotify(WPARAM wParam, LPARAM lParam

); //手工加

afx_msg void OnShowAppIconic(WPARAM wParam, LPARAM lPara

m); //手工加

afx_msg void OnClose(); //系统生成

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

另外,需在MainFrm.h定义一开关值,记录程序窗口是打开或关闭

状态:

BOOL boolWndHadShow;

4. 在MainFrm.cpp里实现消息映射和消息处理函数。消息映射部

分看起来如下:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

ON_MESSAGE(MYWM_NOTIFYICON, OnMyIconNotify)

ON_MESSAGE(MYWM_SHOWAPPICONIC,OnShowAppIconic)

ON_WM_SYSCOMMAND()

ON_WM_CLOSE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

消息处理及相关函数如下所示:

//在任务栏状态区添加图标

BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon,

LPSTR lpszTip)

{

BOOL res;

NOTIFYICONDATA tnid;

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;

tnid.uCallbackMessage = MYWM_NOTIFYICON;

tnid.hIcon = hicon;

if (lpszTip)

lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));

else

tnid.szTip[0]=‘\0';

res=shell_NotifyIco n(NIM_ADD, &tnid);

if (hicon)

DestroyIcon(hicon);

return res;

}

//从任务栏状态区删除图标

BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)

{

BOOL res;

NOTIFYICONDATA tnid;

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

res = Shell_NotifyIcon(NIM_DELETE, &tnid);

return res;

}

//处理图标回调消息MYWM_NOTIFYICON

void CMainFrame::OnMyIconNotify( WPARAM wParam, LPARAM l

Param )

{

UINT nID;

UINT uMouseMsg;

nID = (UINT)wParam;

uMouseMsg = (UINT) lParam;

if(uMouseMsg == WM_LBUTTONDOWN)

//点击图标

{

if( boolWndHadShow ) //如果窗口已打开,隐藏窗口

ShowWindow(SW_HIDE );

else

//否则,显示窗口

ShowWindow(SW_SHOWNORMAL );

boolWndHadShow = ~boolWndHadShow;

}

}

//消息MYWM_SHOWAPPICONIC处理函数,在任务栏显示图标并隐藏

窗口

void CMainFrame::OnShowAppIconic(WPARAM wParam, LPARAM l

Param )

{

HICON theIcon = LoadIcon(AfxGetInstance-Handle(),MAKEINT

RESOURCE(IDR_MAI NFRAME) );

MyTaskBarAddIcon(GetSafeHwnd(), 100, theIcon, _T("示范程

序"));

ShowWindow(SW_HIDE );

boolWndHadShow = FALSE;

}

当程序关闭时,需把图标从任务样状态区删除,你可以添加一个处

理WM_CLOSE消息的函数来删除图标。通过ClassWizard来添加处理WM_

CLOSE的函数OnClose(),该函数如下:

void CMainFrame::OnClose()

{

// TODO: Add your message handler code here and/or call

default

MyTaskBarDeleteIcon( GetSafeHwnd(), 100 );

CFrameWnd::OnClose();

}

当用户把窗口最小化时,你应隐藏整个窗口,所以要处理ON_SYSCO

MMAND消息。首先在MainFrm.h添加函数说明,如第三步所示;然后在Ma

inFrm.cpp里说明消息映射和实现函数。消息映射如前面所示,函数实

现如下:

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam )

{

if (nID==SC_MINIMIZE )

{

ShowWindow(SW_HIDE );

boolWndHadShow=FALSE;

}

else

CWnd::OnSysCommand(nID, lParam );

}

5. 在InitInstance()函数返回前,添加一语句

m_pMainWnd->PostMessage( MYWM_SHOWAP- PICONIC );

它是发送一个自定义的消息MYWM_SHOWAP- PICONIC使程序启动后

隐藏程序窗口并在任务栏状态区显示小图标。

6. 现在,你可编译和运行该程序了。程序运行后,点击任务栏状

态区该程序的图标, 系统会弹出程序窗口,再点击一下,又隐藏了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有