Delphi为窗体的系统菜单中添加选项

通常在应用程序中,如果单击标题栏的左侧图标,就会弹出一个窗体的系统菜单,在其中可以完成最小化、最大化和关闭等操作。本实例将演示如何在窗体的系统菜单中添加自己的选项。

在窗体中添加一个TMainMenu组件,其中TMainMenu组件中的选项将要被添加到窗体的系统菜单中。添加组件后的窗体如图1所示。


图1 添加组件后的窗体

在TMainMenu组件生成的菜单中添加一个File菜单,在这个菜单下面添加一个Exit选项。

在本程序开始运行时就会把TMainMenu组件生成的菜单添加到窗体的系统菜单中,响应代码如下:

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  AppendMenu (GetSystemMenu (Handle, FALSE), MF_SEPARATOR, 0, '');
  with MainMenu1 do
  begin
   for I := 0 to Items.Count - 1 do
    AppendMenu(GetSystemMenu(self.Handle,FALSE),mf_Popup,
    Items[I].Handle,PAnsiChar(Items[I].Caption));
  end;
end;

程序首先通过GetSystemMenu (Handle, FALSE)来取得窗体的系统菜单,并且调用AppendMenu函数添加一个MF_SEPARATOR类型的选项,也就是菜单分隔条。然后通过一个循环,调用AppendMenu函数把TMainMenu组件生成的菜单逐个添加到窗体的系统菜单中。

现在,虽然选项已经添加到窗体的系统菜单中,但是选项还不能够响应用户的操作。为了能够正常响应用户的操作,需要拦截WM_SysCommand消息,所以要添加拦截消息的过程——procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SysCommand,它的响应代码如下:

procedure TForm1.WMSysCommand (var Msg: TWMSysCommand);
var
  Item: TMenuItem;
begin
  Item := MainMenu1.FindItem(Msg.CmdType, fkCommand);
  if Item <> nil then
   Item.Click;
   inherited;
end;

这样,新添加的选项就可以正常工作了。

单击窗体系统菜单File中的Exit选项,就会结束程序的运行。

程序代码如下:

unit Unit1;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls;
type
  TForm1 = class(TForm)
  MainMenu1: TMainMenu;
  File1: TMenuItem;
  Exit1: TMenuItem;
  procedure Exit1Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
private
  { Private declarations }
public
  procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SysCommand;
end;
var
  Form1: TForm1;
  implementation
  {$R *.DFM}
procedure TForm1.WMSysCommand (var Msg: TWMSysCommand);
var
  Item: TMenuItem;
begin
  Item := MainMenu1.FindItem (Msg.CmdType, fkCommand);
  if Item <> nil then
   Item.Click;
   inherited;
  end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  AppendMenu (GetSystemMenu (Handle, FALSE), MF_SEPARATOR, 0, '');
  with MainMenu1 do
  begin
   for I := 0 to Items.Count - 1 do
    AppendMenu(GetSystemMenu(self.Handle,FALSE),mf_Popup,
    Items[I].Handle,PAnsiChar(Items[I].Caption));
   end;
  end;
end.

保存文件,然后按F9键运行程序,程序运行结果如图2所示。


图2 程序运行结果

本实例演示的是如何向窗体的系统菜单中添加选项。取得系统选项的句柄后,不但可以添加选项,还可以修改选项,这样读者就可以在自己编写的程序中更加充分地控制窗体的系统菜单。

时间: 2024-12-31 02:34:52

Delphi为窗体的系统菜单中添加选项的相关文章

VC 向windows系统菜单中添加菜单项---Windows shell扩展编程

vs2008的方法和vc6.0做法几乎一样.下面是转载一位新浪博客-丢丢的.   打开VC6,新建一个工程,选ATL COM APPWIZARD,工程名写BlogTest.然后OK.如果要用到MFC,那把Support MFC打上勾,然后按完成.     新工程生成完毕后,在Class View里根结点按右键,选New Atl Object...,再选Simple Object,在short name里填上类名(起的类型不要和工程名重了),我填Blog,其他会自动填写完毕,OK     在Blo

在系统菜单里添加菜单项和相应事件

