Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

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

Re: Welche Windows-Events zum Zeichnen eines Buttons

  Alt 10. Dez 2005, 01:15
Zitat von Vjay:
Ich vermute, dass manche (Windowsbehandlungs-)Funktionen den Button direkt über DrawFrameControl neu Zeichnen und das Windows-Messageprinzip umgehen.

Ich habe nämlich genau das gleiche Problem.
Ein Beispiel: Wenn man in einer nicht (Manifest-) XP-Anwendung die Maustaste auf dem Button gedrückt hält, so wird dieser neu gezeichnet, aber ich erhalte nie eine Message darüber.
Genau da liegt das Problem - ein TButton ist eben kein natives Delphi-Control sondern eine von Windows vorgegebene Fensterklasse. Da kann man das Zeichnen nicht erweitern, sondern müsste es komplett neu schreiben.

Ich fand das Thema ganz interessant und habe mal eine von TButton abgeleitete Komponente geschrieben, die BS_OWNERDRAW nutzt. Im Gegensatz zu WM_PAINT kriegt man WM_DRAWITEM/CN_DRAWITEM nämlich jedesmal, wenn der Button bzw. Teile davon neu gezeichnet werden müssen.

Code siehe Anlage (OwnerDrawButton.pas), unterstützt Themes und Hot-Tracking. Ihr könnt den Button entweder komplett selbst zeichnen oder nur den Inhalt (den Rahmen übernimmt dann der Komponente).

Als Beispiel ist im 2. Quelltext (ButtonWithImage.pas) eine abgeleitete Klasse drin, die einen Standard-Button mit Bild zeichnet (über Images/ImageIndex, so dass Actions funktionieren) - soll aber wie gesagt nur als Beispiel dienen, wie man daraus eigene Button-Klassen machen kann.

// EDIT

Hab' beide Dateien noch mal überarbeitet (hatte ja eh' noch niemand heruntergeladen).

Übrigens habe ich gesehen, dass TBitBtn dasselbe Verfahren benutzt (die Quellen sind sogar ziemlich ähnlich), also könnte man auch den Subclassen bzw. als Vorlage benutzen.
Angehängte Dateien
Dateityp: pas buttonwithimage_104.pas (7,2 KB, 45x aufgerufen)
Dateityp: pas ownerdrawbutton_951.pas (13,5 KB, 88x aufgerufen)
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat