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 :mrgreen: ) 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!