Keep AppBar in Position
Posted: Tue Dec 22, 2020 11:38 pm
				
				Hello,
I'm using the code floating, around somewhere here, which is used to create an AppBar under Windows. Unfortunately if I change my resolution the AppBar is moved and not sticked to side anymore. How can I make sure that it's still on the side? I have created a callback to process #WM_DISPLAYCHANGE. Also, destroying and recreating the AppBar doesn't work, the AppBar is still in moved position. Plus after some time the window in the AppBar moves to the outside area, which may be caused by resolution changing.
			I'm using the code floating, around somewhere here, which is used to create an AppBar under Windows. Unfortunately if I change my resolution the AppBar is moved and not sticked to side anymore. How can I make sure that it's still on the side? I have created a callback to process #WM_DISPLAYCHANGE. Also, destroying and recreating the AppBar doesn't work, the AppBar is still in moved position. Plus after some time the window in the AppBar moves to the outside area, which may be caused by resolution changing.
Code: Select all
Global *APPBD.APPBARDATA,X,Y,Width,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
 
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  If uMsg=#WM_DISPLAYCHANGE
    ;replace AppBar
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
*APPBD.APPBARDATA=CreateAPPBar(#ABE_RIGHT,172)
X=APPBarX(*APPBD)
Y=APPBarY(*APPBD)
Width=APPBarWidth(*APPBD)
Height=APPBarHeight(*APPBD)
Window_0=OpenWindow(#PB_Any, x, y, width, height, "My Window", #PB_Window_BorderLess,WindowID(OpenWindow(#PB_Any,0,0,0,0,"",#PB_Window_Invisible)))
StickyWindow(window_0,#True)
 
SetWindowCallback(@WinCallback())
Define event
Repeat
  event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow
RemoveAPPBar(*APPBD) ;AppBar entfernen
This e-mail and any attachment is confidential and may be legally privileged or otherwise protected from disclosure. If you are not the intended recipient, please notify the sender immediately by returning this e-mail.
Neways Electronics NV is not responsible for the improper or incomplete transmission of any e-mail, or for any delay in its receipt.