📄 bcb_a5.htm
字号:
<html>
<head>
<title>Windows任务栏布告区图标</title>
<meta http-equiv="目录类型" content="文本/html; 字符集=gb2312">
</head>
<body bgcolor="#FFFFFF">
<table width="100%" border="0" height="285">
<tr>
<td height="35">
<div align="center" class="p14"><font color="#000000">Windows任务栏布告区图标</font></div>
</td>
</tr>
<tr valign="top">
<td><font color="#000000">北京1303信箱15分箱 尹小功</font>
<br>
<br>
许多应用程序,如输入法管理器、杀毒软件等均在任务栏布告区中放置一个有自已特色的图标,该图标让用户知道有一个后台程序正在运行,同时也提供了一种修改系统设置的快捷方法,本文将以C++
Builder为例简述它的实现方法。 <br>
打开一个新工程,将工程文件取名为test、单元文件取名为main。在窗口上放置二个按钮、一个标签,其属性按如下设置 <br>
组件 <br>
属性 <br>
值 <br>
Label1 <br>
Caption <br>
按OK按钮...终目程序 <br>
OKButton <br>
Caption <br>
&OKButton <br>
CancelButton <br>
Caption <br>
&CancelButton <br>
打开文件main.h,加入斜体部分声明(以手工输入部分均以斜体表示,以下同) <br>
class TForm1 : public TForm <br>
{ <br>
__published: // IDE-managed Components <br>
TButton *OKButton; <br>
TButton *CancelButton; <br>
TLabel *Label1; <br>
void __fastcall FormCreate(TObject *Sender); <br>
void __fastcall FormDestroy(TObject *Sender); <br>
void __fastcall OKButtonClick(TObject *Sender); <br>
void __fastcall CancelButtonClick(TObject *Sender); <br>
private: // User declarations <br>
unsigned ugIconMessage; <br>
void AddTray(); <br>
void DeleteTray(); <br>
protected: <br>
virtual void __fastcall WndProc(Messages::TMessage &Message); <br>
public: // User declarations <br>
__fastcall TForm1(TComponent* Owner); <br>
}; <br>
切换到main.cpp,加入以下函数及声明 <br>
#include <vcl.h><br>
#pragma hdrstop <br>
<br>
#include <shellapi.hpp><br>
#include "main.h" <br>
//---------------------------------------------------------------------------
<br>
#pragma package(smart_init) <br>
#pragma resource "*.dfm" <br>
TForm1 *Form1; <br>
//---------------------------------------------------------------------------
<br>
__fastcall TForm1::TForm1(TComponent* Owner) <br>
: TForm(Owner) <br>
{ <br>
} <br>
//---------------------------------------------------------------------------
<br>
void TForm1::AddTray()//创建任务栏布告区图标 <br>
{ <br>
NOTIFYICONDATA icondata;① <br>
memset(&icondata,0,sizeof(icondata));② <br>
icondata.cbSize=sizeof(icondata); <br>
<br>
icondata.hWnd=Handle;③ <br>
strncpy(icondata.szTip,"我的任务",sizeof(icondata.szTip));④ <br>
Application->Icon->LoadFromFile("e:\\yxg\\map\\system\\ico\\yxg.ico");
<br>
icondata.hIcon=Application->Icon->Handle; ⑤ <br>
icondata.uCallbackMessage=ugIconMessage;⑥ <br>
icondata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;⑦ <br>
Shell_NotifyIcon(NIM_ADD,&icondata);⑧ <br>
} <br>
void TForm1::DeleteTray()//删除任务栏布告区图标 <br>
{ <br>
NOTIFYICONDATA icondata; <br>
memset(&icondata,0,sizeof(icondata)); <br>
icondata.cbSize=sizeof(icondata); <br>
icondata.hWnd=Handle; <br>
Shell_NotifyIcon(NIM_DELETE,&icondata); ⑧ <br>
} <br>
void __fastcall TForm1::WndProc(Messages::TMessage &Message) <br>
{ <br>
if(Message.Msg==ugIconMessage)//如果产生的是与该图标相关的消息 <br>
{ <br>
if(Message.LParam==WM_LBUTTONDBLCLK) <br>
Application->Terminate();⑨ <br>
if(Message.LParam==WM_RBUTTONDBLCLK) <br>
{ <br>
ShowWindow(Application->Handle,SW_SHOW);// <br>
Application->ShowMainForm=true; <br>
Form1->Visible=true; ⑩ <br>
} <br>
return; <br>
} <br>
TForm::WndProc(Message); <br>
} <br>
①申请一个任务栏布告区图标的结构变量;②将结构变量的内容清零;③取得当前窗口的句柄;④输入鼠标经过该图标时的提示字符串;⑤将自已所喜爱的图标文件作为任务栏布告区的图标;⑥取得回调信息变量;⑦当结构变量中成员hIcon、uCallbackMessage与szTip
出错时将给出错误标志;⑧调用函数Shell_NotifyIcon()在任务栏布告区产生或删除一个图标;⑨当鼠标左键在该图标处双击时,终止程序运行;⑩当鼠标右键在该图标处双击时,显示与该图标相关的应用程序。我们知道,所有的TWinControl派生来的VCL类都有一个WndProc函数,调用这个函数可以发送消息并被相关的窗口接收,WndProc被定义成一个虚函数,这样一个派生类就可以定义它自已的WndProc函数来代替其父类的WndProc函数。在这里,与任务栏布告区图标相关的消息由子类的WndProc函数处理,否则调用父类的WndProc处理。
<br>
在Form1的OnCreate事件中加入以下代码: <br>
void __fastcall TForm1::FormCreate(TObject *Sender) <br>
{ <br>
ugIconMessage=RegisterWindowMessage("IconNotify");① <br>
AddTray();② <br>
Form1->Visible=false;③ <br>
} <br>
①调用RegisterWindowMessage()函数来创建一个独一无二的消息编号,以确保没有冲突;②在任务栏布告区创建图标;③显示窗体; <br>
在Form1的OnDestroy事件中加入DeleteTray()函数以删除图标。 <br>
将OKButton与CancelButton按钮的OnClick事件增加代码以隐藏主窗口及终止程序运行。 <br>
void __fastcall TForm1::OKButtonClick(TObject *Sender) <br>
{ <br>
Form1->Visible=false; <br>
ShowWindow(Application->Handle,SW_HIDE); <br>
Application->ShowMainForm=false; <br>
} <br>
//---------------------------------------------------------------------------
<br>
<br>
void __fastcall TForm1::CancelButtonClick(TObject *Sender) <br>
{ <br>
Application->Terminate(); <br>
} <br>
最后,在WinMain函数中增加两行代码以便程序在开始运行时就隐藏主窗体。 <br>
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) <br>
{ <br>
try <br>
{ <br>
Application->Initialize(); <br>
Application->CreateForm(__classid(TForm1), &Form1); <br>
ShowWindow(Application->Handle,SW_HIDE); <br>
Application->ShowMainForm=false; <br>
Application->Run(); <br>
} <br>
catch (Exception &exception) <br>
{ <br>
Application->ShowException(&exception); <br>
} <br>
return 0; <br>
} <br>
程序在C++ Builder 4 与Windows 98 环境下编译运行通过,状态如下图所示。 <br>
图1 TEST处于后台时的状态 <br>
图2 TEST被鼠标激活后的状态</td>
</tr>
</table>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -