Windows Container Fixierung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Windows Container Fixierung

Beitrag von Velindos »

Hallo,
habe mir einen Containerverwaltung zusammengestellt. In dieser kann man die einzelnen Container anwählen innerhalb eines Windows! Das Windows kann man auch Maximieren und Minimieren und frei am Desktop platzieren. Mit halten des Windows und an die Ränder des Desktop ziehen, kann mann es unter Windows 7/8 zum Einrasten bringen. Wenn ich jedoch mit den Cursor an den Rand fahre wird mir die Size-Funktion zum Fluch, weil ich den Window-Rahmen verändern kann und somit die Sache unansehlich wird.

Vielleicht kann mir jemand sagen, wie ich diese Übel los werde. Dh.das Einrasten möchte ich weiter, nur das Windows sollte man in seiner Grösse nicht verändern können!

Code: Alles auswählen

EnableExplicit

Enumeration ; Fenster
  #frmMain
EndEnumeration

Enumeration ; Gadgets
  #Container1
  #Container2
  #Container3
  #Button1
  #Button2
  #Button3
  #Frame1
  #Frame2
  #Frame3
EndEnumeration

Procedure ShowContainer(index = #Container1)
  Protected i
  
  For i =  #Container1 To #Container3
    HideGadget(i, #True)
  Next
  HideGadget(index, #False)
EndProcedure

OpenWindow(#frmMain,683, 0,667, 730, "Containerbeispiel", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget | #PB_Window_Invisible)

ContainerGadget(#Container1, 0, 0, 667, 706)
Frame3DGadget(#Frame1,0,0,640, 380,"Container 1")
ButtonGadget(#Button1, 10, 20, 80, 30, "Button1")
CloseGadgetList()
ContainerGadget(#Container2, 0, 0, 667, 706)
Frame3DGadget(#Frame2,0,0,640, 380,"Container 2")
ButtonGadget(#Button2, 90, 20, 80, 30, "Button2")
CloseGadgetList()
ContainerGadget(#Container3, 0, 0, 667, 706)
Frame3DGadget(#Frame3,0,0,640, 380,"Container 3")
ButtonGadget(#Button3, 170, 20, 80, 30, "Button3")
CloseGadgetList()

ShowContainer()

HideWindow(#frmMain, #False)

Define Gadget
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      Gadget = EventGadget()
      Select Gadget
        Case #Button1
          ShowContainer(#Container2)
          Debug "Button1 in Container 1"
        Case #Button2
          Debug "Button2 in Container 2"
          ShowContainer(#Container3)
        Case #Button3
          Debug "Button3 in Container 3" 
          ShowContainer(#Container1)
      EndSelect
  EndSelect
ForEver 


Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Container Fixierung

Beitrag von RSBasic »

Hm, sorry, ich kann dein Problem nicht nachvollziehen.
Kannst du vielleicht ein Video oder eine GIF-Animation ( http://www.mevedia.de/Snapshop ) erstellen, damit man sehen kann, was das Problem ist?
Oder/und vielleicht besser dein Problem beschreiben.

Wenn du ein Fenster erstellen möchtest, welches eine fixe Größe haben soll, musst du nur #PB_Window_SizeGadget aus der Parameterliste von OpenWindow entfernen.
Oder möchtest du, dass dein Container genauso groß ist wie das Fenster, auch nach Größenänderung des Fensters? Wenn ja, dann musst du eine Event-Abfrage erstellen und zwar mit: #PB_Event_SizeWindow
Dort musst du mit ResizeGadget() dein Container an die Fenstergröße anpassen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows Container Fixierung

Beitrag von Velindos »

Hallo,
danke für deine Hilfe. Habe deinen Rat befolgt und die Zeile auf

Code: Alles auswählen

OpenWindow(#frmMain,683, 0,667, 730, "Containerbeispiel",  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget| #PB_Window_Invisible)
geändert. Nun ist das Fenster fixiert wie ich es haben möchte.
Der HACKEN an der Sache ich kann das Fenster über den Desktop schieben und paltzieren, aber es rastet nicht mehr am seitlichen Desktop Rand ein. Auch ein Positionierung mit der WINDOS+Pfeil Tasten läuft nicht mehr.

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Container Fixierung

Beitrag von RSBasic »

Das funktioniert aber nur, wenn das Fenster in der Größe änderbar ist.
Wenn du möchtest, dass dein Fenster automatisch am Desktoprand einrasten soll, dann musst du das selber steuern.
Ermittle einfach bei Move-Event die Position und Größe des Fensters und die Größe des Desktops. Wenn sich das Fenster am Rand (+/-10px) des Desktops befindet, dann verschiebe dein Fenster, so dass das Fenster sich genau am Desktoprand befindet.
Soweit ich weiß gibt es hier im Forum auch ein paar Beispielcodes über das eigene, automatische Einrasten am Desktoprand.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Container Fixierung

Beitrag von RSBasic »

Oder:

Code: Alles auswählen

EnableExplicit

Define EventID
Global WNDPROC

Procedure WNDPROC(hWnd, uMsg, wParam, lParam)
  Protected CWPResult = CallWindowProc_(WNDPROC, hWnd, uMsg, wParam, lParam)
 
  Select uMsg
    Case #WM_NCHITTEST
      Select CWPResult
        Case #HTLEFT To #HTBOTTOMRIGHT
          ProcedureReturn 0
      EndSelect
  EndSelect

  ProcedureReturn CWPResult
EndProcedure


If OpenWindow(0, 0, 0, 500, 400, "", 0 | #WS_SIZEBOX | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget)
  WNDPROC = SetWindowLongPtr_(WindowID(0),#GWL_WNDPROC,@WNDPROC())
 
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Windows Container Fixierung

Beitrag von NicTheQuick »

Und nur mal so am Rande, weil's wirklich jeder zweite falsch macht: Wenn ich Holz HACKEN will, muss ich vorher die Axt vom HAKEN nehmen. :wink:
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows Container Fixierung

Beitrag von Velindos »

Hallo,
Danke für deinen Vorschlag. Habe in geleich Global WNDPROC in meinen Container eingearbeitet. Funkt und entspricht meinen Vorstellungen. Das Window rastet jedoch nicht mehr mit der Maus und verschieben ein, aber man kann mit der WINDOWS+Pfeil Taste die Sache positionieren, damit kann ich leben.

Habe auch deinen Vorschlag #PB_Event_SizeWindow eingearbeitet:

Code: Alles auswählen

Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_SizeWindow
      ResizeGadget(0, #PB_Ignore, #PB_Ignore, 300, #PB_Ignore) ; Ändert nur die Gadgetbreite.
    EndIf
  ForEver
EndIf
Nur die Sache funktioniert nicht, es verschwindet gleich mein erster Container, wobei ich die Anderen ansteuern kann!

Nochmals DANKE für deine Rasche Hilfe!!!

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows Container Fixierung

Beitrag von Velindos »

Hallo NicTheQuick,

*** DU NERVST +++, solche Bemerkungen sind destruktiv. Wenn dann präsentiere deinen VORSCHLAG, sonst lass es wie es ist!

Gruss ... Velindos

NicTheQuick: Das kann man auch freundlicher ausdrücken. Können Verbesserungsvorschläge - egal welcher Art - hier nicht einfach mal angenommen werden? Destruktiv ist hier übrigens gar nichts.
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Container Fixierung

Beitrag von RSBasic »

@Velindos
Kannst du deinen angepassten Code hier posten? Dann kann man es besser testen und ggf. anpassen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows Container Fixierung

Beitrag von Velindos »

Hallo,
hier meine Integriertes Beispiel: Wie gesagt einrasten am Desktop geht nicht, aber mit Windows+Pfeil kann man die Sache positionieren!

Code: Alles auswählen

EnableExplicit

Enumeration ; Fenster
  #frmMain
EndEnumeration

Enumeration ; Gadgets
  #Container1
  #Container2
  #Container3
  #Button1
  #Button2
  #Button3
  #Frame1
  #Frame2
  #Frame3
EndEnumeration

Global WNDPROC


Procedure ShowContainer(index = #Container1)
  Protected i
  
  For i =  #Container1 To #Container3
    HideGadget(i, #True)
  Next
  HideGadget(index, #False)
EndProcedure
Procedure WNDPROC(hWnd, uMsg, wParam, lParam)
  Protected CWPResult = CallWindowProc_(WNDPROC, hWnd, uMsg, wParam, lParam)
 
  Select uMsg
    Case #WM_NCHITTEST
      Select CWPResult
        Case #HTLEFT To #HTBOTTOMRIGHT
          ProcedureReturn 0
      EndSelect
  EndSelect

  ProcedureReturn CWPResult
EndProcedure

OpenWindow(#frmMain,683, 0,667, 730, "Containerbeispiel", 0 | #WS_SIZEBOX  | #PB_Window_MinimizeGadget| #PB_Window_Invisible)
;==================================================
ContainerGadget(#Container1, 0, 0, 667, 706)
Frame3DGadget(#Frame1,2,3,663, 700,"Container 1")
ButtonGadget(#Button1, 10, 20, 80, 30, "Button1")
CloseGadgetList()
;==================================================
ContainerGadget(#Container2, 0, 0, 667, 706)
Frame3DGadget(#Frame2,2,3,663, 700,"Container 2")
ButtonGadget(#Button2, 90, 20, 80, 30, "Button2")
CloseGadgetList()
;==================================================
ContainerGadget(#Container3, 0, 0, 667, 706)
Frame3DGadget(#Frame3,2,3,663, 700,"Container 3")
ButtonGadget(#Button3, 170, 20, 80, 30, "Button3")
CloseGadgetList()
;==================================================

ShowContainer()

HideWindow(#frmMain, #False)
WNDPROC = SetWindowLongPtr_(WindowID(0),#GWL_WNDPROC,@WNDPROC())

Define Gadget
Define EventID


Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      Gadget = EventGadget()
      Select Gadget
        Case #Button1
          ShowContainer(#Container2)
          Debug "Button1 in Container 1"
        Case #Button2
          Debug "Button2 in Container 2"
          ShowContainer(#Container3)
        Case #Button3
          Debug "Button3 in Container 3" 
          ShowContainer(#Container1)
      EndSelect
  EndSelect
ForEver 
PS: Wenn man Status-Bar dazu gibt, kann man das Windows über die Statusbar ändern, nur als Notiz!

Code: Alles auswählen

OpenWindow(#frmMain,683, 0,667, 730, "Containerbeispiel", 0 | #WS_SIZEBOX  | #PB_Window_MinimizeGadget| #PB_Window_Invisible)  
If CreateStatusBar(#StatusBar_1, WindowID(#frmMain))
EndIf
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten