コンボボックスでクリックをキャッチするには?


涙のリクエスト  2006-06-15 18:57:36  No: 22196

こんにちは!
環境は、Delphi7,WindowsXPです
フォームに、コンボボックスとポップアップメニューを貼り付けて
コンボボックスのドロップダウンリストを表示した状態で
右クリックによりポップアップメニューを表示したいのですがうまく
いきません。
どうすればよいのでしょうか?


Basser  2006-06-16 22:42:52  No: 22197

完全な回答ではありませんがレスがつかないようなので、

COMBOLBOXをサブクラス化することで、クリックまではキャッチできます。
しかい ポップアップ を表示するとリストがロールアップしてしまうので、
そこから先が解りません。

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FComboDefaultProc: TWndMethod;
    hLBox            : HWND;
    FLBoxDefaultProc : FARPROC;
    FLBoxProc        : FARPROC;
    procedure ComboProc(var Message: TMessage);
    procedure ComboLBoxProc(var Message: TMessage);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FComboDefaultProc   := ComboBox1.WindowProc;
  ComboBox1.WindowProc:= ComboProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if (hLBox <> 0) then
  begin
    if Assigned(FLBoxDefaultProc) then SetWindowLong(hLBox, GWL_WNDPROC, Longint(FLBoxDefaultProc));
    if Assigned(FLBoxProc)        then FreeObjectInstance(FLBoxProc);
  end;

  ComboBox1.WindowProc:= FComboDefaultProc;
end;

procedure TForm1.ComboProc(var Message: TMessage);
begin
  // COMBOLBOX をサブクラス化
  if (Message.Msg = WM_CTLCOLORLISTBOX) and (hLBox = 0) then
  begin
    hLBox           := Message.LParam;
    FLBoxProc       := MakeObjectInstance(ComboLBoxProc);
    FLBoxDefaultProc:= FarProc(SetWindowLong(hLBox, GWL_WNDPROC, Longint(FLBoxProc));
  end;

  FComboDefaultProc(Message);
end;

procedure TForm1.ComboLBoxProc(var Message: TMessage);
begin
  with Message do
  begin
    case Msg of
      WM_CONTEXTMENU: { 目的の処理 };
      WM_RBUTTONDOWN: { 目的の処理 };
      WM_RBUTTONUP  : { 目的の処理 };
    end;

    Result:= CallWindowProc(FLBoxDefaultProc, hLBox, Msg, WParam, LParam);
  end;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加