BCB如何将应用程序图标写到系统托盘中

本文详细介绍如何在BCB环境下创建系统托盘图标,并实现通过托盘图标控制窗体显示及程序退出的功能。具体步骤包括新建工程、设置窗体属性、编写事件处理代码等。

 

1、新建一个工程,将工程存到目录D:/BCBTray下,并在这个目录下拷入一个icon图标文件,文件名为Icon1.ico,作为本程序的系统托盘处的图标。
2、在这个工程中再增加一个窗体Form2,要注意的是这个工程中,Form1是启动窗体,它负责系统托盘图标的总控工作,并不负有其它责任。应用程序的主窗口是由Form2 来负责的。在Form1的代码窗Unit1.cpp增加如下代码:
#include "Unit2.h"
3、将Form1的BorderStyle属性设置为bsNone
4、在Form1的OnShow事件写如下代码:
void __fastcall TForm1::FormShow(TObject *Sender)
{
  Form1->Width=0;       
}
5、在Form1中增加一个PopupMenu1,并为它增加一个子菜单:它的两个菜单条为:显示网址管理专家、退出程序。
为“显示网址管理专家”写如下单击事件:
void __fastcall TForm1::N1Click(TObject *Sender)
{
  Form2->Show();
}
为“退出程序”写如下单击事件:
void __fastcall TForm1::N2Click(TObject *Sender)
{
  Form1->Close();
}
6、在Form1的代码头文件Unit1.h中的TForm1的类定义的public成员函数中写下如下代码:
__fastcall ~TForm1();
        TIcon *MyIcon;
        void virtual __fastcall IconClick(TMessage& Msg);
BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_USER+100,TMessage,IconClick)
END_MESSAGE_MAP(TForm)
这样,TForm1的类定义全貌为:
class TForm1 : public TForm
{
__published: // IDE-managed Components
        TPopupMenu *PopupMenu1;
        TMenuItem *N1;
        TMenuItem *N2;
        void __fastcall N1Click(TObject *Sender);
        void __fastcall N2Click(TObject *Sender);
        void __fastcall FormShow(TObject *Sender);
private: // User declarations
public:  // User declarations
        __fastcall TForm1(TComponent* Owner);

        __fastcall ~TForm1();
        TIcon *MyIcon;
        void virtual __fastcall IconClick(TMessage& Msg);
BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_USER+100,TMessage,IconClick)
END_MESSAGE_MAP(TForm)
};
7、在Unit1.cpp中的窗体的构造函数中写如下代码:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  MyIcon=new TIcon();
  TNotifyIconData IconData;
  MyIcon->LoadFromFile("Icon1.ico");
  IconData.cbSize=sizeof(IconData);
  IconData.hWnd=Handle;
  IconData.uID=100;
  IconData.hIcon=MyIcon->Handle;
  IconData.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
  IconData.uCallbackMessage=WM_USER+100;
  strcpy(IconData.szTip,"网址管理专家 单击左键显示窗体");
  Shell_NotifyIcon(NIM_ADD,&IconData);
  SetWindowLong(Application->Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
}
8、在Unit1.cpp中的窗体的析构函数中写如下代码:
__fastcall TForm1::~TForm1()
{
  TNotifyIconData IconData;
  IconData.cbSize=sizeof(IconData);
  IconData.hWnd=Handle;
  IconData.uID=100;
  Shell_NotifyIcon(NIM_DELETE,&IconData);
  delete MyIcon;
}
9、在Unit1.cpp中写窗体的公用成员函数IconClick代码:
void __fastcall TForm1::IconClick(TMessage& Msg)
{
  TPoint po;
  if(Msg.LParam==WM_LBUTTONDOWN)
  {
    Form2->Show();
  }
  if(Msg.LParam==WM_RBUTTONUP)
  {
    GetCursorPos(&po);
    PopupMenu1->Popup(po.x,po.y);
  }
}
10、由于Shell_NotifyIcon函数定义在ShellAPI.hpp文件中所以请将下面一句写到Unit1.h中:
#include <shellapi.hpp>
11、现在运行程序,系统图标就写到托盘中去了。
正文 

提供的引用内容未提及如何将数据写入Borland C++ Builder编译好的应用程序,不过从通用的编程逻辑来说,一般有以下几种常见方式: ### 通过文件操作写入数据 可以在应用程序中设计文件读写功能,将数据以文本或者二进制的形式写入文件。在BCB中可以使用标准的C++文件流库来实现。示例代码如下: ```cpp #include <iostream> #include <fstream> int main() { std::ofstream outFile("data.txt"); if (outFile.is_open()) { outFile << "这是要写入的数据" << std::endl; outFile.close(); } else { std::cerr << "无法打开文件" << std::endl; } return 0; } ``` ### 通过数据库操作写入数据 如果应用程序连接了数据库,可以通过数据库的API将数据插入到数据库中。以使用SQLite数据库为例: ```cpp #include <sqlite3.h> #include <iostream> static int callback(void *NotUsed, int argc, char **argv, char **azColName) { return 0; } int main() { sqlite3 *db; char *zErrMsg = 0; int rc; const char *sql; rc = sqlite3_open("test.db", &db); if (rc) { std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl; return(0); } else { std::cout << "数据库打开成功" << std::endl; } sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );"; rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if (rc != SQLITE_OK) { std::cerr << "SQL 错误: " << zErrMsg << std::endl; sqlite3_free(zErrMsg); } else { std::cout << "数据插入成功" << std::endl; } sqlite3_close(db); return 0; } ``` ### 通过网络通信写入数据 如果应用程序支持网络通信,可以通过网络协议(如HTTP、TCP等)将数据发送到应用程序。以HTTP POST请求为例,在应用程序中需要有相应的服务器端代码来接收数据。 ### 通过内存操作写入数据 在应用程序内部,可以直接操作内存来写入数据。例如,在应用程序中定义一个全局变量或者类的成员变量,然后在代码中对其进行赋值操作。 ```cpp #include <iostream> // 定义一个全局变量 int globalData; int main() { globalData = 10; std::cout << "写入的数据: " << globalData << std::endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值