怎样在任务栏显示图标
发布网友
发布时间:2022-04-23 09:45
我来回答
共2个回答
热心网友
时间:2023-09-08 19:43
---- Windows95/WindowNT 任 务 栏 的 右 边 是 一 状 态 区,
Windows95/WindowsNT 在 其 上 显 示 时 间 和 一 些 小 图 标, 这 些 图
标 代 表 着 特 定 的 功 能 或 程 序, 用 鼠 标 单 击、 右 击 或 双 击
这 些 图 标, 就 会 弹 出 功 能 菜 单 或 程 序 窗 口 等。 如 你 用 过
金 山 词 霸 或 超 级 解 霸, 你 会 觉 得 这 些 图 标 使 软 件 用 起 来
很 方 便。 你 也 许 想 把 自 己 的 程 序 图 标 也 放 在 任 务 栏 的 状
态 区 上, 很 简 单,Visual C++ 5.0 提 供 了 一 个 函 数, 让 你 很 容
易 地 实 现 该 功 能。
---- Visual C++ 提 供 的 函 数 是Shell_NotifyIcon(), 该 函 数 发 送 消
息 给 系 统 在 任 务 栏 的 状 态 区 增 加、 删 除 或 修 改 图 标。
Shell_NotifyIcon() 有 两 个 参 数:
---- 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)<br/>afx_msg void OnSysCommand( UINT nID, LPARAM lParam ); <br/>// 手 工 加<br/>afx_msg void OnMyIconNotify( WPARAM wParam, LPARAM lParam ); <br/>// 手 工 加<br/>afx_msg void OnShowAppIconic( WPARAM wParam, LPARAM lParam ); <br/>// 手 工 加<br/>afx_msg void OnClose(); <br/>// 系 统 生 成<br/>//}}AFX_MSG
DECLARE_MESSAGE_MAP()
---- 另 外, 需 在MainFrm.h 定 义 一 开 关 值, 记 录 程 序 窗 口 是 打
开 或 关 闭 状 态:
BOOL boolWndHadShow;
---- 4. 在MainFrm.cpp 里 实 现 消 息 映 射 和 消 息 处 理 函 数。 消 息
映 射 部 分 看 起 来 如 下:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)<br/>ON_MESSAGE(MYWM_NOTIFYICON, OnMyIconNotify)<br/>ON_MESSAGE(MYWM_SHOWAPPICONIC, OnShowAppIconic)<br/>ON_WM_SYSCOMMAND()<br/>ON_WM_CLOSE()<br/>//}}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_NotifyIcon(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 lParam )
{
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 lParam )
{
HICON theIcon = LoadIcon(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME) );
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_SYSCOMMAND 消 息。 首 先 在MainFrm.h 添 加 函 数 说 明, 如 第3
步 所 示; 然 后 在MainFrm.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_SHOWAPPICONIC );
---- 它 是 发 送 一 个 自 定 义 的 消 息MYWM_SHOWAPPICONIC 使 程 序 启
动 后 隐 藏 程 序 窗 口 并 在 任 务 栏 状 态 区 显 示 小 图 标。
---- 6. 现 在, 你 可 编 译 和 运 行 该 程 序 了。 程 序 运 行 后, 点
击 任 务 栏 状 态 区 该 程 序 的 图 标, 系 统 会 弹 出 程 序 窗 口,
再 点 击 一 下, 又 隐 藏 了。 怎 么 样, 象 不 象 金 山 词 霸 ?
热心网友
时间:2023-09-08 19:43
请看图: 图中最后一个选项.