2

当我在 Delphi 2006 中创建一个新的 VCL 应用程序并运行它(不添加任何我自己的代码或引用我自己的任何单元)时,该应用程序不会在其任务栏的上下文菜单中拥有所有期望的菜单项按钮。但是,应用程序的系统菜单(左键单击表单图标时获得的菜单)具有所有常规菜单项。正如您在以下屏幕截图中所见,前者缺少Move( Verschieben)、Size( Größe ändern) 和Maximize( )Maximieren

在此处输入图像描述 在此处输入图像描述

我无法在 Delphi XE(我可以访问的唯一其他 Delphi 版本)中重现这一点,而且我也没有发现任何其他人报告此行为。

我还查看了这些菜单的属性TForm以及TApplication是否有一个来控制这些菜单,但还没有找到。

我知道的所有应用程序在这两个菜单中都有相同的菜单项集,我也希望我的应用程序也这样做。如何让这两个菜单显示同一组项目?

4

2 回答 2

6

不同之处在于Application.MainFormOnTaskBar,这是 D2007 中引入的一个属性,它自动设置为 True。

为了在早期版本中获得相同的效果,我总是使用以下方法:

项目.dpr:

uses
  Windows,
  ...

  Application.CreateForm(TMainForm, MainForm);
  ShowWindow(Application.Handle, SW_HIDE);
  Application.Run;

FMain.pas:

  TMainForm = class(TForm)
  private
    procedure WMSysCommand(var Message: TWMSysCommand);
      message WM_SYSCOMMAND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  ...

procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    ExStyle := ExStyle or WS_EX_APPWINDOW;
    WndParent := GetDesktopWindow;
  end;
end;

procedure TMainForm.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType = SC_MINIMIZE then
    ShowWindow(Handle, SW_MINIMIZE)
  else
    inherited;
end;

这仅在MainForm.Visible设置True设计时间时有效。

于 2012-04-14T09:36:10.363 回答
1

在 D2006 中,任务栏按钮归TApplication窗口所有。单击任务栏按钮将显示TApplication系统菜单,该菜单由 VCL 更改以始终删除最大化、大小和移动菜单项。TForm另一方面,当单击 a时,会显示 Form 的系统菜单,VCL 根据 Form 的BorderStyleBorderIcon属性对其进行更改。因此,您实际上是在为两个单独的窗口处理两个单独的菜单。

在现代 Delphi 版本中,将新TApplication.ShowMainFormOnTaskbar属性设置为true时,任务栏由TForm而不是拥有TApplication,因此单击任务栏按钮将显示窗体的系统菜单而不是TApplication系统菜单。因此,在这种情况下,您实际上是在处理单个窗口的单个菜单。

于 2012-04-18T22:01:39.033 回答