Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Keine Handles? (https://www.delphipraxis.net/55320-keine-handles.html)

Rastaman 19. Okt 2005 15:13


Keine Handles?
 
Moin!
Also ich würd gern wissen, warum z.B die Buttons etc. bei Winamp keine Handles haben :gruebel:
Ist das so, dass Winamp die Mauskoordinaten abfragt und sich immer komplett neu zeichnet?
Auch innem Browser kommt man nicht an die Handles von Buttons ran (nich dass ich wüsste).
Kann man das auch selber machen? Das wäre in manchen Fällen sehr praktisch, wenn z.B ein Button deaktiviert bleiben soll.
Dann kann jeder schnell ans Handle kommen und ihn aktivieren etc.

Würd ich ma gern gewusst haben :mrgreen:

Neutral General 19. Okt 2005 15:35

Re: Keine Handles?
 
Mh.. du könntest dir vielleicht eine Komponente von TImage oder TGraphicControl ableiten die dann ähnlich wie ein Button funktioniert. Zumindest Images haben kein Handel. Bei TGraphicControl bin ich mir nicht sicher. Dürfte aber normalerweise auch keins haben.. sonst müsste da ja irgendwas nicht mit vererbt worden sein :mrgreen:

Vielleicht hats Winamp auch so (ähnlich) gemacht. ka.

shmia 19. Okt 2005 16:59

Re: Keine Handles?
 
Zitat:

Zitat von Rastaman
Also ich würd gern wissen, warum z.B die Buttons etc. bei Winamp keine Handles haben :gruebel:
Ist das so, dass Winamp die Mauskoordinaten abfragt und sich immer komplett neu zeichnet?

Ohne jetzt WinAmp intern genau zu kennen würde ich sagen:
Da Winamp Skins unterstützt gibt es keine "normalen" Buttons, sondern ein Mausklick in einer
bestimmten Region führt zu einer vordefinierten Aktion (Play, Stop, ..).

SirThornberry 19. Okt 2005 17:11

Re: Keine Handles?
 
du kannst die Buttons von Winamp mit TControls unter Delphi vergleichen, auch diese haben kein Handle und malen sich auf die Canvas des Parents. Wenn du dir mal TSpeedButton anschaust so wirst du sehen das auch dieser kein Handle hat, allerdings sieht er trotzdem wie ein normaler Button aus.

Rastaman 19. Okt 2005 17:16

Re: Keine Handles?
 
Wie ist das denn möglich?
Dachte jedes noch so kleine Fenster hat n Handle?
TLabel hat auch kein Handle, STATIC aber schon. Die können doch nich sagen von Borland "So, Label bekommt kein Handle" und es hat tatsächlich keines?

Neutral General 19. Okt 2005 17:25

Re: Keine Handles?
 
Ich schätze ma das ein Handle für manche Controls halt unnötig wäre... Keine Ahnung warum. Frag doch Borland :mrgreen:

Ich bin aber auch grad am überlegen. Weil Static und Label sind vom Aussehen her ja fast das Gleiche...
mh.. naja das wird schon irgendwie seinen Sinn haben :D

Luckie 19. Okt 2005 17:27

Re: Keine Handles?
 
Alle von TGraphicControl abgeleiteten Controls haben kein Handle, da sie direkt auf den Canvas des Parents gezeichnet werden. Controls, die nativen Windows Controls kapseln oder von TWinControl abstammen haben ein Handle.

Wo ist jetzt dein Problem?

Neutral General 19. Okt 2005 17:28

Re: Keine Handles?
 
Er fragt sich halt warum manche Controls Handles haben und manche nicht. (Frag ich mich eigentlich auch grad). Das es solche Controls gibt weiß er ja jetzt nur die Frage ist halt waruuum... *g*

mirage228 19. Okt 2005 17:30

Re: Keine Handles?
 
Wenn Du ein Label mit Handle haben möchtest, dann nimm doch einfach TStaticText :zwinker:
Dass TLabel kein Handle ist noch ein Überbleibsel aus 16bit Zeiten, wo man noch nicht so viele Ressourcen hatte, um sehr viele WinControls (u.dgl.) darzustellen.

mfG
mirage228

SirThornberry 19. Okt 2005 17:36

Re: Keine Handles?
 
Controls ohne Handle haben den Vorteil das Sie flexibler in Sachen Transparenz sind. Nicht umsonst heißt die Basisklasse für Controls ohne Handle TGraphicControl. Wenn du schonmal versucht hast Transparenz bei Controls mit Handle hinzubekommen wirst du sicher bemerkt haben das es schwer bis unmöglich ist. Und wenn du dann noch mit halbtransparenz arbeiten willst (alpha) dann kannst du gleich aufgeben. Die Windowsfenster unterstützen von Haus aus keine Halbtransparenz (außer das TopLevel Fenster und dann wirds auf die unteren "vererbt"). Wenn man also grafische Contols haben will die halbtransparent sind (so das man den Untergrund durchsehen kann) dann kommt man eigentlich nicht um Controls ohne Handle herum.

Neutral General 19. Okt 2005 17:43

Re: Keine Handles?
 
Finde ich seltsam.. Nur durch eine einzelne Eigenschaft, einen einzigen Zahlenwert, wird ein Control fast un-transparent/alpha-bar (Wort von mir grad erfunden ^^) ?
Ich versteh den Zusammenhang von Handle und Transparenz nicht...

Obwohl hat das vielleicht damit was zu tun, dass Windows die Controls mit Handle dauernd neuzeichnet und die ohne Handle nur bei Bedarf ? Also nur wenn grade z.B

Delphi-Quellcode:
Labelx.Caption := 'blabla';
ausgeführt wird ?

Luckie 19. Okt 2005 17:48

Re: Keine Handles?
 
Das liegt daran, dass Delphi es eben selber zeichnet und eben nicht Windows, wie es bei Windows Controls der Fall ist.

Neutral General 19. Okt 2005 17:50

Re: Keine Handles?
 
ok. Dann lag ich ja faast richtig ;)

