Seite 1 von 1
Minimale Fenstergröße festlegen
Verfasst: 17.06.2005 04:47
von Jake
Ich möchte die Minimale Größe eines Fensters Fenstlegen und habe mir dazu aus dem Codearchiv ein Beispiel geholt.
Dieses Beispiel legt jedoch auch die minimale Größe von allen weiteren Fenstern Fest.
Ich habe den Code so angepasst das man über den Button ein weiteres Fenster öffnen kann.
Code: Alles auswählen
; www.purearea.net (Sourcecode collection by cnesm)
; Author:
; Date: 22. November 2003
#Window_0 = 0
#Window_1 = 1
#Gadget_0 = 0
#Gadget_1 = 1
#Gadget_2 = 2
Procedure WCB(wnd, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_GETMINMAXINFO
GetWindowRect_(wnd,r.RECT)
*pMinMax.MINMAXINFO = lParam
*pMinMax\ptMinTrackSize\x=467
*pMinMax\ptMinTrackSize\y=429
*pMinMax\ptMaxTrackSize\x=GetSystemMetrics_(#SM_CXSCREEN)
*pMinMax\ptMaxTrackSize\y=GetSystemMetrics_(#SM_CYSCREEN)
Result = 0
EndSelect
ProcedureReturn Result
EndProcedure
Procedure Open_Window_0()
pw=OpenWindow(#Window_0, 216, 0, 467, 402, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget , "New window ( 0 )")
SetWindowCallback(@WCB())
CreateGadgetList(WindowID())
Frame3DGadget(#Gadget_0, 60, 80, 320, 250, "")
TextGadget(#Gadget_1, 60, 150, 320, 70, "Minimalmaße sollen bleiben"+Chr(13)+"Minimum size is set", #PB_Text_Center)
ButtonGadget(#Gadget_2, 10, 10, 100, 20, "Fenbster")
EndProcedure
Open_Window_0()
Repeat
id=WaitWindowEvent()
If id=#PB_EventGadget
If EventGadgetID()=#Gadget_2
OpenWindow(#Window_1, 0, 0, 150, 150, #PB_Window_WindowCentered, "Fenster")
EndIf
EndIf
If id=#PB_EventCloseWindow
quit=1
EndIf
Until quit=1
End
; ExecutableFormat=Windows
; EnableXP
; EOF
Was kann ich tun damit nur das Parentwindow eine minimale Größe zugewiesen bekommt? Ich kann den "wnd" nicht setzten.
Verfasst: 17.06.2005 12:51
von bobobo
der callback wirkt halt bei jedem Fenster
Du kannst den überschreiben bei Bedarf.
Code: Alles auswählen
; www.purearea.net (Sourcecode collection by cnesm)
; Author:
; Date: 22. November 2003
#Window_0 = 0
#Window_1 = 1
#Gadget_0 = 0
#Gadget_1 = 1
#Gadget_2 = 2
Procedure nix(wnd, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
ProcedureReturn Result
EndProcedure
Procedure WCB(wnd, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_GETMINMAXINFO
GetWindowRect_(wnd,r.RECT)
*pMinMax.MINMAXINFO = lParam
*pMinMax\ptMinTrackSize\x=467
*pMinMax\ptMinTrackSize\y=429
*pMinMax\ptMaxTrackSize\x=GetSystemMetrics_(#SM_CXSCREEN)
*pMinMax\ptMaxTrackSize\y=GetSystemMetrics_(#SM_CYSCREEN)
Result = 0
EndSelect
ProcedureReturn Result
EndProcedure
Procedure Open_Window_0()
pw=OpenWindow(#Window_0, 216, 0, 467, 402, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget , "New window ( 0 )")
;SetWindowCallback(@WCB())
CreateGadgetList(WindowID())
Frame3DGadget(#Gadget_0, 60, 80, 320, 250, "")
TextGadget(#Gadget_1, 60, 150, 320, 70, "Minimalmaße sollen bleiben"+Chr(13)+"Minimum size is set", #PB_Text_Center)
ButtonGadget(#Gadget_2, 10, 10, 100, 20, "Fenbster")
EndProcedure
Open_Window_0()
Repeat
Select EventWindowID()
Case #Window_0
SetWindowCallback(@WCB())
Case #Window_1
SetWindowCallback(@nix())
EndSelect
id=WaitWindowEvent()
If id=#PB_EventGadget
If EventGadgetID()=#Gadget_2
OpenWindow(#Window_1, 0, 0, 150, 150, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget|#PB_Window_WindowCentered, "Fenster")
EndIf
EndIf
If id=#PB_EventCloseWindow
quit=1
EndIf
Until quit=1
End
; ExecutableFormat=Windows
; EnableXP
; EOF
Das flackert allerdings sobald das zweite Fenster irgendwie das erste mit berührt (das das erste dann auch Messages erhält)).
Eventuell fällt dir ja ne andere Möglichkeit ein, wie du das aktive Fenster bestimmen kannst.
Verfasst: 17.06.2005 14:19
von Jake
Für meine Zwecke würde das schon reichen da ich das 2. Fenster nicht in der Größe verändern will.
Dennoch würde es mich iteressieren wie das mit beiden Fenstern geht. Bislang habe ich das Problem mit dem Geflacker auch nicht lösen konnen.
Verfasst: 17.06.2005 15:48
von bobobo
steht doch da oben ..
Da findet ein Check statt welches Fenster grade aktiv
ist (oder zumindest sollte das so sein

) und
wenn's das Hauptfenster ist, wird DEIN callback gesetzt
und wenn's das andere ist das nix-Callback.
Verfasst: 17.06.2005 18:18
von Jake
Dein Codebeispiel habe ich verstanden - danke.
Ich meinte nur das ich gerne wissen würde wie das ohne bliken geht.
Ich habe da schon rumprobiert aber das blinken bekomme ich nicht weg.
Scheinbar wird auf dem Parentwindow ein Event erzeugt wenn man das Clientfenster darüber schiebt und deshalb blinkt es. Ich weiß aber nicht was man dagegen tun kann.
Verfasst: 17.06.2005 19:11
von Georg
Hallo Jake,
so sollte nichts mehr flacker.
Code: Alles auswählen
Global iDWndMain , hWndMain , iDWndClient ,hWndClient
Procedure WindowCallback(hWnd, Msg, wParam, lParam)
Select Msg
Case #WM_GETMINMAXINFO
;Fenster selektieren
If hWnd = hWndMain
;Mit der Meldung "WM_GETMINMAXINFO" wird in lParam ein Zeiger
;auf die Struktur "MINMAXINFO" übergeben
*MMI.MINMAXINFO = lParam
;Minimale Fenstergröße beim "Ziehen":
*MMI\ptMinTrackSize\x = 320
*MMI\ptMinTrackSize\y = 200
;Maximale Fenstergröße beim "Ziehen":
*MMI\ptMaxTrackSize\x = 640
*MMI\ptMaxTrackSize\y = 480
ProcedureReturn 0
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
iDWndMain =OpenWindow(#PB_Any,0,0,600,400, #PB_Window_SizeGadget| #PB_Window_SystemMenu | #PB_Window_WindowCentered| #PB_Window_Invisible ,"Fenstergröße begrenzt")
hWndMain = WindowID(iDWndMain)
If CreateGadgetList(hWndMain)
EndIf
iDWndClient =OpenWindow(#PB_Any,0,0,400,200, #PB_Window_SizeGadget| #PB_Window_SystemMenu | #PB_Window_WindowCentered ,"Fenstergröße nicht begrenzt",hWndMain)
hWndClient = WindowID(IDWndClient)
If CreateGadgetList(hWndClient)
EndIf
SetWindowCallback(@WindowCallback())
HideWindow(IDWndMain , 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
If EventWindowID() = IDWndMain
End
Else
CloseWindow( iDWndClient)
EndIf
Case #PB_EventGadget
Select EventGadgetID()
Case Gadget
EndSelect
EndSelect
ForEver
End
cu Georg
Verfasst: 18.06.2005 04:08
von Jake
Super, jetzt geht alles. Danke euch beiden - wieder viel dazugelernt.
Ich finde dieses Beispiel sollte mal überarbeitet werden und dann ins CodeArchiv. Meine Programme haben fast alle mehr als ein Fenster und dann ist das Beispiel aus dem Archiv nicht sehr hilfreich.
Noch was anderes. Woher weiß man wie die Structure aussehen muß die sich im Code befindet? Im PSDK habe ich die bei WM_GETMINMAXINFO nicht gesehen und auch sonst nicht gefunden. Das geht mir auch bei anderen API's so und ich kann das dann nur so hinnehmen wie es im Code-Beispiel steht ohne zu wissen was da genau passiert.
Verfasst: 08.07.2005 22:27
von Justy
WM_GETMINMAXINFO:
http://msdn.microsoft.com/library/defau ... axinfo.asp
Structure MINMAXINFO:
http://msdn.microsoft.com/library/defau ... axinfo.asp
Bei solchen Sachen am besten die MSDN verwenden!
mfg. Justy
//EDIT:
Für diejenigen die Firefox verwenden:
Mit diesem kleinen Search-Plugin kann man die MSDN bequem durchsuchen:
msdn-library.zip (1,29KB)
Einfach in den "searchplugins"-Ordner im Firefox-Verzeichnis kopieren!