Fensterklasse in Callback freigeben

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Fensterklasse in Callback freigeben

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Code: Alles auswählen

If UnregisterClass_("AFX_NIT22Demo", 0)
    ProcedureReturn 0
EndIf
Das ist Betrug! :lol:

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?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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.
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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. :lol:

Hatte ich aber gestern schon getestet. Gleiches Ergebnis.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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. :lol:

Hatte ich aber gestern schon getestet. Gleiches Ergebnis.
Einen Versuch wars wert, bin halt nicht der API Guru :lol:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 :D
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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 :D
Naja ... :oops:

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. 8)
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 ... :oops:
Das Projekt besteht doch noch, oder? ;)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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. 8)
:allright: , hört sich gut an, besser als meiner :cry: :wink:

Ich hatte schon Angst 64-Bit macht einsam :mrgreen:

Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten