为什么我的Delphi 2006应用程序的任务栏按钮上下文菜单不完整?

时间:2012-04-14 06:49:27

标签: delphi vcl taskbar

当我在Delphi 2006中创建一个新的VCL应用程序并运行它时(不添加任何我自己的代码或引用我自己的任何单元),应用程序将不会在上下文菜单中拥有所有菜单项它的任务栏按钮。然而,应用程序的系统菜单(左键单击表单图标时获得的菜单)具有所有常规菜单项。正如您在以下屏幕截图中看到的那样,MoveVerschieben),SizeGröße ändern)和MaximizeMaximieren)从前者

enter image description here enter image description here

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

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

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

2 个答案:

答案 0 :(得分:6)

区别在于Application.MainFormOnTaskBar,这是D2007中引入的属性,自动设置为True。

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

<强> Project.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设计时间时才有效。

答案 1 :(得分:1)

在D2006中,任务栏按钮归TApplication窗口所有。单击任务栏按钮将显示TApplication系统菜单,该菜单由VCL更改以始终删除“最大化”,“大小”和“移动”菜单项。另一方面,当单击TForm时,将显示表单的系统菜单,VCL会根据表单的BorderStyleBorderIcon属性更改该菜单。所以你真的在为两个独立的窗口处理两个单独的菜单。

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