用BCB改窗体系统菜单

两年前的文章,拿出来充充门面。
——————————————————————
用BCB改窗体系统菜单

( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:133 )

关键字:BCB,系统菜单,消息映射表
  我们在用一些软件时会发现,这些软件的系统菜单并不是标准的,可能少几项,可能多几项,也可能默认的系统菜单已经变得面目全非。  图1是一个标准的系统菜单。图2是经过修改的系统菜单。下面我就用这个例子给大家简单介绍一下系统菜单的修改方法。
图1 图2

新建一个工程(New Application)。将主窗体命名为“frm_main”。在Tfrm_main::FormCreate()函数中添加以下代码:

void __fastcall Tfrm_main::FormCreate(TObject *Sender)
{
  HMENU system_menu = GetSystemMenu(Handle, false); //取得窗体系统菜单的句柄
  DeleteMenu(system_menu, 4, MF_BYPOSITION);//删掉系统菜单的第一项
  AppendMenu(system_menu, MF_STRING, ID_About_Menu, "关于(&A)");//添加一个“关于”菜单项
  ModifyMenu(system_menu, 0, MF_STRING, ID_NULL_Menu, "NULL");//修改菜单项,将分隔符号改为“NULL”
}

以上用到了GetSystemMenu()、DeleteMenu()、AppendMenu()、ModifyMenu()这四个API函数,具体用法请查阅MSDN或win32sdk.hlp帮助文件(BCB安装盘中有)。
好了,现在让我们运行一下看看。按F9运行程序,呼出系统菜单。正如我们所预期的那样,系统菜单已经修改成功。这样就完了么?你点击我们新添加的菜单项试试,什么也没有发生。这是因为我们没有对单击该菜单项这个消息进行处理。幸好功能强大的BCB给我们留了一个后门,允许我们拦截windows消息。
下面继续我们的手术。在主窗体头文件frmmain.h中Tfrm_main类定义的末尾加入消息映射表:

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, sysmenuOnClick)
END_MESSAGE_MAP(TForm)

其中WM_SYSCOMMAND就是我们要拦截处理的消息。当我们拦截到WM_SYSCOMMAND消息时就交由sysmenuOnClick()函数处理。

在Tfrm_main类定义中添加

private:
  void __fastcall sysmenuOnClick(TMessage &Message);

在主窗体文件frmmain.cpp中添加消息处理函数的内容,比如这里我们让点击菜单项后弹出“关于”对话框:

void __fastcall Tfrm_main::sysmenuOnClick(TMessage &Message)
{
//这里判断WM_SYSCOMMAND消息是点击哪个菜单项发出的
  switch(Message.WParam){
    case ID_About_Menu:
      Application->MessageBoxA("作者:mikespook 2002.5.24", "关于", MB_OK);
      break;
    case ID_NULL_Menu:
      Application->MessageBoxA("你点击了名为“NULL”的菜单", "注意", MB_OK);
      break;
    default:
      break;
  }
// 下面这句是让消息继续传递下去。没有这句的话,消息将被完全拦截,而造成程序出错。
  TForm::Dispatch(&Message);
}

好了,现在大家再运行程序试试。是不是一切OK了?相信你已经对修改系统菜单有了一个大概的了解。那么就充分发挥你的想象力,充分利用系统菜单吧。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在BCB6(即Borland C++ Builder 6)中,可以使用TDateTime类型的Now函数来修系统时间。TDateTime是一个表示日期和时间的类,它可以用于获取当前日期和时间以及进行日期和时间的计算和比较。 要修系统时间,可以按照以下步骤进行操作: 1. 首先,在代码中包含日期和时间的头文件 #include <DateUtils.h>。 2. 使用Now函数获取当前的日期和时间,将其赋值给TDateTime类型的变量。 例如,可以这样声明一个TDateTime类型的变量,并使用Now函数将当前日期和时间赋值给它: TDateTime currentTime = Now(); 3. 接下来,可以使用TDateTime提供的各种函数和操作来修系统时间。 例如,可以使用TDateTime的AddSeconds函数向当前时间添加指定的秒数。具体代码如下: currentTime = currentTime.AddSeconds(10); 这将把系统时间向后推迟10秒。 4. 最后,可以使用系统API函数来将修后的时间应用到系统中。调用Windows API函数SetSystemTime来设置新的系统时间。 具体代码如下: SYSTEMTIME newTime; DateTimeToSystemTime(currentTime, &newTime); SetSystemTime(&newTime); DateTimeToSystemTime是一个用于将TDateTime对象转换为SYSTEMTIME结构的函数,它将当前时间转换为系统时间的格式。 SetSystemTime函数则使用新的系统时间来设置系统时间。 需要注意的是,修系统时间可能需要管理员权限,因此在使用这些函数之前,请确保以管理员身份运行程序。此外,在修系统时间之前,也需要谨慎地检查和验证所进行的操作,以确保安全性和正确性。 ### 回答2: 在BCB6中,要修系统时间可以使用SetSystemTime函数。 SetSystemTime函数是Windows API中的一个函数,用于设置系统的日期和时间。它接受一个SYSTEMTIME结构体参数,该结构体包含了要设置的日期和时间信息。 具体的函数声明如下: BOOL SetSystemTime(const SYSTEMTIME *lpSystemTime); 在调用这个函数时,需要传入一个SYSTEMTIME结构体的指针作为参数。这个结构体中包含了年、月、日、时、分、秒等时间信息。 下面是一个示例代码,演示了如何使用SetSystemTime函数来修系统时间: ```c++ #include <windows.h> int main() { SYSTEMTIME st; // 获取当前系统时间 GetSystemTime(&st); // 修时间 st.wYear = 2022; st.wMonth = 12; st.wDay = 31; st.wHour = 23; st.wMinute = 59; st.wSecond = 59; // 调用函数设置系统时间 SetSystemTime(&st); return 0; } ``` 以上代码将系统的日期和时间修为2022年12月31日23时59分59秒。 需要注意的是,修系统时间可能需要管理员权限。因此,在使用SetSystemTime函数时,需要确保以管理员身份运行程序,或者在程序中调用时获取管理员权限。 ### 回答3: 在BCB6中,可以使用ctime函数来修系统时间。 ctime函数的功能是将time_t结构体的时间值转换为字符串表示的时间值。它的原型定义如下: ```c char *ctime(const time_t *timer); ``` 在使用ctime函数修系统时间时,需要先通过time函数获取当前的系统时间,然后将time_t类型的时间值转换为字符串时间值,然后对该字符串进行修,最后通过其他函数将修后的字符串时间值再转换为time_t类型的时间值,从而实现对系统时间的修。 具体操作步骤如下: ```c #include <time.h> int main() { // 获取当前的系统时间 time_t currentTime = time(NULL); // 将time_t类型的时间值转换为字符串时间值 char *strTime = ctime(&currentTime); // 对字符串时间值进行修 // ... // 将修后的字符串时间值转换为time_t类型的时间值 time_t modifiedTime = mktime(strTime); // 修系统时间 // ... return 0; } ``` 需要注意的是,在对字符串时间值进行修时,可以通过字符串处理函数来实现,如strcpy、strcat等。修系统时间的具体步骤可以使用系统相关的函数来完成,如在Windows系统中可以使用SetSystemTime函数来实现。 综上所述,在BCB6中修系统时间可以使用ctime函数来进行操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值