![]() |
Re: Onclick und rechte Maustaste!
also wenn ich das auf ein item legen will, muss ich doch dann noch extra ne klasse ableiten.
aber von welcher, den TMenuItem gibts ja nicht zum ableiten???? |
Re: Onclick und rechte Maustaste!
Zitat:
Jedenfalls solltest du kein Problem damit haben TMenuItem abzuleiten. Gruß Der Unwissende |
Re: Onclick und rechte Maustaste!
mmhh und wie dann, so lässt es sich zwar kompilieren, aber die eregnisse seh ich aber ne:
Delphi-Quellcode:
???
unit AdvMainMenu;
interface uses Windows, Menus, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TAdvMainMenu = class(TMainMenu) private { Private-Deklarationen } FOnLMBClicked: TNotifyEvent; FOnRMBClicked: TNotifyEvent; procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; protected { Protected-Deklarationen } procedure DoLeftMouseButtonDown(var Msg : TMouseInput); dynamic; procedure DoRightMouseButtonDown(var Msg : TMouseInput); dynamic; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property OnLMBClick: TNotifyEvent read FOnLMBClicked write FOnLMBClicked; property OnRMBClick: TNotifyEvent read FOnRMBClicked write FOnRMBClicked; end; TAdvMenuItem = class(TMenuItem) private { Private-Deklarationen } FOnLMBClicked: TNotifyEvent; FOnRMBClicked: TNotifyEvent; procedure LeftMouseButtonDown(var Msg : TMouseInput); message WM_LBUTTONDOWN; procedure RightMouseButtonDown(var Msg : TMouseInput); message WM_RBUTTONDOWN; protected { Protected-Deklarationen } procedure DoLeftMouseButtonDown(var Msg : TMouseInput); dynamic; procedure DoRightMouseButtonDown(var Msg : TMouseInput); dynamic; public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published-Deklarationen } property OnLMBClick: TNotifyEvent read FOnLMBClicked write FOnLMBClicked; property OnRMBClick: TNotifyEvent read FOnRMBClicked write FOnRMBClicked; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TAdvMainMenu]); end; constructor TAdvMainMenu.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TAdvMainMenu.Destroy; begin inherited Destroy; end; procedure TAdvMainMenu.DoLeftMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnLMBClicked) then FOnLMBClicked(Self); end; procedure TAdvMainMenu.DoRightMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnRMBClicked) then FOnRMBClicked(Self); end; procedure TAdvMainMenu.LeftMouseButtonDown(var Msg: TMouseInput); begin DoLeftMouseButtonDown(Msg); end; procedure TAdvMainMenu.RightMouseButtonDown(var Msg: TMouseInput); begin DoRightMouseButtonDown(Msg); end; constructor TAdvMenuItem.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TAdvMenuItem.Destroy; begin inherited Destroy; end; procedure TAdvMenuItem.DoLeftMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnLMBClicked) then FOnLMBClicked(Self); end; procedure TAdvMenuItem.DoRightMouseButtonDown(var Msg: TMouseInput); begin If Assigned(FOnRMBClicked) then FOnRMBClicked(Self); end; procedure TAdvMenuItem.LeftMouseButtonDown(var Msg: TMouseInput); begin DoLeftMouseButtonDown(Msg); end; procedure TAdvMenuItem.RightMouseButtonDown(var Msg: TMouseInput); begin DoRightMouseButtonDown(Msg); end; end. |
Re: Onclick und rechte Maustaste!
wie muss das nun aussehen, wenn ich die ereignisse zusätzlich den items bereitstellen will????
|
Re: Onclick und rechte Maustaste!
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Frank,
Zitat:
Grüße vom marabu |
Re: Onclick und rechte Maustaste!
@marabu
hi. danke dir für die mühe, aber das problem mit der Mainmenü habe ich selber schon gelöst. Allerdings brauch ich sowas in der Art wie eine Toolbar. Wenn ich das Mainmenü in eine Standard-Toolbar packe funktioniert dein Code sowie auch mein Code nicht mehr. Also hab ich mich von der Mainmenü-Toolbar-Variante abgetan und versuche mich an der Toolbar2000. Wenn Du dafür eine Lösung hättest, wärst Du mein Gott!? Ich ärgere mich jetzt schon über einen Monat damit rum. MfG & big thx Frank |
Re: Onclick und rechte Maustaste!
Du hast ja inzwischen schon so einige Hebel in Bewegung gesetzt (z.B.
![]() Zu deiner PN: ich hatte gestern wirklich etwas Zeit und bin so weit gekommen, dass ich die WM_RBUTTONDOWN-Meldung auf dem Popup-Fenster abfangen kann, allerdings fehlt noch die Lokalisierung des betreffenden TTBItem mit Hilfe der Koordinaten. Bis jetzt:
Delphi-Quellcode:
An der Stelle mit ... fehlen halt noch einige Überprüfungen.
var
HookHandle: THandle; function HookRightButton(nCode: Integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; var Wnd: TWinControl; Pnt: TPoint; begin if nCode = HC_ACTION then begin with PMsg(lp)^ do if message = WM_RBUTTONDOWN then begin Wnd := Controls.FindControl(hWnd); if Wnd is TTBToolbar then begin Pnt := SmallPointToPoint(TSmallPoint(lParam)); // ... end; end; end; Result := CallNextHookEx(HookHandle, nCode, wp, lp); end; procedure TForm1.FormCreate(Sender: TObject); begin HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookRightButton, 0, GetCurrentThreadId); end; Wichtig: du solltest an der gehookten Stellen nicht selbst etwas tun, sondern dir einfach per PostMessage eine selbstdefinierte Meldung an das Hauptfenster schicken und dort dann ggf. eine Aktion vornehmen. |
Re: Onclick und rechte Maustaste!
Hallo Frank,
Zitat:
Zitat:
Freundliche Grüße vom marabu |
Re: Onclick und rechte Maustaste!
@Flocke :
danke. aber bei mir funzt das irgendwie nicht. bekomme folgenden Fehlermeldung : Zitat:
Delphi-Quellcode:
und
HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookRightButton, 0, GetCurrentThreadId);
Zitat:
Delphi-Quellcode:
thxwith PMsg(lp)^ do if message = WM_RBUTTONDOWN then begin Wnd := Controls.FindControl(hWnd); if Wnd is TTBToolbar then begin |
Re: Onclick und rechte Maustaste!
So, hier eine `richtige´ Lösung für Toolbar2000. Damit erhältst du in der Routine WMMyPopup sowohl den Toolbar-Eintrag unter der Maus als auch die Mauskoordinaten für's Popup-Menü.
Delphi-Quellcode:
// Edit: kleine Korrekturen
const
WM_MYPOPUP = WM_USER + 123; // Beliebig type TForm1 = class(TForm) // ... alle anderen Controls, u.a. PopupMenu1: TPopupMenu; Label2: TLabel; Label3: TLabel; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure WMMyPopup(var Msg: TMessage); message WM_MYPOPUP; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var HookHandle: THandle; function HookRightButton(nCode: Integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; var Wnd: TWinControl; Frm: TWinControl; View: TTBView; Item: TTBItemViewer; Pnt: TPoint; begin if nCode = HC_ACTION then begin with PMsg(lp)^ do if message = WM_RBUTTONDOWN then begin Wnd := FindControl(hWnd); if Wnd is TTBToolbar then begin Pnt := SmallPointToPoint(TSmallPoint(lParam)); ClientToScreen(hWnd, Pnt); Frm := Wnd.Parent; while (Frm <> nil) and not (Frm is TCustomForm) do Frm := Frm.Parent; if Frm = nil then Frm := Application.MainForm; View := TTBToolbar(Wnd).View; while View <> nil do begin Item := View.ViewerFromPoint(View.Window.ScreenToClient(Pnt)); if Assigned(Item) then begin PostMessage(Frm.Handle, WM_MYPOPUP, UINT(Item.Item), UINT(PointToSmallPoint(Pnt))); break; end; if Assigned(View.OpenViewerView) and (View <> View.OpenViewerView) then View := View.OpenViewerView else if Assigned(View.Selected.View) and (View <> View.Selected.View) then View := View.Selected.View else View := nil; end; end; end; end; Result := CallNextHookEx(HookHandle, nCode, wp, lp); end; procedure TForm1.WMMyPopup(var Msg: TMessage); var Item: TTBCustomItem; Pnt: TPoint; begin Item := TTBCustomItem(Msg.WParam); Pnt := SmallPointToPoint(TSmallPoint(Msg.LParam)); Label2.Caption := Item.Caption; Label3.Caption := Format('%d,%d', [Pnt.X, Pnt.Y]); PopupMenu1.Popup(Pnt.X, Pnt.Y); end; procedure TForm1.FormCreate(Sender: TObject); begin HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @HookRightButton, 0, GetCurrentThreadId); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz