AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SetClassLong mit GCL_HBRBACKGROUND
Thema durchsuchen
Ansicht
Themen-Optionen

SetClassLong mit GCL_HBRBACKGROUND

Ein Thema von OLLI_T · begonnen am 17. Okt 2003 · letzter Beitrag vom 30. Jun 2006
Antwort Antwort
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#1

SetClassLong mit GCL_HBRBACKGROUND

  Alt 17. Okt 2003, 18:02
HY Leuts!

Bevors ins WE geht noch ne kurze Frage: Wenn ich mit SetClassLong(Wnd,GCL_HBRBACKGROUND,hBrush) nen neuen Hintergrund für ein Fenster gesetzt, darf ich dann gleich anschliessend mit DeleteObject(hBrush) den Brush löschen oder muss/darf ich erst aufräumen, wenn auch das letzte betroffene Fenster der Klasse nicht mehr existiert?

Schönes WE allerseits

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: SetClassLong mit GCL_HBRBACKGROUND

  Alt 17. Okt 2003, 18:03
Probier es aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von wolfsblut
wolfsblut

Registriert seit: 25. Okt 2004
Ort: Anrode
20 Beiträge
 
Delphi 7 Professional
 
#3

Re: SetClassLong mit GCL_HBRBACKGROUND

  Alt 30. Jun 2006, 13:22
tja bevor es ins we geht ...

hallo leute

ich greif das thema mal auf.

wieso geht

SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_CLIENTEDGE); bei vcl sowie bei nonvcl fenstern aber

SetClassLong(handle, GCL_HBRBACKGROUND, CreatePatternBrush(loadbitmap(hinstance,makeintresource(1000)))); funzt bei nonvcl wunderbar aber bei vclforms könnt ich genausogut

doNothing; schreiben ...

hat jemand von euch ne idee ?

nette grüße und schönes we ....

michael
Michael
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: SetClassLong mit GCL_HBRBACKGROUND

  Alt 30. Jun 2006, 14:04
weil die Methoden .CreateWnd() und .CreateParams() oä. des VCL WinControls das wieder überschreibt. Bei einem Zugriff auf die Propery .Handle eines WinControls kannst du dir niemals sicher sein das diese hWnd in der komplettten Lebenszeit deiner Komponente immer gleich ist.

Dh. bei einem TForm zb. das sichtbar ist änderst du entscheidende Paramater wie BorderStyle, BoderIcons etc. pp. und dies führt dazu das die VCL autom. das Windows Fensterhandle diese Forms zerstört und gleich wieder ein neues erzeut mit den nun neuen Einstellungen.

Du must also den Hebel exakt so ansetzen das du von deinem WinControl die Methode .CreateWnd oder .CreateParams überschreibts und dort deine eigene Manipulationen einbaust. In deinem Falle, benötigst du ja in SetWindowLong() das HWnd als wäre die Methode .CreateWnd; zu überschreiben.

Kannst du das NICHT dann gibt einen anderen Weg. Schau dir mal die Property .WindowProc der TWinControls an. In einem TForm würdest du dann ein Feld FOldWindowProc: TWndMethod anlegen und eine private Methode NewWindowProc() erzeugen. In .FormCreate() liest du nun die WindowProc Property aus und speicherst diese in FOldWndProc. Danach setzt du die Property .WindowProc auf deine neue NewWindowProc Methode um. In NewWindowProc rufst du nun immer FOldWindowProc auf. Du hast jetzt quasi die Fensterprocedure deines TForms gehookt und empfängst dort alle Nachrichten. Und DIE wichtigste Nachricht die dirch interesiert ist wm_NCCreate oder wm_Create. In dieser Message findest du Felder die das Fenstrsytle beeinflusst also das was du mit SetWindowLong() beeinflussen möchstest. Wichtig ist nur das egal ob das TForm Recreated wird oder nicht das jedesmal wenn ein Fensterhandle alloziert wird du das wm_Create und/oder wm_NCCreate abfangen kannst und dort deine Style Änderungen durchführst.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von wolfsblut
wolfsblut

Registriert seit: 25. Okt 2004
Ort: Anrode
20 Beiträge
 
Delphi 7 Professional
 
#5

Re: SetClassLong mit GCL_HBRBACKGROUND

  Alt 30. Jun 2006, 14:34
year ein landsmann ...

hallo hagen komm auch aus dem wunderschönen und zur zeit *rauskuck* mit blauem himmel gesegneten thüringen ...

was du da schreibst macht schon sinn und auch wieder nicht.

setwindowlong(); geht ja !!! aber setclasslong(); net? was is da anders ?

grüße aus thüringen
michael
Michael
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: SetClassLong mit GCL_HBRBACKGROUND

  Alt 30. Jun 2006, 15:21
Ja sicher doch.

Der Unterscheid ist vergleichbar mit dem Untereschied zwischen einer Klasse in Delphi und einer Instanz dieser Klasse, also einem Objekt. Alle Instanzen einer Klasse sind individuelle Speicherobjekte die lebendig sind und haben die Gemeinsamkeit ihrer Klasse. Die Klasse selber ist eine Struktur die der Compiler im Codesegement redaonly speichert.

In deinem Falle greifst du also mit SetWindowLong() auf eine Fenster-Instanz zu die vom Typus her eine Fensterklasse entspricht. Mit SetClassLong() greifst du auf die Eigenschaften dieser Klasse zu da im Windows auch eine Klasse eine dynamisch erzeugbare Datenstruktur ist.

Nur eines kannst du dir sicher sein: das was in den Fensterklassen drinnensteht hat in einem davon instantierten VCL Fensterhandle fast keinerlei Bedeutung heutzutage !!

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von wolfsblut
wolfsblut

Registriert seit: 25. Okt 2004
Ort: Anrode
20 Beiträge
 
Delphi 7 Professional
 
#7

Re: SetClassLong mit GCL_HBRBACKGROUND

  Alt 30. Jun 2006, 17:59
hallo,

ja fuck ..... sorry für die wortwahl

ich könnt grad n stück tischplatte essen wenn funierte spanplatte schmecken würde ...

aber bei nonvcl gehts doch ...... ich dreh noch ab ..

grüße aus thüringen
michael
Michael
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 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