Seite 1 von 2
Fensterklasse in Callback freigeben
Verfasst: 01.05.2009 18:19
von Fluid Byte
Da ich nicht extra eine Funktion schreiben möchte würde ich gerne innerhalb meiner Fensterprozedur, als Antwort auf #WM_DESTROY, eine von mir registrierte Fensterklasse wieder freigeben.
Ich weiß dass das Fensterhandle erst freigegeben werden muss bevor UnregisterClass_() erfolgreich ist. Aber genau das ist mein Problem. Im Moment gibt UnregisterClass_() #Null zurück weil das Handle noch existiert. Wenn ich nun DestroyWindow_() hinzufüge funktioniert es aber UnregisterClass_() gibt dann mehrfach zurück.
Code: Alles auswählen
OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Procedure WindowProc(hWnd,uMsg,wParam,lParam)
Select uMsg
Case #WM_DESTROY
;DestroyWindow_(hWnd)
Debug UnregisterClass_("AFX_NIT22Demo",0)
ProcedureReturn 0
EndSelect
ProcedureReturn DefWindowProc_(hWnd,uMsg,wParam,lParam)
EndProcedure
wc.WNDCLASS
wc\lpfnWndProc = @WindowProc()
wc\hCursor = LoadCursor_(0,#IDC_CROSS)
wc\hbrBackground = #COLOR_WINDOW + 1
wc\lpszClassName = @"AFX_NIT22Demo"
RegisterClass_(wc)
Result = CreateWindowEx_(#WS_EX_CLIENTEDGE,"AFX_NIT22Demo",0,#WS_CHILD | #WS_VISIBLE,10,10,200,130,WindowID(0),0,0,0)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Verfasst: 01.05.2009 18:30
von ts-soft
Code: Alles auswählen
OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Procedure WindowProc(hWnd,uMsg,wParam,lParam)
Select uMsg
Case #WM_DESTROY
DestroyWindow_(hWnd)
If UnregisterClass_("AFX_NIT22Demo", 0)
ProcedureReturn 0
EndIf
EndSelect
ProcedureReturn DefWindowProc_(hWnd,uMsg,wParam,lParam)
EndProcedure
wc.WNDCLASS
wc\lpfnWndProc = @WindowProc()
wc\hCursor = LoadCursor_(0,#IDC_CROSS)
wc\hbrBackground = #COLOR_WINDOW + 1
wc\lpszClassName = @"AFX_NIT22Demo"
RegisterClass_(wc)
Result = CreateWindowEx_(#WS_EX_CLIENTEDGE,"AFX_NIT22Demo",0,#WS_CHILD | #WS_VISIBLE,10,10,200,130,WindowID(0),0,0,0)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Denke ich mal
Verfasst: 01.05.2009 18:40
von Fluid Byte
Code: Alles auswählen
If UnregisterClass_("AFX_NIT22Demo", 0)
ProcedureReturn 0
EndIf
Das ist Betrug!
Mit nem' If-Clause ist es ja nicht getan. Denn alle anderen Befehle geben ja immer noch mehrfach zurück. In diesem Fall DestroyWindow_(). Außerdem ist dies nur ein Codeauszug. Im Original werden noch Speicherblöcke mit FreeMemory() freigeben. Was natürlich zu mehreren IMA's führt da du den Speicher ja nur einmal freigeben kannst.
Allerdings bin ich auch ein wenig gaga. Man sollte als Antwort auf #WM_DESTROY natürlich nicht DestroyWindow_() aufrufen. Denn genau diese Nachricht wird von dem Befehl ans Callback gesendet. Auf der anderen Seite ist es merkwürdig denn selbst angesichts dieser Tatsache dürfte #WM_DESTROY doch nur zweimal zurückgeben? Vielleicht ist #WM_DESTROY einfach nicht die korrekt Nachricht um das Fensterhandle freizugeben?
Verfasst: 01.05.2009 18:46
von milan1612
Les dir mal die Bemerkungen zu WM_NCDESTROY durch, vielleicht hilfts:
http://msdn.microsoft.com/en-us/library/ms632636
The DestroyWindow function sends the WM_NCDESTROY message
to the window following the WM_DESTROY message. WM_DESTROY is
used to free the allocated memory object associated with the window.
Verfasst: 01.05.2009 19:18
von Fluid Byte
milan1612 hat geschrieben:Les dir mal die Bemerkungen zu WM_NCDESTROY
MSDN hat geschrieben:Remarks
This message frees any memory internally allocated for the window
Bringt mich jetzt nicht wirklich weiter.
Hatte ich aber gestern schon getestet. Gleiches Ergebnis.
Verfasst: 02.05.2009 11:21
von milan1612
Fluid Byte hat geschrieben:milan1612 hat geschrieben:Les dir mal die Bemerkungen zu WM_NCDESTROY
MSDN hat geschrieben:Remarks
This message frees any memory internally allocated for the window
Bringt mich jetzt nicht wirklich weiter.
Hatte ich aber gestern schon getestet. Gleiches Ergebnis.
Einen Versuch wars wert, bin halt nicht der API Guru

Verfasst: 02.05.2009 12:59
von edel
Das geht nicht, WM_NCDESTROY ist die letzte Message und erst nach dieser
Message wird das Fenster zerstoert. Du koenntest dort aber einen Thread
starten, der solange laeuft bis das Fenster nicht mehr existiert und dann
die Klasse wieder freigibt. Aber schoen ist was anderes... und hoffentlich
nicht fuer deinen VD

Verfasst: 03.05.2009 22:56
von Fluid Byte
edel hat geschrieben:Das geht nicht, WM_NCDESTROY ist die letzte Message und erst nach dieser Message wird das Fenster zerstoert.
Habe ich fast "befürchtet". Danke für die Info.
edel hat geschrieben:Du koenntest dort aber einen Thread starten, der solange laeuft bis das Fenster nicht mehr existiert und dann die Klasse wieder freigibt.
Nahh, alles Unfug. Um eine Zeile zu sparen ist das den Aufwand wohl kaum Wert. Gibt halt 'ne extra Funktion. Nicht so wild.
edel hat geschrieben:Aber schoen ist was anderes... und hoffentlich nicht fuer deinen VD

Naja ...
Ehrlich gesagt ist es für mein PropertyGrid. Erst war es rein API, dann basiert auf einem ContainerGadget und jetzt geh' ich wieder zurück zu API. Ich will das PropertyGrid für eine kleine Gebühr als DLL vertreiben und in C/C++ kann wohl nicht so viel mit Gadget-Nummern anfangen.
@ts-soft:
Ich war am Samstag in der Stadt und hab' mir nun endlich einen neuen Rechner gekauft:
Intel Core 2 QUAD Q8300 @ 2.50 GHZ
Arbeitsspeicher 8,00 GB
Windows Vista Premium 64-Bit
NVIDIA GeFroce GT 130 / 1536 MB
PureBasic x64 ist schon installiert. Werd' demnächst mal eine "echte" 64-Bit Version zum testen komplieren.

Verfasst: 03.05.2009 23:07
von edel
Fluid Byte hat geschrieben:
Ehrlich gesagt ist es für mein PropertyGrid. Erst war es rein API, dann basiert auf einem ContainerGadget und jetzt geh' ich wieder zurück zu API. Ich will das PropertyGrid für eine kleine Gebühr als DLL vertreiben und in C/C++ kann wohl nicht so viel mit Gadget-Nummern anfangen.
In der Regel ist es normal eine "Install" und eine "UnInstall" Funktion zu
haben. Wenn du es als statische Lib anbietest, kannst du auch beides
nutzen. Einmal ohne PB Abaehngigkeiten und dann fuer PB als Gagdet.
Fuer letzteres musst du aber einen kleinen Wrapper dazu schreiben. Was
aber sehr einfach ist.
Fluid Byte hat geschrieben:
Naja ...
Das Projekt besteht doch noch, oder?

Verfasst: 03.05.2009 23:08
von ts-soft
Fluid Byte hat geschrieben:
@ts-soft:
Ich war am Samstag in der Stadt und hab' mir nun endlich einen neuen Rechner gekauft:
Intel Core 2 QUAD Q8300 @ 2.50 GHZ
Arbeitsspeicher 8,00 GB
Windows Vista Premium 64-Bit
NVIDIA GeFroce GT 130 / 1536 MB
PureBasic x64 ist schon installiert. Werd' demnächst mal eine "echte" 64-Bit Version zum testen komplieren.


, hört sich gut an, besser als meiner
Ich hatte schon Angst 64-Bit macht einsam
Gruß
Thomas