⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcb_a5.htm

📁 C++Builder教学大全
💻 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>  

      &amp;OKButton <br>  

      CancelButton <br>  

      Caption <br>  

      &amp;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 &amp;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(&amp;icondata,0,sizeof(icondata));② <br>  

      icondata.cbSize=sizeof(icondata); <br>  

      <br>  

      icondata.hWnd=Handle;③ <br>  

      strncpy(icondata.szTip,"我的任务",sizeof(icondata.szTip));④ <br>  

      Application-&gt;Icon-&gt;LoadFromFile("e:\\yxg\\map\\system\\ico\\yxg.ico");   

      <br>  

      icondata.hIcon=Application-&gt;Icon-&gt;Handle; ⑤ <br>  

      icondata.uCallbackMessage=ugIconMessage;⑥ <br>  

      icondata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;⑦ <br>  

      Shell_NotifyIcon(NIM_ADD,&amp;icondata);⑧ <br>  

      } <br>  

      void TForm1::DeleteTray()//删除任务栏布告区图标 <br>  

      { <br>  

      NOTIFYICONDATA icondata; <br>  

      memset(&amp;icondata,0,sizeof(icondata)); <br>  

      icondata.cbSize=sizeof(icondata); <br>  

      icondata.hWnd=Handle; <br>  

      Shell_NotifyIcon(NIM_DELETE,&amp;icondata); ⑧ <br>  

      } <br>  

      void __fastcall TForm1::WndProc(Messages::TMessage &amp;Message) <br>  

      { <br>  

      if(Message.Msg==ugIconMessage)//如果产生的是与该图标相关的消息 <br>  

      { <br>  

      if(Message.LParam==WM_LBUTTONDBLCLK) <br>  

      Application-&gt;Terminate();⑨ <br>  

      if(Message.LParam==WM_RBUTTONDBLCLK) <br>  

      { <br>  

      ShowWindow(Application-&gt;Handle,SW_SHOW);// <br>  

      Application-&gt;ShowMainForm=true; <br>  

      Form1-&gt;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-&gt;Visible=false;③ <br>  

      } <br>  

      ①调用RegisterWindowMessage()函数来创建一个独一无二的消息编号,以确保没有冲突;②在任务栏布告区创建图标;③显示窗体; <br>  

      在Form1的OnDestroy事件中加入DeleteTray()函数以删除图标。 <br>  

      将OKButton与CancelButton按钮的OnClick事件增加代码以隐藏主窗口及终止程序运行。 <br>  

      void __fastcall TForm1::OKButtonClick(TObject *Sender) <br>  

      { <br>  

      Form1-&gt;Visible=false; <br>  

      ShowWindow(Application-&gt;Handle,SW_HIDE); <br>  

      Application-&gt;ShowMainForm=false; <br>  

      } <br>  

      //---------------------------------------------------------------------------   

      <br>  

      <br>  

      void __fastcall TForm1::CancelButtonClick(TObject *Sender) <br>  

      { <br>  

      Application-&gt;Terminate(); <br>  

      } <br>  

      最后,在WinMain函数中增加两行代码以便程序在开始运行时就隐藏主窗体。 <br>  

      WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) <br>  

      { <br>  

      try <br>  

      { <br>  

      Application-&gt;Initialize(); <br>  

      Application-&gt;CreateForm(__classid(TForm1), &amp;Form1); <br>  

      ShowWindow(Application-&gt;Handle,SW_HIDE); <br>  

      Application-&gt;ShowMainForm=false; <br>  

      Application-&gt;Run(); <br>  

      } <br>  

      catch (Exception &amp;exception) <br>  

      { <br>  

      Application-&gt;ShowException(&amp;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 + -