SirThornberry 19. Okt 2005 17:55

Re: Keine Handles?
 
@Neutral General: Unter Windows hat jedes Control eignetlich ein Handle. Dadurch ist aber sowas wie Alpha nur schwer zu handeln. Unter Delphi ist es nun so gelöst das es eine art virtuelle Fenster gibt (die Controls ohne Handle) und diese tragen sich beim Parent (ein Fenster mit Handle) in eine Liste ein. Wenn jetzt der Parent (mit Handle) neu gemalt wird (durch windowmessages) so ruft der Parent nachdem er sein Bild auf seine Canvas gemalt hat die PaintMethode der virtuellen Fenster auf und stellt dabei den virtuellen Fenstern seine Canvas zur Verfügung. Da der Parent sein Bild ja schon gemalt hat können die anderen virtuellen Fenster schon das gezeichnete von der Parentcanvas abfragen und somit Transparenz erzielen. Wenn du jetzt von einem virtuellen Fenster Repaint aufrufst wird intern das Repaint des Parents aufgerufen so das dieser sich wieder zuerst malen kann. Da diese virutellen Fenster aber kein eigenes Handle haben und auch keine Canvas können diese Fenster auch keine Childs aufnehmen (also können virtuelle Fenster nie als Parent angegeben werden).

Oftmals fragen auch Leute nach, warum ein TImage zum Beispiel nicht über einem Memo liegen kann. Das liegt auch daran das ein TImage kein Handle hat und sich somit auf die Canvas des Parents malt.
Wenn also auf einem Form ein TImage liegt und ein TMemo so malt sich das TImage auf die Canvas des Forms. Da das TMemo aber auch auf dem TForm liegt und eine eigene Canvas hat liegt es immer vor dem TImage.
(Man kann sich eine Canvas als Blatt Papier vorstellen, und wenn das Blatt Papier vom Memo auf(über) dem Blatt Papier vom Form liegt so ist es unvermeidlich/logich das man das Bild unter dem TMemo-Blatt nicht sieht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.

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