![]() |
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:
der Hintergrund bei der Message WM_PRINT (791) gezeichnet wird.
procedure TSysPopupStyleHook.WMPRINT(var Message: TMessage);
|
AW: Menu Ownerdraw
Danke werde es mir anschauen..
gruss |
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:
Hmmm schwierig..
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; PS: Werde es wohl erst mal verwerfen komme nicht an das Handle. gruss |
AW: Menu Ownerdraw
mach doch mal ein FindWindowEx auf den Klassennamen '#32768'.
|
AW: Menu Ownerdraw
Zitat:
Danke. Werde es so lassen wie es ist. Kann man nichts machen ohne das ich jetzt fremden Quelltext verwende. gruss |
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. |
AW: Menu Ownerdraw
Zitat:
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:
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 |
AW: Menu Ownerdraw
Zitat:
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? ![]() |
AW: Menu Ownerdraw
Zitat:
Nun zeige mir bitte die Classe #32768 Warum soll ich dir irgendwas erzählen was nicht stimmt! Bringt mich in keinem Fall weiter. gruss |
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:
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
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); welches handle nun gültig ist. Dementsprechend wird jetzt auch 2 mal die Subclass
Delphi-Quellcode:
aufgerufen.
ToolBarMenuSubClass(CBTMenuHandle);
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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