Private Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, ByVal pData As APPBARDATA) As Long Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long <#Module=Module1> Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Type APPBARDATA cbSize As Long ' Размер структуры hwnd As Long ' Дескриптор окна uCallbackMessage As Long ' Сообщение получаемое окном при изминении панелей uEdge As Long ' Флаги rc As RECT ' Структура RECT lParam As Long ' Дополнительные параметры End Type Const ABE_LEFT = 0 Const ABE_TOP = 1 Const ABE_RIGHT = 2 Const ABE_BOTTOM = 3 Const ABM_ACTIVATE = &H6 Const ABM_GETAUTOHIDEBAR = &H7 Const ABM_GETSTATE = &H4 Const ABM_GETTASKBARPOS = &H5 Const ABM_NEW = &H0 Const ABM_QUERYPOS = &H2 Const ABM_REMOVE = &H1 Const ABM_SETAUTOHIDEBAR = &H8 Const ABM_SETPOS = &H3 Const ABM_WINDOWPOSCHANGED = &H9 Const ABN_FULLSCREENAPP = &H2 Const ABN_POSCHANGED = &H1 Const ABN_STATECHANGE = &H0 Const ABN_WINDOWARRANGE = &H3 Const WM_ACTIVATE = &H6 Const WM_WINDOWPOSCHANGED = &H47 Const MY_PANEL_MESSAGE = 123 Dim AppBar As APPBARDATA Dim m_dockmode Sub Load(cmdLine) m_dockmode = ABE_TOP Form1.ScaleMode = 3 Form1.Caption = "Decktop_PanelBar" Form1.Add "LCombo", 1 Form1.LCombo(1).Move 2, 2, 100 Form1.LCombo(1).AddItem "Left" Form1.LCombo(1).AddItem "Top" Form1.LCombo(1).AddItem "Right" Form1.LCombo(1).AddItem "Bottom" Form1.LCombo(1).ListIndex = 1 Form1.Add "Command", 1 Form1.Command(1).Caption = "Закрыть" Form1.NoMoveMouse = True Form1.Style.TitleBar = False Form1.Style.TaskBar = False AppBar.cbSize = LenType(AppBar) AppBar.hwnd = Form1.hWnd AppBar.uCallbackMessage = MY_PANEL_MESSAGE PanelAdd() PanelDocking(ABE_TOP) ShowWindow Form1.hWnd, 5 End Sub Public Function PanelDocking(dockmode) m_dockmode = dockmode ' Запрашиваем свободное место на десктопе AppBar.rc.Top = 0 AppBar.rc.Left = 0 AppBar.rc.Right = Sys.Screen.Width / vbPX AppBar.rc.Bottom = Sys.Screen.Height / vbPY AppBar.uEdge = dockmode Call SHAppBarMessage(ABM_QUERYPOS, AppBar) Select Case dockmode Case ABE_LEFT AppBar.rc.Right = AppBar.rc.Left + 105 ' New Form Size (Form1.Width / vbPX) Case ABE_TOP AppBar.rc.Bottom = AppBar.rc.Top + 30 ' New Form Size (Form1.Height / vbPY) Case ABE_RIGHT AppBar.rc.Left = AppBar.rc.Right - 105 ' New Form Size (Form1.Width / vbPX) Case ABE_BOTTOM AppBar.rc.Top = AppBar.rc.Bottom - 30 ' New Form Size (Form1.Height / vbPY) End Select Call SHAppBarMessage(ABM_SETPOS, AppBar) DoEvents DoEvents Form1.Top = AppBar.rc.Top * vbPY Form1.Left = AppBar.rc.Left * vbPX Form1.Width = (AppBar.rc.Right - AppBar.rc.left) * vbPX Form1.Height = (AppBar.rc.Bottom - AppBar.rc.top) * vbPY End Function Function PanelAdd() PanelAdd = SHAppBarMessage(ABM_NEW, AppBar) End Function Function PanelRemove() PanelRemove = SHAppBarMessage(ABM_REMOVE, AppBar) End Function <#Module> <#Form=Form1> Function WindowProc(bHandled, hWnd, uMsg, wParam, lParam, dwRefData) Select Case uMsg Case MY_PANEL_MESSAGE Select Case wParam Case ABN_POSCHANGED, ABN_STATECHANGE Call PanelDocking(m_dockmode) End Select Case WM_WINDOWPOSCHANGED Call SHAppBarMessage(ABM_WINDOWPOSCHANGED, AppBar) Case WM_ACTIVATE Call SHAppBarMessage(ABM_ACTIVATE, AppBar) End Select End Function Sub LCombo1_Click() Select Case Form1.LCombo(1).Text Case "Left" PanelDocking(ABE_LEFT) Case "Top" PanelDocking(ABE_TOP) Case "Right" PanelDocking(ABE_RIGHT) Case "Bottom" PanelDocking(ABE_BOTTOM) End Select End Sub Sub Form_Load() Form1.subclass.List(MY_PANEL_MESSAGE, WM_ACTIVATE, WM_WINDOWPOSCHANGED) = 1 End Sub Sub Form_Resize() On Error Resume Next Select Case m_dockmode Case ABE_LEFT, ABE_RIGHT Form1.Command(1).Move 2, Form1.Height / vbPY - 22, 100, 20 Case ABE_TOP, ABE_BOTTOM Form1.Command(1).Move Form1.Width / vbPX - 102, 2, 100, 20 End Select End Sub Sub Command1_Click() Form_UnLoad End Sub Sub Form_UnLoad() PanelRemove() endmf End Sub <#Form>