Seite 1 von 1

Beschränkung beim maximieren eines Fensters...

Verfasst: 09.09.2011 06:05
von Ghosty1967
Hallo zusammen...

ich habe mir für meinen Rechner auf der Arbeit eine Art Sidebar zusammengeschraubt, da ich unzählige
Tools, Tabellen und Programme bei meiner täglichen Arbeit brauche und mein Desktop langsam etwas
sagen wir mal unübersichtlich wurde ;)

Nun hätte ich ganz gerne, das die Anwendungen, welche ich über meine "Sidebar" aufrufe zwar maximiert
aber trotzdem in der Breite begrentzt geöffnet werden. Meine "Sidebar" steht dabei immer am rechten Rand
des Bildschirms und hat immer die gleiche feste Breite.
Wenn ich also ein Fenster maximiere sollte der Bereich der "Sidebar" nicht von irgendeinem Fenster
überdeckt werden. (Ähnlich dem Verhalten zwischen Fenstern und der Taskleiste).

Ist dies programmiertechnisch zu realisieren und wenn ja, kennt jemand den Weg zum Ziel? :mrgreen:

Re: Beschränkung beim maximieren eines Fensters...

Verfasst: 09.09.2011 08:18
von edel
such mal nach SHAppBarMessage.

Re: Beschränkung beim maximieren eines Fensters...

Verfasst: 09.09.2011 11:54
von STARGÅTE
Ohne API gehts mit WindowBounds

Code: Alles auswählen

Enumeration
	#Window
EndEnumeration