有时候我们经常在程序中实现菜单项的重画,已有好多文章已经加以介绍,在此不再赘述.但是有时我们需要加新菜单项到系统菜单中,并希望给其增加相应的事件.笔者通过运用WindowAPI的AppendMenu函数和C++BUIDER的相关方法.属性,实现了往系统菜单中增加菜单项和事件. 下面介绍具体的实现方法,读者按照以下步骤操作,就可以实现在系统菜单中增加菜单项和事件: 1 首先创建一个新的空工程文件,存盘为project1.cpp和unit1.cpp. 2 使用菜单Tools中的Image Edito

如何在IE右键菜单中添加菜单项

菜单|右键 如果使用过Netants的朋友可能都知道,NetAnts在IE中添加了右键菜单功能,只要在页面的一个链接或者图片上点击右键后在菜单中选择 Down By Netants 就可以调用Netants下载该链接指向的文件.在本文中作者将介绍如何通过VB来实现这样的功能. 要实现在IE右键菜单中添加菜单项的功能,要依次实现以下步骤: 1.在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt项下建立一个新项,项的名

修改注册表在右键菜单中添加清空文件夹命令

  本文介绍用修改注册表的方法在右键菜单中添加清空文件夹命令.很多时候,你可能需要清空文件夹中的内容,但希望继续保留文件夹中原来的结构,如果逐一打开各个文件夹进行文件删除,确实比较麻烦.其实,我们可以在右键菜单中添加相关的命令,以后操作起来就方便多了. 打开注册表编辑器,依次定位到"HKEY_CLASSES_ROOTFoldershell",右击选择"新建→项",新建一个名为"清空文件夹内容"的子项,接下来右击该项,继续新建一个名为"c

编程-怎么在文件菜单中添加&amp;amp;quot;显示Dock&amp;amp;quot;菜单?

问题描述 怎么在文件菜单中添加"显示Dock"菜单? 我把工具箱关掉后怎么让它再显示出来?书上说在Action编辑器中进入""显示Dock""菜单动作的触发信号triggered()的槽函数,再添加代码ui->dockWidget->show();就可以,但我不知道怎么操作? 解决方案 把ui->dockWidget->show();写在你的菜单槽函数中啊.看这个例子http://blog.csdn.net/qiurisu

vbs实现右键菜单中添加CMD HERE_vbs

右键菜单中添加CMD HERE 复制代码 代码如下: Set WshShell=CreateObject("Wscript.Shell")  WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\CLASSES\Folder\shell\cmd here\",""  WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\CLASSES\Folder\shel

如何将XP系统控制面板中的选项直接放进开始

  如何将XP系统控制面板中的选项直接放进开始 1.在桌面的任务栏上单击鼠标右键,从快捷菜单中选择"属性"项,在打开的"任务栏和[开始]菜单属性"对话框中选择"[开始]菜单"选项卡. 2.单击"自定义"按钮,弹出"自定义[开始]菜单"对话框,选择"高级"选项卡,在"[开始]菜单项目"栏中将控制面板设置为"显示为菜单". 3.单击"确定&q

[Android界面] 点击侧滑菜单中的选项怎么不让它显示主activity的界面

问题描述 [Android界面] 点击侧滑菜单中的选项怎么不让它显示主activity的界面 使用侧滑菜单SlidingMenu做菜单 .点击菜单的fragment选项会显示当前fragment界面,但是我做的时候怎么把fragment寄宿的主activity界面的内容也显示出来了.比如主界面有个textview 我点击fragment选项的时候这个textview也会出现在fragment界面上.怎么不让主界面的内容显示在fragment界面上,求解决办法 !!!!,先谢过!

菜鸟求助~~~怎么向comboxEdit(下来框)中添加选项

问题描述 我想向comboxEdit中添加选项默认选择是全部第一条是一天第二条是一个月第三条是一年数值是固定的就这三条该怎么写啊如果数据值是从数据表里面获取的又该怎么写啊求代码~~谢谢各位大神啦~~~ 解决方案 解决方案二:差不多是这个样子,也可以逐个用Items.Add添加,通过SelectedIndex设定缺省选择哪一个:ComboBoxcmb=newComboBox();cmb.Items.AddRange(newstring[]{"一天","一个月",&qu