4

管理者がアプリケーションのメイン メニューのメニュー項目を Ctrl キーを押しながらクリックして有効/無効にできるようにしようとしています。そのために、メイン フォームの TMenuItem クラスにカスタム バージョンを挿入し、次のように Click 仮想メソッドをオーバーライドしました。

uses
  Forms, Menus;

type
  TMenuItem = class(Menus.TMenuItem)
  public
    ControlActivationState: Boolean;
    procedure Click; override;
  end;

  TMyMainForm = class(TForm)

...

procedure TMenuItem.Click;
begin
  if ControlActivationState and IsKeyPressed(VK_CONTROL) then
    Self.Enabled := not Self.Enabled
  else
    inherited;
end;

それは機能しますが、トップレベルのメニューに対してのみです。最上位のメニュー項目が無効になっていても OnClick イベントを受け取り、他のメニュー項目は受け取らないのはなぜですか? 子メニュー項目もそれらのイベントを受け取るようにする方法はありますか?

4

3 に答える 3

4

最上位OnClickイベントは、WM_INITMENUPOPUPメッセージの受信によってトリガーされます。そのメッセージは、最上位の項目が無効になっている場合でも送信されます。なぜそのシナリオで送信されるのかはわかりませんが、そうです。子を持つサブアイテムについても同じことが言えます。

ただし、子のないサブアイテムの場合、OnClickはメッセージによってトリガーされWM_COMMANDます。ただし、メニュー項目が無効になっている場合、システムはメッセージを送信しません。

あなたがやろうとしていることは、すぐにはできません。あなたがやっているのを見ることができる唯一の方法は、生のマウスとキーボードのイベントを処理することです。個人的には、そうするつもりはありません。

于 2013-08-07T14:01:57.373 に答える