ExamineDesktops()
OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
	WindowBounds(#Window, #PB_Ignore, #PB_Ignore, DesktopWidth(0)-100, #PB_Ignore)
	SetWindowState(#Window, #PB_Window_Maximize)

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			End
	EndSelect
ForEver

Re: Beschränkung beim maximieren eines Fensters...

Verfasst: 09.09.2011 14:03
von Sicro

Code: Alles auswählen

; Größe der Arbeitsfläche ermitteln
If SystemParametersInfo_(#SPI_GETWORKAREA,0,@WorkArea.RECT,0) <> 0
  
  ; Arbeitsfläche horizontal um 400 Pixel verringern
  WorkArea\right - 400 
  If SystemParametersInfo_(#SPI_SETWORKAREA,0,@WorkArea,0) <> 0
    
    ; Notepad maximiert starten und etwas Zeit zum Starten geben
    RunProgram("cmd","/C " + #DQUOTE$ + "start /max notepad.exe" + #DQUOTE$,"",#PB_Program_Hide)
    Delay(5000) ; gebenfalls erhöhen, wenn die Anwendung länger braucht
    
    ; Arbeitsfläche wieder zum Urzustand zurücksetzen
    ; ACHTUNG: Dies muss ausgeführt werden, sonst ist die Arbeitsfläche die
    ; ganze Zeit begrenzt - auch nach dem Beenden des Programmes.
    ; Zustand wird ansonsten vermutlich bei Benutzer-Abmeldung wieder zurückgesetzt.
    WorkArea\right + 400
    SystemParametersInfo_(#SPI_SETWORKAREA,0,@WorkArea,0)
  EndIf
EndIf

Re: Beschränkung beim maximieren eines Fensters...

Verfasst: 09.09.2011 16:03
von Danilo
Ghosty1967 hat geschrieben:Nun hätte ich ganz gerne, das die Anwendungen, welche ich über meine "Sidebar" aufrufe zwar maximiert
aber trotzdem in der Breite begrentzt geöffnet werden. Meine "Sidebar" steht dabei immer am rechten Rand
des Bildschirms und hat immer die gleiche feste Breite.
Wenn ich also ein Fenster maximiere sollte der Bereich der "Sidebar" nicht von irgendeinem Fenster
überdeckt werden. (Ähnlich dem Verhalten zwischen Fenstern und der Taskleiste).
Du mußt Deine Sidebar bei Windows registrieren.

edel gab schon einen Hinweis, aber da die anderen zwei Tipps in die falsche Richtung gehen,
hier mal ein Beispiel:

Code: Alles auswählen

EnableExplicit

Structure sAppBar
    edge.i
    size.i
    title.s
    AppBar.APPBARDATA
EndStructure


Procedure.l RegisterAppBar( WindowID.i, fRegister.l )
    Protected abd.APPBARDATA

    abd\cbSize = SizeOf(APPBARDATA)
    abd\hwnd   = WindowID

    If fRegister
        abd\uCallbackMessage = #WM_USER+1
        If Not SHAppBarMessage_(#ABM_NEW,@abd)
            ProcedureReturn #False
        EndIf
    Else
        SHAppBarMessage_(#ABM_REMOVE,@abd)
    EndIf
    ProcedureReturn #True
EndProcedure

Procedure AppBarQuerySetPos( *bar.sAppBar )
    SHAppBarMessage_(#ABM_QUERYPOS,@*bar\AppBar)
    SHAppBarMessage_(#ABM_SETPOS  ,@*bar\AppBar)
    With *bar\AppBar
        ;MoveWindow_( \hwnd, \rc\left, \rc\top, \rc\right - \rc\left, \rc\bottom - \rc\top, #True )
    EndWith
EndProcedure

Procedure.i CreateAppBar( *bar.sAppBar )
    Protected WorkArea.RECT
    Protected x,y,w,h, win

    If Not *bar : ProcedureReturn 0 : EndIf

    SystemParametersInfo_(#SPI_GETWORKAREA,0,@WorkArea,0)
    Select *bar\edge
        Case #ABE_RIGHT
            x = WorkArea\right - *bar\size
            ;y = 0
            w = *bar\size
            h = WorkArea\bottom
        Case #ABE_LEFT
            ;x = 0
            ;y = 0
            w = *bar\size
            h = WorkArea\bottom
        Case #ABE_TOP
            w = WorkArea\right
            h = *bar\size
        Case #ABE_BOTTOM
            ;x = 0
            y = WorkArea\bottom - *bar\size
            w = WorkArea\right
            h = *bar\size
        Default
    EndSelect
    
    win = OpenWindow(#PB_Any,x,y,w,h,*bar\title,#PB_Window_Tool);|#PB_Window_Invisible)
    SetWindowLongPtr_(WindowID(win),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW|#WS_EX_TOPMOST)
    SetWindowLongPtr_(WindowID(win),#GWL_STYLE,#WS_VISIBLE|#WS_POPUP)
    MoveWindow_(WindowID(win),x,y,w,h, #True )
    ;HideWindow(win,0)
    ;UpdateWindow_( WindowID(win) )
    
    With *bar\AppBar
        \hwnd      = WindowID( win )
        \rc\left   = x
        \rc\top    = y
        \rc\right  = x+w
        \rc\bottom = h
        \uEdge     = *bar\edge
    EndWith
    
    RegisterAppBar( WindowID(win), #True )

    AppBarQuerySetPos( *bar )
    
    UpdateWindow_( WindowID(win) )
    
    ProcedureReturn win
EndProcedure

;
; Program
;

Define win, exit, quit
Define bar.sAppBar

bar\edge  = #ABE_RIGHT
bar\size  = 100
bar\title = "My AppBar"

win  = CreateAppBar( @bar )
exit = ButtonGadget(#PB_Any,10,10,80,25,"eXit")

Repeat
    Select WindowEvent()
        Case #PB_Event3D_CloseWindow
            quit = #True
        Case #PB_Event_Gadget
            If EventGadget() = exit
                quit = #True
            EndIf
    EndSelect
Until quit = #True

RegisterAppBar( WindowID(win), #False )
Das funktioniert dann nicht nur mit Programmen die Du aus Deiner Toolbar heraus startest,
sondern auch mit anderen maximierten Fenstern.

Re: Beschränkung beim maximieren eines Fensters...

Verfasst: 10.09.2011 04:43
von Ghosty1967
Ersteinmal vielen Dank für die Antworten...

Stargates Vorschlag zu WindowBounds() geht leider in die falsche Richtung, da ich ja nicht nur mein eigenes Fenster
sondern auch alle anderen Systemweit aufgerufenen Fenster in den Dimensionen begrenzen möchte. Ich glaube, der
Schlüssel liegt in dem Schnipsel von Danilo, da ich hier ja mein "Fenster" dem System als eine Feste Größe auf dem
Desktop zuweise.
Ich werde alles mal ausprobieren und melde mich wieder...

Danke Euch und schönes Wochenende! :lol: :allright: