[Delphi] Komponente über Parentcontrol hinaus

pcw

Lt. Commander
Registriert
Juli 2001
Beiträge
1.676
Ich müsste eine Komponente erstellen, die in der Lage ist, über das ParentControl hinaus zu zeichnen. Ähnlich wie es das PopupMenü und die Combobox machen.

Leider werd ich bei beiden aus dem Code nicht schlau, wie ich das anstellen kann.

Was genau muss ich tun, um den Bereich einer Komponente über das Parent auszudehnen (ggf auch über das Fenster hinaus)? Hat jemand einen Beispielcode oder ähnliches?
 
Popup-Menüs erzeugen afaik ein eigenes Fenster. Das kannst du beliebig groß werden lassen.

In Delphi wäre das wohl einfach eine neue Form, die dann die entsprechenden Styles gesetzt hat. Du musst dann nur noch auf die OnActivate-Sachen etc. zugreifen.

Falls du das nicht willst, kannst du dir entweder den DC des Hauptfensters krallen und selber munter drauf los pinseln - oder sogar den DC des Desktops. :) Für letzteres hatte ich mal in einem älteren Buch ein Beispiel für.

(Soweit ich das bis jetzt immer verstanden habe, kann ein Control niemals direkt größer werden als sein Parent. (wenn dann nur mit Scrollbars im Parent)
 
Also die Combobox macht das irgendwie so toll mit Win-API funktionen und drei verschiedenen Handles für Editfeld und Dropdownliste. Aber ganz bin ich da noch nicht hinter gestiegen.
Ein neues TForm wollte ich eigentlich nicht erzeugen, da das ganze ja Teil einer Komponente werden soll etc.

Komischerweise haben die aber nirgends "CreateWindowEx" oder so verwendet und eigentlich hatte ich drauf gezählt, dass du mir jetzt sagst, wie die ohne ein neues Fenster zu erzeugen darüber hinaus zeichnen konnten. Ich hab nämlich langsam den Verdacht, dass in den paar Codeschnipseln, für die ich keine Erklärung gefunden habe, irgendwelche WinApi internen komponenten erzeugt werden...

Naja, ich werd mir dann ma aneignen, wie ich mit Api Fenster ohne viel Aufwand erstelle ^-^
 
Hmm. Jetzt müsste ich selber erst durch die VCL steppen und schauen, was die Combobox so macht. Werde mal schauen ob ich das morgen früh schaffe. :)

Fürs Popupmenü hatte ich das mal gemacht. Da werden die Standard WinAPI-Menüfunktionen benutzt. Macht die Combobox das evtl. genauso?
 
Ich befürchte ja. Ich hab nämlich ehrlich gesagt keine Methode gefunden, die irgendwas in die Dropdownliste zeichnet. Und wenn ich selber versuch, dort zu zeichnen, bekomm ich immer nen Error.
 
Also ich hab jetzt eine Klasse geschrieben, die ein neues Fenster per API erzeugt.
Allerdings hab ich ja die WindowProc beim registrieren der Fensterklasse festlegen müssen und hab jetzt keinen Schimmer, wie ich das Fenster dazu bekomme, mit der Instanz der Klasse zu kommunizieren, zu der es gehört.
Schließlich kommen die Nachrichten direkt von Windows und haben damit kein Handle oder ähnliches auf die Instanz.

Die Kommunikation von Klasseninstanz zu API-Fenster ist kein Problem. Das lässt sich über MEssages lösen. Aber wie mach ich es andersrum?
 
Um über ein Fenster hinaus zu zeichnen benötigst Du den Device Context des Fensters in dem Du zeichnen willst. Das ist entweder ein anderes Fenster oder bei einem Top Level Fenster der Desktop.

Den DC holen kannst Du mit GetDC() und extrem wichtig das ReleaseDC() nicht vergessen.
Das Desktop Handle bekommst Du mit GetDeskopWindow().

Code:
HWND GetDesktopWindow(VOID);
HDC GetDC( HWND hWnd   // handle to window);
int ReleaseDC(
  HWND hWnd,  // handle to window
  HDC hDC     // handle to DC);

MfG

Arnd
 

Ähnliche Themen

Zurück
Oben