Beschränkung beim maximieren eines Fensters...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beschränkung beim maximieren eines Fensters...

Beitrag 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:
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

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

Beitrag von edel »

such mal nach SHAppBarMessage.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

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

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

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

Beitrag 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:
Antworten