Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi PopUpMenu OwnerDraw feuert zu spät... :) (https://www.delphipraxis.net/59745-popupmenu-ownerdraw-feuert-zu-spaet.html)

NeoXan 28. Dez 2005 01:01


PopUpMenu OwnerDraw feuert zu spät... :)
 
Also ich habe unter anderem folgenden Code in meiner OwnerDraw Procedure
Delphi-Quellcode:
  // Draw menu border
  mWnd := WindowFromDC(ACanvas.Handle);

  if mWnd <> Self.Handle then begin
    cTemp := TCanvas.Create();
    cTemp.Handle := GetDC(0);

    Windows.GetWindowRect(mWnd, rMenu);

    cTemp.Brush.Color := $00DF967A;
    cTemp.FrameRect(rMenu);

    InflateRect(rMenu, -1, -1);
    cTemp.Brush.Color := $00FFFFFF;
    cTemp.FrameRect(rMenu);

    InflateRect(rMenu, -1, -1);
    cTemp.FrameRect(rMenu);

    ReleaseDC(0, cTemp.Handle);
    cTemp.Free();
  end;
Das Problem ist nur, dass mein PopUpMenu erst umrandet wird, wenn ich über einen Eintrag fahre. Nicht aber wenn es aufgeht :/

EDIT:
ach ja, wenn ich z.B. jetzt eine ShowMessage einfüge, und die Box mit enter bestätige, dann klappt es?!
Delphi-Quellcode:
procedure TfrmMain.btnMenuMouseEnter(Sender: TObject);
  x := (Sender as TButton).Left + frmMain.Left;
  y := (Sender as TButton).Top + frmMain.Top + (Sender as TButton).Height;
  ShowMessage('H');
  pop.Popup( x , y );

jim_raynor 30. Dez 2005 06:40

Re: PopUpMenu OwnerDraw feuert zu spät... :)
 
Mmh. Du bekommst doch in OwnerDraw ein Canvas mit, bzw. kannst du dir direkt vom Menü holen.

Merkwürdig finde ich aber auf jeden Fall:

Delphi-Quellcode:
cTemp.Handle := GetDC(0);
Du zeichnest ja dann irgendwie direkt auf den Desktop, was sicherlich nicht so gut ist. Du musst dir doch vermutlich den DeviceContext des Menüs holen ...

NeoXan 30. Dez 2005 09:31

Re: PopUpMenu OwnerDraw feuert zu spät... :)
 
Liste der Anhänge anzeigen (Anzahl: 2)
hmmm, das Problem mit Canvas war, dass die Zeichenfläche nicht das Menu war, sondern immer ein Rand geblieben ist.

Menu1.jpg
---------------------------------------
Hier ist ACanvas die Weiße Fläche und der graue Rand stört. Habe leider kein "none" gefunden...nur Dinge wie
Delphi-Quellcode:
DrawEdge( ACanvas.Handle, ARect, BDR_SUNKEN,BF_FLAT or BF_LEFT or BF_RIGHT );
etc.
Aus diesem Grund habe ich versucht, das irgendwie zu umgehen (anscheinen nicht sehr elegant)


Menu2.jpg
---------------------------------------
So schaut es aus, wenn ich mit der Maus drüber fahre...also cTemp darübergelegt. Leider wird cTemp erst darübergelegt, wenn ich mit der Maus über ein Item fahre bzw. wie oben erwähnt, z.B. ein ShowMessage aufrufe...

NeoXan 4. Jan 2006 00:48

Re: PopUpMenu OwnerDraw feuert zu spät... :)
 
Hat denn niemand eine Idee? Ich bin leider immernoch nicht weiter... :/
Ich brauche ein Flat PopUpMenu...

Hab sogar schon die TListBox missbraucht, da war 'nur' das Problem das beim MouseOver neben meiner Markierung auch eine (anscheinend) Standard-Windows-Umrahmung gezogen wurde (kleinen Punkte um das Item). Gibt es da eine Möglichkeit das ausszuschalten?

Wenn gar nichts mehr geht habe ich mir überlegt eine eigene Komponente zu schreiben, dann dürfte es ja kein Problem sein mit Canvas z.B. eine einzelne Umrahmung vorzunehmen.

Vielen Dank
Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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