Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Menu Ownerdraw (https://www.delphipraxis.net/199974-menu-ownerdraw.html)

TiGü 7. Mär 2019 12:54

AW: Menu Ownerdraw
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei mal ein Minimalbeispiel (ja, das geht in der Tat recht schnell) zum nachdebuggen in einer höheren Delphiversion, die schon VCL Styles unterstützt (z.B. die Delphi Community Editon).

Du kannst ja einfach mal nachvollziehen, wie in
Delphi-Quellcode:
procedure TSysPopupStyleHook.WMPRINT(var Message: TMessage);
der Hintergrund bei der Message WM_PRINT (791) gezeichnet wird.

EWeiss 7. Mär 2019 13:31

AW: Menu Ownerdraw
 
Danke werde es mir anschauen..

gruss

EWeiss 7. Mär 2019 14:06

AW: Menu Ownerdraw
 
Report:
Ist einfach mit seiner Engine aber nicht auf meiner weise..
Ich kann nicht erkennen wo das Event ausgelöst wird.. bei mir sollte es eigentlich WM_LBUTTONDOWN sein.

Aber ich bekomme kein gültiges Handle.
Ich klicke ja auf den Tollbarbutton nur welches Handle ist das bekomme ja nur das von der Toolbar selbst zurück geliefert.
Nicht das des Button den ich klicke noch das vom Menu.

Wenn ich das auf seine weise mache schlägt es fehl.
Delphi-Quellcode:
    WM_LBUTTONDOWN:
      begin
        Style := GetWindowLongPtr(WinHandle, GWL_STYLE);
        if (Style and WS_POPUP = WS_POPUP) then
        begin
          if HToolBarMenu <> 0 then
            ToolBarSubClass(hToolbarMenu);
        end;
      end;
Hmmm schwierig..
PS:
Werde es wohl erst mal verwerfen komme nicht an das Handle.

gruss

TiGü 7. Mär 2019 15:22

AW: Menu Ownerdraw
 
mach doch mal ein FindWindowEx auf den Klassennamen '#32768'.

EWeiss 7. Mär 2019 15:43

AW: Menu Ownerdraw
 
Zitat:

Zitat von TiGü (Beitrag 1427229)
mach doch mal ein FindWindowEx auf den Klassennamen '#32768'.

Habe ich schon versucht.. schlägt fehlt in der ToolBarProc.. WM_LBUTTONDOWN und WM_PRINT

Danke.
Werde es so lassen wie es ist. Kann man nichts machen ohne das ich jetzt fremden Quelltext verwende.

gruss

TiGü 7. Mär 2019 18:44

AW: Menu Ownerdraw
 
Wahrscheinlich ist das Popupfenster nicht sofort da. Warte doch ein paar Millisekunden und suche dann.
Du könntest aber auch den Callstack im Beispiel hoch debuggen und Schritt für Schritt verstehen lernen, wie es da in Verbindung mit der Styleengine von Embarcadero gelöst wird.

EWeiss 7. Mär 2019 19:09

AW: Menu Ownerdraw
 
Zitat:

Zitat von TiGü (Beitrag 1427273)
Du könntest aber auch den Callstack im Beispiel hoch debuggen und Schritt für Schritt verstehen lernen, wie es da in Verbindung mit der Styleengine von Embarcadero gelöst wird.

Danke habe das schon gemacht und verstehe was er macht aber es lässt sich so einfach nicht in mein Projekt integrieren.
Er verwendet dafür den "CBT Hook in Verbindung mit SetWindowsHookEx" habe mich aber damit noch nie beschäftigt müsste mich also da erstmal einlesen.

Nur ob sich der Aufwand lohnt ist fraglich.
Zitat:

Wahrscheinlich ist das Popupfenster nicht sofort da. Warte doch ein paar Millisekunden und suche dann.
Ein warten bringt nichts selbst über EnumClientWindows komme ich nicht ans ziel.
Auch ein "Windows Detective" listet mir das Menu nicht auf wenn es angezeigt wird.
Er erkennt es nicht von daher kann ich auch nicht sagen wodurch es aufgerufen wird auch wenn ich es theoretisch weis (Beim Klick auf den Button halt)

gruss

TiGü 7. Mär 2019 22:25

AW: Menu Ownerdraw
 
Zitat:

Zitat von EWeiss (Beitrag 1427277)
Auch ein "Windows Detective" listet mir das Menu nicht auf wenn es angezeigt wird.
Er erkennt es nicht von daher kann ich auch nicht sagen wodurch es aufgerufen wird auch wenn ich es theoretisch weis

Das ist doch jetzt Quatsch.

Die Informationen aus den ersten Absatz in meiner ersten Antwort habe ich mir ja nicht ausgedacht, sondern direkt aus dem Windows Detective abgelesen.
Kennst du das Tool?

https://www.thewindowsclub.com/window-detective

EWeiss 7. Mär 2019 22:35

AW: Menu Ownerdraw
 
Zitat:

Zitat von TiGü (Beitrag 1427286)
Zitat:

Zitat von EWeiss (Beitrag 1427277)
Auch ein "Windows Detective" listet mir das Menu nicht auf wenn es angezeigt wird.
Er erkennt es nicht von daher kann ich auch nicht sagen wodurch es aufgerufen wird auch wenn ich es theoretisch weis

Das ist doch jetzt Quatsch.

Die Informationen aus den ersten Absatz in meiner ersten Antwort habe ich mir ja nicht ausgedacht, sondern direkt aus dem Windows Detective abgelesen.
Kennst du das Tool?

https://www.thewindowsclub.com/window-detective

Quatsch? Ok anbei ein Screenshot!
Nun zeige mir bitte die Classe #32768

Warum soll ich dir irgendwas erzählen was nicht stimmt! Bringt mich in keinem Fall weiter.

gruss

EWeiss 8. Mär 2019 00:17

AW: Menu Ownerdraw
 
Destotrotz das ich mit "Windows Detective" die Class nicht finde versuche ich es jetzt auf diesen weg.
OK ist im Log zu finden seltsames Konzept..

Delphi-Quellcode:
function CBTHookProc(nCode: Integer; wP: WPARAM; lP: LPARAM): LRESULT; stdcall;
var
  buf: array[0..128] of Char;
  Style: DWORD;
begin
  if nCode < 0 then
  begin
    result := CallNextHookEx(FHook, nCode, wP, lP);
    exit;
  end;

  case nCode of
    HCBT_CREATEWND:
      begin
        CBTSturct := PCBTCreateWnd(lP)^;
        GetClassName(wP, buf, SizeOf(buf));
        if (Integer(CBTSturct.lpcs.lpszClass) = 32768) then
        begin
          CBTMenuHandle := wP;
          Style := GetWindowLongPtr(CBTMenuHandle, GWL_STYLE);
          if (Style and WS_POPUP = WS_POPUP) then
            ToolBarMenuSubClass(CBTMenuHandle);
        end;
        result := 0;
        exit;
      end;

    HCBT_DESTROYWND:
      if FHook <> 0 then
      begin
        UnhookWindowsHookEx(FHook);
        ToolBarMenuUnSubClass(CBTMenuHandle);
      end;
  end;
  result := CallNextHookEx(FHook, nCode, wP, lP);
end;
Delphi-Quellcode:
function ToolBarProc(WinHandle: HWND; Msg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
var
  hDCTemp: HDC;
  rc, rw: TRect;
  ps: TPaintStruct;
  lpt: TPoint;
  DC: HDC;
  hDCBack: HDC;
begin
  Result := 0;

  case Msg of

    WM_LBUTTONDOWN:
      FHook := SetWindowsHookEx(WH_CBT, @CBTHookProc, 0, GetCurrentThreadId);
Das Problem das ich nun aber habe ist das 2 mal die Class "#32768" gefunden wird das verursacht nun richtige Probleme da ich nicht weis
welches handle nun gültig ist.

Dementsprechend wird jetzt auch 2 mal die Subclass
Delphi-Quellcode:
ToolBarMenuSubClass(CBTMenuHandle);
aufgerufen.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz