Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von N00B »

Hi

Ich hoffe jemand kann mir helfen.

Ich hab den guten Code von Stefan aus dem Winapi Library Tool genommen, und nach dem
resizen der Appbar viel mir auf, daß der Arbeitsbereich nicht automatisch angepasst wird daß passiert nur beim erstellen der AppBar.

Hab schon gestern etwas rumprobiert (in der CreateAPPBar Prozedure, und auf MSDN nachgelesen) aber ich komm einfach nicht dahinter, wie ich das managen
kann, daß nicht noch eine AppBar erstellt wird, sondern die AppBar angepasst, und dann halt der Arbeitsbereich ausgerichtet wird.

Der Code unten ist unmodifiziert, bis auf die Ausrichtung und Größe der AppBar, und halt
ein ResizeWindow Befehl beim ersten Button von links.

Code: Alles auswählen

  ;Autor: Stefan
  
  EnableExplicit
  
  Define EventID
  Define *APPBD.APPBARDATA
  Define X
  Define Y
  Define Width
  Define Height
  
  Procedure CreateAPPBar(Edge,Size); unterstützt #ABE_LEFT,#ABE_RIGHT,#ABE_TOP,#ABE_BOTTOM für Edge
    Protected *APPBD.APPBARDATA=AllocateMemory(SizeOf(APPBARDATA))
    Protected TBD.APPBARDATA
    SHAppBarMessage_(#ABM_GETTASKBARPOS,TBD)
    Protected TBEdge=TBD\uEdge
    
    SHAppBarMessage_(#ABM_NEW,*APPBD)
    
    *APPBD\uEdge=Edge
    
    Select Edge
      Case #ABE_LEFT
        
        If TBEdge=Edge
          *APPBD\rc\Left=TBD\rc\Right
          *APPBD\rc\Right=TBD\rc\Right+Size
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=Size
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
        
      Case #ABE_RIGHT
        
        If TBEdge=Edge
          *APPBD\rc\Left=TBD\rc\Left-Size
          *APPBD\rc\Right=TBD\rc\Left
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        Else
          *APPBD\rc\Left=GetSystemMetrics_(#SM_CXSCREEN)-Size
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
        
      Case #ABE_TOP
        
        If TBEdge=Edge
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=TBD\rc\Bottom
          *APPBD\rc\Bottom=TBD\rc\Bottom+Size
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=Size
        EndIf
        
      Case #ABE_BOTTOM
        
        If TBEdge=Edge
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=TBD\rc\Top-Size
          *APPBD\rc\Bottom=TBD\rc\Top
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=GetSystemMetrics_(#SM_CYSCREEN)-Size
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
    EndSelect
    
    SHAppBarMessage_(#ABM_SETPOS,*APPBD)
    
    ProcedureReturn *APPBD
  EndProcedure
  
  Procedure RemoveAPPBar(*APPBD.APPBARDATA)
    SHAppBarMessage_(#ABM_REMOVE,*APPBD)
    FreeMemory(*APPBD)
  EndProcedure
  
  Procedure APPBarX(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Left
  EndProcedure
  
  Procedure APPBarY(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Top
  EndProcedure
  
  Procedure APPBarWidth(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Right-*APPBD\rc\Left
  EndProcedure
  
  Procedure APPBarHeight(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Bottom-*APPBD\rc\Top
  EndProcedure
  
  *APPBD.APPBARDATA=CreateAPPBar(#ABE_TOP,40) ; AppBar am linken Rand erstellen
  X=APPBarX(*APPBD)
  Y=APPBarY(*APPBD)
  Width=APPBarWidth(*APPBD)
  Height=APPBarHeight(*APPBD)
  
  If OpenWindow(0,X,Y,Width,Height,"Window",#PB_Window_BorderLess)
    ButtonImageGadget(2,10,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(3,80,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(4,160,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(5,230,0,60,30,LoadIcon_(0,103))
    
    SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
    
    Repeat
      EventID=WaitWindowEvent()
      If EventID=#PB_Event_Gadget
        Select EventGadget()
            
          Case 2
            ResizeWindow(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,60)
            
          Case 5
            EventID = #PB_Event_CloseWindow
        EndSelect
      EndIf
      If EventID = #PB_Event_CloseWindow
        RemoveAPPBar(*APPBD) ; AppBar entfernen
        End
      EndIf
    ForEver
  EndIf
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von Bisonte »

Versuche es doch mal mit

https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Eventuell klappt das ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von N00B »

Danke für den Tip aber das hab ich schon gestern probiert gehabt :)
und bin nicht weitergekommen.

Da ich den AppBar Code nicht wirklich kapiere (Pointer, Structuren ausserhalb von Linked Lists, und die WinApi benutz ich sehr selten d.H teils nur in sehr begrenztem Umfang für mich verständlich) aber ein Pointer zu APPBARDATA Structure gebraucht wird, der schon in der

CreateAPPBar(Edge,Size)

Funktion zusammen gebastelt wird, und weiter unten das

SHAppBarMessage_(#ABM_SETPOS,*APPBD)

schon vorkommt hab ich es mir leicht gemacht gehabt und einfach
die CreateAPPBar(Edge,Size) Procedure modifiziert gehabt, (Nur einen Parameter mehr hinzugefügt und ein eine IF bla Abfrage, und halt Size 40 statt 20) so das nicht

SHAppBarMessage_(#ABM_NEW,*APPBD)

ausgeführt wird, leider wird dort trotzdem eine neue AppBar über der alten erstellt, wenn ich

CreateAPPBar(#ABE_Top,40,0) aufrufe.

Code: Alles auswählen

  ;Autor: Stefan
  
  EnableExplicit
  
  Define Event, EventType
  Define *APPBD.APPBARDATA
  Define X
  Define Y
  Define Width
  Define Height
  
  Procedure CreateAPPBar(Edge,Size,bla); unterstützt #ABE_LEFT,#ABE_RIGHT,#ABE_TOP,#ABE_BOTTOM für Edge
    Protected *APPBD.APPBARDATA=AllocateMemory(SizeOf(APPBARDATA))
    Protected TBD.APPBARDATA
    SHAppBarMessage_(#ABM_GETTASKBARPOS,TBD)
    Protected TBEdge=TBD\uEdge
    
    If bla
      SHAppBarMessage_(#ABM_NEW,*APPBD) 
    EndIf
    
    *APPBD\uEdge=Edge
    
    Select Edge
      Case #ABE_LEFT
        
        If TBEdge=Edge
          *APPBD\rc\Left=TBD\rc\Right
          *APPBD\rc\Right=TBD\rc\Right+Size
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=Size
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
        
      Case #ABE_RIGHT
        
        If TBEdge=Edge
          *APPBD\rc\Left=TBD\rc\Left-Size
          *APPBD\rc\Right=TBD\rc\Left
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        Else
          *APPBD\rc\Left=GetSystemMetrics_(#SM_CXSCREEN)-Size
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
        
      Case #ABE_TOP
        
        If TBEdge=Edge
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=TBD\rc\Bottom
          *APPBD\rc\Bottom=TBD\rc\Bottom+Size
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=Size
        EndIf
        
      Case #ABE_BOTTOM
        
        If TBEdge=Edge
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=TBD\rc\Top-Size
          *APPBD\rc\Bottom=TBD\rc\Top
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=GetSystemMetrics_(#SM_CYSCREEN)-Size
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
    EndSelect
    
    SHAppBarMessage_(#ABM_SETPOS,*APPBD)
    
    ProcedureReturn *APPBD
  EndProcedure
  
  Procedure RemoveAPPBar(*APPBD.APPBARDATA)
    SHAppBarMessage_(#ABM_REMOVE,*APPBD)
    FreeMemory(*APPBD)
  EndProcedure
  
  Procedure APPBarX(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Left
  EndProcedure
  
  Procedure APPBarY(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Top
  EndProcedure
  
  Procedure APPBarWidth(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Right-*APPBD\rc\Left
  EndProcedure
  
  Procedure APPBarHeight(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Bottom-*APPBD\rc\Top
  EndProcedure
  
  *APPBD.APPBARDATA=CreateAPPBar(#ABE_TOP,40,1) ; AppBar am linken Rand erstellen
  X=APPBarX(*APPBD)
  Y=APPBarY(*APPBD)
  Width=APPBarWidth(*APPBD)
  Height=APPBarHeight(*APPBD)
  
  If OpenWindow(0,X,Y,Width,Height,"Window",#PB_Window_BorderLess)
    ButtonImageGadget(2,10,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(3,80,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(4,160,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(5,230,0,60,30,LoadIcon_(0,103))
    
    SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
    
    Repeat
      
      Event=WaitWindowEvent()
      
      If Event = #PB_Event_Gadget
        
        Event = EventGadget() : EventType = EventType()
        
        If Event = 2 And EventType = #PB_EventType_LeftClick
          CreateAPPBar(#ABE_TOP,60,0) 
        EndIf
        
        If Event = 5 And EventType = #PB_EventType_LeftClick
          Event = #PB_Event_CloseWindow
        EndIf
        
      EndIf
      
      If Event = #PB_Event_CloseWindow
        RemoveAPPBar(*APPBD) ; AppBar entfernen
        End
      EndIf
      
    ForEver
    
  EndIf
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von Bisonte »

Ich verstand es so, dass man "in der Struktur APPBARDATA" die Werte des RECT ändert und dann die Message abschickt.
Wenn ich an einen PC komme, versuch ich das mal ...

Edit :

Nun hab ich da mal was ersetzt. Und zwar die Reaktion in der EventLoop auf den Button 2 :

Code: Alles auswählen

          Case 2
            *APPBD\rc\bottom = 60
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,*APPBD\rc\right,*APPBD\rc\bottom, #SWP_SHOWWINDOW)
So funktioniert es unter W10 x64 also denke ich auf all den anderen Versionen auch.
Das ResizeWindow hab ich verschwinden lassen, weil SetWindowPos das gleiche macht ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von N00B »

Danke Bisonte, aber bei mir (XP 32Bit SP3) funzt das leider nicht :(

Sieht dann so aus.

Vor dem Case 2 Click

2015-12-19 -- 15-54-28.pngBild

Nach dem Click

2015-12-19 -- 15-54-32.pngBild

Ich hab danach mal VirtuaWin & den XP Style den ich über TuneUp 2007 laufen habe (benutzt im Gegensatz zu Windows Blinds die offizielle msstyles engine von Microsoft, hatte noch nie Probleme damit) ausgemacht, leider mit dem selben Ergebniss :(

EDIT: unter einem einglischen W7 64Bit Home Premium SP1 (läuft über VirtualBox) ist es das selbe.

2015-12-19 -- 16-52-58.pngBild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von Bisonte »

Ich sehe das du unter anderem JaPBe nutzt....

Mach dir doch mal den Spass und nehme die normale IDE und die aktuelle PB Version.

Ich testete es unter WinXP x86, 7 x86/x64 und eben 10x64.

Lief überall.

P.S. Ich habe das Listing im ersten Post benutzt....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von N00B »

Ich verstehe einfach nicht was da los ist.
Ich habs grade mit PB 5.31 (32 & 64 Bit) unter Windows 7 64 Bit und dem normalen PB Editor probiert, kein Unterschied :freak:

Hab auch immer den Code aus Listing 1 verwendet, und halt das was du geposted hast hinzugefügt, aber es ist immer das selbe. Ich hab auch kein TV Out Mirroring an oder so, hab
nichts an das irgendwie stören könnte...........ok ich hab ne uralte GeForce 6600gt drin, aber daran sollte es ja nicht liegen hoffe ich :mrgreen:

Was mir halt an dem Code aufgefallen ist, ist das nie der Fall

If TBEdge=Edge

vorkommt ! Ich weiss also nicht warum der drin ist, da sowieso nie der Fall vorkommt, aber vielleicht hat es ja was damit zu tun ? :freak:

es kommt immer nur das Zeugs nach dem Else

Code: Alles auswählen

  ;Autor: Stefan
  
  EnableExplicit
  
  Define EventID
  Define *APPBD.APPBARDATA
  Define X
  Define Y
  Define Width
  Define Height
  
  Procedure CreateAPPBar(Edge,Size); unterstützt #ABE_LEFT,#ABE_RIGHT,#ABE_TOP,#ABE_BOTTOM für Edge
    Protected *APPBD.APPBARDATA=AllocateMemory(SizeOf(APPBARDATA))
    Protected TBD.APPBARDATA
    SHAppBarMessage_(#ABM_GETTASKBARPOS,TBD)
    Protected TBEdge=TBD\uEdge
    
    SHAppBarMessage_(#ABM_NEW,*APPBD)
    
    *APPBD\uEdge=Edge
    
    Select Edge
      Case #ABE_LEFT
        
        If TBEdge=Edge
          *APPBD\rc\Left=TBD\rc\Right
          *APPBD\rc\Right=TBD\rc\Right+Size
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=Size
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
        
      Case #ABE_RIGHT
        
        If TBEdge=Edge
          *APPBD\rc\Left=TBD\rc\Left-Size
          *APPBD\rc\Right=TBD\rc\Left
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        Else
          *APPBD\rc\Left=GetSystemMetrics_(#SM_CXSCREEN)-Size
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
        
      Case #ABE_TOP
        
        If TBEdge=Edge
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=TBD\rc\Bottom
          *APPBD\rc\Bottom=TBD\rc\Bottom+Size
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=0
          *APPBD\rc\Bottom=Size
        EndIf
        
      Case #ABE_BOTTOM
        
        If TBEdge=Edge
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=TBD\rc\Top-Size
          *APPBD\rc\Bottom=TBD\rc\Top
        Else
          *APPBD\rc\Left=0
          *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
          *APPBD\rc\Top=GetSystemMetrics_(#SM_CYSCREEN)-Size
          *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
        EndIf
    EndSelect
    
    SHAppBarMessage_(#ABM_SETPOS,*APPBD)
    
    ProcedureReturn *APPBD
  EndProcedure
  
  Procedure RemoveAPPBar(*APPBD.APPBARDATA)
    SHAppBarMessage_(#ABM_REMOVE,*APPBD)
    FreeMemory(*APPBD)
  EndProcedure
  
  Procedure APPBarX(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Left
  EndProcedure
  
  Procedure APPBarY(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Top
  EndProcedure
  
  Procedure APPBarWidth(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Right-*APPBD\rc\Left
  EndProcedure
  
  Procedure APPBarHeight(*APPBD.APPBARDATA)
    ProcedureReturn *APPBD\rc\Bottom-*APPBD\rc\Top
  EndProcedure
  
  *APPBD.APPBARDATA=CreateAPPBar(#ABE_TOP,40) ; AppBar am linken Rand erstellen
  X=APPBarX(*APPBD)
  Y=APPBarY(*APPBD)
  Width=APPBarWidth(*APPBD)
  Height=APPBarHeight(*APPBD)
  
  If OpenWindow(0,X,Y,Width,Height,"Window",#PB_Window_BorderLess)
    ButtonImageGadget(2,10,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(3,80,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(4,160,0,60,30,LoadIcon_(0,100))
    ButtonImageGadget(5,230,0,60,30,LoadIcon_(0,103))
    
    SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
    
    Repeat
      EventID=WaitWindowEvent()
      If EventID=#PB_Event_Gadget
        Select EventGadget()
            
          Case 2
            *APPBD\rc\Bottom = 60
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,*APPBD\rc\Right,*APPBD\rc\Bottom, #SWP_SHOWWINDOW) 
          Case 5
            EventID = #PB_Event_CloseWindow
        EndSelect
      EndIf
      If EventID = #PB_Event_CloseWindow
        RemoveAPPBar(*APPBD) ; AppBar entfernen
        End
      EndIf
    ForEver
  EndIf
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von Bisonte »

Das

Code: Alles auswählen

If TBEdge=Edge
ist schon richtig da....

Es prüft nach, ob die Taskbar von Windows an der Stelle sitzt, an der du deine "AppBar" haben willst.

Irgendetwas ist an deinem System anders, als an den drei verschiedenen Rechnern (eigentlich sogar 4), an
denen ich das probiert habe.

Systemtuning Tools ? Über den Sinn oder Unsinn solcher, lässt sich streiten, meistens sind diese es aber, die "normales"
Verhalten nicht zulassen.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Re: Arbeitsbereich Ausrichtung nach AppBar größen Änderung

Beitrag von N00B »

Bisonte hat geschrieben:Das

Code: Alles auswählen

If TBEdge=Edge
ist schon richtig da....

Es prüft nach, ob die Taskbar von Windows an der Stelle sitzt, an der du deine "AppBar" haben willst.

Irgendetwas ist an deinem System anders, als an den drei verschiedenen Rechnern (eigentlich sogar 4), an
denen ich das probiert habe.

Systemtuning Tools ? Über den Sinn oder Unsinn solcher, lässt sich streiten, meistens sind diese es aber, die "normales"
Verhalten nicht zulassen.
Jetzt kapiere ich gar nichts mehr :freak: :freak: :freak: :freak:

Es funktioniert jetzt unter merkwürdigen Umständen.

Wenn ich es so mache

Code: Alles auswählen

          Case 2
            *APPBD\rc\Bottom = 60  
            
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            MessageRequester("","",#MB_OK)
            ResizeWindow(0,0,0,1024,60)
            ;SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,*APPBD\rc\Right,*APPBD\rc\Bottom, #SWP_SHOWWINDOW)   


oder so

Code: Alles auswählen

          Case 2
            *APPBD\rc\Bottom = 60  
            
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            MessageRequester("","",#MB_OK)
            ;ResizeWindow(0,0,0,1024,60)
            SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,*APPBD\rc\Right,*APPBD\rc\Bottom, #SWP_SHOWWINDOW)   
ohne den Message Requester dazwischen geht es mit diesen Codes nicht.

Code: Alles auswählen

          Case 2
            *APPBD\rc\Bottom = 60  
            
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            ;ResizeWindow(0,0,0,1024,60)
            SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,*APPBD\rc\Right,*APPBD\rc\Bottom, #SWP_SHOWWINDOW)   

Code: Alles auswählen

          Case 2
            *APPBD\rc\Bottom = 60  
            
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            ResizeWindow(0,0,0,1024,60)
            ;SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,*APPBD\rc\Right,*APPBD\rc\Bottom, #SWP_SHOWWINDOW)   
es wird der Arbeitsbereich bei Y 60 Pixel angeordnett, und das Fenster/AppBar behält seine alte Höhe (40) und landet an Position Y 60.............aber wenn ich den Case 2 Button Gadget danach noch mal anklicke, und den Code damit noch mal ausführen lasse, funzt es auf einmal.

Ich hab einen Test gemacht......

Code: Alles auswählen

          Case 2
            *APPBD\rc\Bottom = 60  
            
            SHAppBarMessage_(#ABM_SETPOS, *APPBD)
            ResizeWindow(0,0,0,1024,60) 
            If WindowY(0) = 0
              MessageRequester("",",,",#MB_OK) 
            Else
              Repeat
                ResizeWindow(0,0,0,1024,60)  
                Delay(1)
              Until WindowY(0) = 0
            EndIf 
Und es kommt direkt der Message Requester, weil Windows glaubt (springt nicht in die Repeat Schleife) das Fenster/Appbar währe an Position Y0 nach dem ResizeWindow/SetWindowPos_ Befehl, und dann hab ich wieder das Problem wie oben also
Arbeitsbereich bei Y 60, Fenster/AppBar auch bei Y60, und Fenster/AppBar Höhe immer noch 40. ausser ich klatsche noch ein ResizeWindow(0,0,0,1024,60) unterhalb vom EndIf
dann ist alles so wie es ist.

Geht vielleicht das Fenster Handle verloren ? :freak:

EDIT:

Ok ich hab endlich eine Lösung gefunden <) (jetzt kann ich endlich nach gefühlten 2239834 Tagen an meiner AppBar die zu 70% schon fertig gestellt war, weiterschreiben) weis aber nicht warum es dort so geht !

Code: Alles auswählen

  Procedure somefunction(bla)
    *APPBD\rc\Bottom = 60  
    SHAppBarMessage_(#ABM_SETPOS, *APPBD)
    ResizeWindow(0,0,0,1024,60)
    
  EndProcedure

....
...
          Case 2
            
            CreateThread(@somefunction(),0)
...
...
Es dauert ca 700ms bis nach dem der Arbeitsbereich verschoben wurde, das Fenster/AppBar an Position Y0 landet mit einer Höhe von 60
Antworten