こんにちは!
環境は、Delphi7,WindowsXPです
フォームに、コンボボックスとポップアップメニューを貼り付けて
コンボボックスのドロップダウンリストを表示した状態で
右クリックによりポップアップメニューを表示したいのですがうまく
いきません。
どうすればよいのでしょうか?
完全な回答ではありませんがレスがつかないようなので、
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;
ツイート | ![]() |