用BCB改窗体系统菜单

原创 2004年06月25日 14:01:00

两年前的文章,拿出来充充门面。

——————————————————————

用BCB改窗体系统菜单

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

关键字:BCB,系统菜单,消息映射表
  我们在用一些软件时会发现,这些软件的系统菜单并不是标准的,可能少几项,可能多几项,也可能默认的系统菜单已经变得面目全非。  图1是一个标准的系统菜单。图2是经过修改的系统菜单。下面我就用这个例子给大家简单介绍一下系统菜单的修改方法。
图1 图2
2002-12-8change.gif2002-12-8nochange.gif
新建一个工程(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了?相信你已经对修改系统菜单有了一个大概的了解。那么就充分发挥你的想象力,充分利用系统菜单吧。

BCB窗体显示问题

开三个窗体form1 showmodal form2,form2 showmodal form3,结果有时候 form3 隐藏在 form2 后面,在XP出现次数较多。在如下情况下XP里常出现:(fo...
  • yangshunjun
  • yangshunjun
  • 2005年04月19日 15:51
  • 737

C#模拟窗体系统菜单

 using System.Runtime.InteropServices;const uint TPM_LEFTBUTTON = 0;const uint TPM_RIGHTBUTTON = 2;c...
  • zswang
  • zswang
  • 2007年03月14日 22:14
  • 1372

BCB窗体移动

窗体上放置一Image,响应MouseDown事件。void __fastcall TForm1::Image1MouseDown(TObject *Sender,       TMouseButto...
  • i_like_cpp
  • i_like_cpp
  • 2005年03月16日 07:58
  • 1207

BCB如何获得当前所有可视窗口的窗口标题和窗口句柄

 BOOL CALLBACK EnumWindowsProc(    HWND hwnd,      // handle to parent window    LPARAM lParam   // ...
  • jacknes009
  • jacknes009
  • 2007年07月18日 15:45
  • 840

BCB动态创建窗口的释放

1. ShowModal方法 TForm1   *Form=new   TForm1(Application);     Form->ShowModal();     delete   Form;  ...
  • JacksonLiang
  • JacksonLiang
  • 2006年07月11日 10:20
  • 2349

BCB 设置窗体标题栏的关闭按钮不可用

BCB 设置窗体标题栏的关闭按钮不可用 把窗口右上角上的关闭按钮X变成不可用(变灰色)。 具体方法是在窗口的oncreate事件下写: HWND m_hWnd=GetSystemM...
  • cddchina
  • cddchina
  • 2015年05月24日 17:08
  • 1471

BCB6.0 父窗体最小化时子窗体关闭不了

重载TForm的CreateParams函数即可 void __fastcall TForm2::FormCreate(TObject *Sender) {        void *Handle =...
  • dafan
  • dafan
  • 2010年07月29日 13:43
  • 1412

BCB Form 固定大小,不让拖大设置

更改BorderStyle属性,改成bsSingle或bsDialog都可以. 修订为bsSingle,可以有icon图标,而bsDialog没有...
  • bruce_wang_janet
  • bruce_wang_janet
  • 2012年07月29日 20:19
  • 2213

在bcb里实现像Winamp那样具有吸附效果的磁性窗口

       相信大家都用过Winamp,一定会对她那种具有吸附效果的窗口感到很惊喜吧。其实要实现这样的效果并不难,下面我就用bcb做出这样的效果。为了将问题简化,窗口只在屏幕顶端产生吸附效果。   ...
  • hhdsq
  • hhdsq
  • 2002年11月15日 14:57
  • 816

BCB中登陆窗口的实现

方法一:jiang
  • xshy1986
  • xshy1986
  • 2014年07月21日 21:28
  • 124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用BCB改窗体系统菜单
举报原因:
原因补充:

(最多只允许输入30个字)