AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Onclick und rechte Maustaste!

Ein Thema von TriphunEM · begonnen am 29. Dez 2005 · letzter Beitrag vom 4. Feb 2006
 
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

Re: Onclick und rechte Maustaste!

  Alt 4. Feb 2006, 17:12
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:
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.
// Edit: kleine Korrekturen
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 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