5

TActionMainMenuBar には、子項目のないルート要素の描画に関するバグがあります。

Delphi XE2 / w7-32bit** の使用

再現方法:
TActionMainMenuBar でメニューを作成し、いくつかのアクションを追加します。

 file  | options | help
 - New
 - Open
 - Save
  -Exit

すべてのアクションに 1 つの空のメソッドを割り当てる

procedure TfrmMain.ActionExecute(Sender: TObject); 
begin 
// 
end;

アプリケーションを実行し、オプションまたはヘルプ要素をクリックしてみてください。
フォームをクリックしますが、メニュー要素はまだ押されたままです!

回避策はありますか?

upd: スクリーンショットを見てください。メニュー要素がダウンしていますが、マウス カーソルがメニューになく、autocheck が false で、checked も false です。
ここに画像の説明を入力
ここにはフォーム上のカラーマップはなく、マネージャー スタイルはプラットフォームのデフォルトです

4

2 に答える 2

1

これが私の回避策です:次
のようなカスタムクラスを作成してください:


type
  TFastThemedButton = class(TThemedMenuButton)
  protected
    procedure DrawBackground(var PaintRect: TRect); override;
end;

...


procedure TFastThemedButton.DrawBackground(var PaintRect: TRect);
const
  MenuStates: array[Boolean {MouseInControl}, Boolean {Selected}] of TThemedMenu =
    ((tmMenuBarItemNormal, tmMenuBarItemPushed), (tmMenuBarItemHot, tmMenuBarItemPushed));
var
  BannerRect: TRect;
  StartCol, EndCol: TColor;
begin
   Canvas.Brush.Color := ActionBar.ColorMap.Color;
   Canvas.Font := ActionBar.Font;
   StyleServices.DrawElement(Canvas.Handle, StyleServices.GetElementDetails(MenuStates[MouseInControl, (State=bsDown)]), PaintRect);
end;

TActionMainMenuBar.OnGetControlClass にこの単純なコードを追加し、バグのある actionclients tag=-100 に設定します。


procedure TfrmActions.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
begin
  if ControlClass.InheritsFrom(TCustomMenuButton) and then
   begin
    if (AnItem.Tag =-100) and (ControlClass = TThemedMenuButton) then
      ControlClass := TFastThemedButton;
   end;
end;

これで、-100 タグが付けられたすべてのルート アイテムが、希望どおりに機能するようになりました

于 2013-02-17T17:53:23.287 に答える
0

メニューのあるすべてのフォームで MainMenu.RecreateControls を使用して MainMenuExitMenuLoop イベントを使用しています。これまでのところ、これによりスタックした選択がメニュー項目から削除されます。

于 2016-09-21T15:47:41.570 に答える