Minimale Fenstergröße festlegen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Jake
Beiträge: 121
Registriert: 28.05.2005 04:10
Wohnort: Berlin

Minimale Fenstergröße festlegen

Beitrag 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.
MfG Jake
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Jake
Beiträge: 121
Registriert: 28.05.2005 04:10
Wohnort: Berlin

Beitrag 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.
MfG Jake
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Jake
Beiträge: 121
Registriert: 28.05.2005 04:10
Wohnort: Berlin

Beitrag 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.
MfG Jake
Georg
Beiträge: 29
Registriert: 17.06.2005 19:04

Beitrag 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
Jake
Beiträge: 121
Registriert: 28.05.2005 04:10
Wohnort: Berlin

Beitrag 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.
MfG Jake
Benutzeravatar
Justy
Beiträge: 131
Registriert: 10.09.2004 13:31
Wohnort: Feldbach / Steiermark / Österreich
Kontaktdaten:

Beitrag 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!
Am Anfang erschuf der Mensch Gott.
Friedrich Nietzsche
Antworten