当VCL风格从NC区域取出TMainMenu不显示(TMainMenu is not shown w

2019-09-21 05:00发布

我使用这个代码从一种形式的非客户区删除VCL风格。

type
  TFormStyleHookNC= class(TMouseTrackControlStyleHook)
  protected
    procedure PaintBackground(Canvas: TCanvas); override;
    constructor Create(AControl: TWinControl); override;
  end;

constructor TFormStyleHookNC.Create(AControl: TWinControl);
begin
  inherited;
  OverrideEraseBkgnd := True;
end;

procedure TFormStyleHookNC.PaintBackground(Canvas: TCanvas);
var
  Details: TThemedElementDetails;
  R: TRect;
begin
  if StyleServices.Available then
  begin
    Details.Element := teWindow;
    Details.Part := 0;
    R := Rect(0, 0, Control.ClientWidth, Control.ClientHeight);
    StyleServices.DrawElement(Canvas.Handle, Details, R);
  end;
end;


initialization
 TStyleManager.Engine.RegisterStyleHook(TForm3, TFormStyleHookNC);

之前应用这种风格挂钩的形式看起来像

之后

正如你可以看到菜单消失,现在的问题是:我怎么能解决这个问题? 我的意思是如何从一种形式的非客户区删除VCL风格,而不删除TMainMenu?

Answer 1:

当您使用VCL的款式,TMain菜单由绘制TMainMenuBarStyleHook VCL风格挂钩,这是内部规定TFormStyleHook因为你不使用这个钩子(的形式挂钩),在这种情况下,没有代码绘制该TMainMenu。

两种可能的解决方案

1)实现对TMainMenu的VCL风格钩TFormStyleHookNC里面,就像TFormStyleHook一样。

2)或甚至更好地利用一个TA​​ctionMainMenuBar部件代替TMainMenu的,该组件是非常良好的与VCL样式集成(检查下一个样本图像)。



文章来源: TMainMenu is not shown when the vcl styles is removed from the NC Area