Rubrik: Oberfläche · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 31.08.01 |
Erstellen einer eigenen Application-Bar Eine Form - ein paar API-Funktionen - und schon lässt sich eine eigene AppBar (ähnlich der Taskbar) erstellen. | ||
Autor: Thomas Bannert | Bewertung: | Views: 33.843 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Eine Form - ein paar API-Funktionen - und schon lässt sich eine eigene Application-Bar (ähnlich der Windows-Taskbar) erstellen.
Die AppBar kann hierbei oben, unten, links oder rechts ausgerichtet werden. Der für die AppBar benötigte Bildschirmbereich wird hierbei automatisch von den gestarteten Anwendungen berücksichtigt, so dass die AppBar niemals durch eine offene Anwendung verdeckt werden kann!
Wie lässt sich das nun realisieren?
Benötigt wird hierzu die nette API Funktion "SHAppBarMessage" der Shell32Lib. Damit kann eine Application-Bar erstellt werden, die alles hat was man braucht.
Vorbereitung:
- Den unten aufgeführten Code in ein neues Modul kopieren (basAppBar.bas).
- Ein Form anlegen mit dem Namen frmAppBar
- Auf dieser Form in der linken oberen Ecke ein Picture-Steuerelement (fraBack) plazieren, welches die Mindesthöhe bzw. -breite der AppBar vorgibt.
- Einen Button (z.B. cmdExit) irgendwo im oberen Bereich der Forms plazieren, welcher die Funktion UnloadAppBar aufruft. (WICHTIG!!!)
- Das Startobjekt des Projektes auf "Sub Main" stellen.
- Mit F5 starten und schauen was passiert...
Und hier der Code für das Modul "basAppBar.bas"
Option Explicit ' API Deklarationen Private Declare Function SHAppBarMessage Lib "shell32.dll" ( _ ByVal dwMessage As Long, _ pData As APPBARDATA) As Long Private Declare Function SetWindowPos Lib "user32" ( _ ByVal hWnd As Long, _ ByVal hwndInsertAfter As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal cx As Long, _ ByVal cy As Long, _ ByVal wFlags As Long) As Long ' Types für die API Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type APPBARDATA cbSize As Long hWnd As Long uCallbackMessage As Long uEdge As Long rc As RECT lParam As Long End Type ' Konstanten für die API Private Const HWND_TOPMOST = -1 Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 Private Const SWP_SHOWWINDOW = &H40 Private Const ABM_NEW = &H0 Private Const ABM_REMOVE = &H1 Private Const ABM_SETPOS = &H3 Private Const ABM_GETTASKBARPOS = &H5 Public Const ABE_LEFT = &H0 Public Const ABE_TOP = &H1 Public Const ABE_RIGHT = &H2 Public Const ABE_BOTTOM = &H3 ' Enum der Docking Positionen Public Enum AppBarPos BarLeft = 0 BarTop = 1 BarRight = 2 BarBottom = 3 End Enum ' Anwendungsvariablen Public frmAppForm As Form Public bDocked As Boolean Private lBorder As Long ' AppBar Informationen Private APD As APPBARDATA Public lDockMode As Long Public lXTwips As Long Public lYTwips As Long ' Application-Bar erstellen und ausrichten Public Sub LoadAppBar(AppForm As Form, _ Position As AppBarPos) Dim WTBPos As APPBARDATA Dim lTop, lBottom As Long Dim lLeft, lRight As Long Dim lWidth, lHeight As Long ' minimale Höhe oder Breite der Bar in Pixel Dim lMinSize As Long lDockMode = Position Set frmAppForm = AppForm bDocked = True ' Neue AppBar anlegen Call SHAppBarMessage(ABM_NEW, APD) ' Je nach Position die Variablen füllen Select Case lDockMode Case ABE_LEFT lMinSize = frmAppForm.fraBack.Width / lYTwips lLeft = 0 lTop = 0 lRight = lMinSize + lBorder lBottom = Screen.Height lWidth = lMinSize * lXTwips lHeight = Screen.Height Case ABE_TOP lMinSize = frmAppForm.fraBack.Height / lXTwips lLeft = 0 lTop = 0 lRight = Screen.Width / lXTwips lBottom = lMinSize + lBorder lWidth = Screen.Width lHeight = lMinSize * lYTwips Case ABE_RIGHT lMinSize = frmAppForm.fraBack.Width / lYTwips lLeft = Screen.Width / lXTwips - lMinSize - lBorder lTop = 0 lRight = Screen.Width / lXTwips lBottom = lMinSize + lBorder lWidth = lMinSize * lXTwips lHeight = Screen.Height Case ABE_BOTTOM lMinSize = frmAppForm.fraBack.Height / lXTwips lLeft = 0 lTop = Screen.Height / lXTwips - lMinSize - lBorder lRight = Screen.Width / lXTwips lBottom = Screen.Height / lXTwips lWidth = Screen.Width lHeight = (lBottom - lTop) * lYTwips End Select ' -------------------------------------------------- ' Nun noch die Windows Taskbar berücksichtigen Call SHAppBarMessage(ABM_GETTASKBARPOS, WTBPos) With WTBPos ' ------------------------------------------------ ' Taskbar unten If .uEdge = ABE_BOTTOM And lDockMode = ABE_BOTTOM Then lTop = .rc.Top - lMinSize - lBorder lBottom = .rc.Bottom ElseIf .uEdge = ABE_BOTTOM And _ (lDockMode = ABE_LEFT Or lDockMode = ABE_RIGHT) Then lHeight = .rc.Top * lYTwips ' ------------------------------------------------ ' Taskbar oben ElseIf .uEdge = ABE_TOP And lDockMode = ABE_TOP Then lTop = .rc.Bottom lBottom = lTop + lMinSize ElseIf .uEdge = ABE_TOP And _ (lDockMode = ABE_LEFT Or lDockMode = ABE_RIGHT) Then lTop = .rc.Bottom lHeight = Screen.Height - .rc.Bottom * lYTwips ' ------------------------------------------------ ' Taskbar links ElseIf .uEdge = ABE_LEFT And lDockMode = ABE_LEFT Then lLeft = .rc.Right ElseIf .uEdge = ABE_LEFT And _ (lDockMode = ABE_TOP Or lDockMode = ABE_BOTTOM) Then lLeft = .rc.Right lWidth = Screen.Width - .rc.Right * lYTwips ' ------------------------------------------------ ' Taskbar rechts ElseIf .uEdge = ABE_RIGHT And lDockMode = ABE_RIGHT Then lLeft = .rc.Left - lMinSize ElseIf .uEdge = ABE_RIGHT And _ (lDockMode = ABE_TOP Or lDockMode = ABE_BOTTOM) Then lWidth = .rc.Left * lYTwips End If End With ' AppData Objekt für die ApplicationBar füllen With APD .uEdge = lDockMode .rc.Top = lTop .rc.Left = lLeft .rc.Right = lRight .rc.Bottom = lBottom End With ' AppBar mit den neuen Werten füllen Call SHAppBarMessage(ABM_SETPOS, APD) ' Nun das Form an die Position der AppBar bringen DoEvents With frmAppForm .Show Call SetWindowPos(.hWnd, HWND_TOPMOST, 0, 0, 0, 0, _ SWP_SHOWWINDOW) .Top = lTop * lXTwips .Left = lLeft * lYTwips .Width = lWidth .Height = lHeight End With End Sub ' ApplicationBar entfernen Public Sub UnloadAppBar() If bDocked Then Call SHAppBarMessage(ABM_REMOVE, APD) bDocked = False End Sub
Und hier die Start-Prozedur
Diese können Sie entweder in ein eigenes Modul setzen oder aber auch in das obige Modul.
' START-Prozedur: ' Hier wird die Form "frmAppBar" geladen und angezeigt. ' Über den zweiten Parameter der "LoadAppBar" - Prozedur ' legen Sie fest, wie die AppBar ausgerichtet werden ' soll: ' ' BerLeft: am linken Bildschirmrand anzeigen ' BarRight: am rechten Bildschirmrand anzeigen ' BarTop: am oberen Bildschirmrand anzeigen ' BarBottom: am unteren Bildschirmrand anzeigen Sub Main() lXTwips = Screen.TwipsPerPixelX lYTwips = Screen.TwipsPerPixelY lBorder = 0 LoadAppBar frmAppBar, BarTop End Sub
Die Prozedur Sub Main zeigt die Application-Bar nun an. Um die Application-Bar wieder zu entfernen, ist es äussert wichtig, die Prozedur UnloadAppBar aufzurufen, da sonst der durch die AppBar belegte Bildschirmbereich nicht wieder freigegeben wird!
Wenn Sie also auf die Form frmAppBar einen Button cmdExit plaziert haben, so sollte folgender Code ausgeführt werden, um die AppBar zu entfernen und die Anwendung zu beenden:
' AppBar entfernen und Anwendung beenden Private Sub cmdExit_Click() UnloadAppBar Unload Me End End Sub