Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0335: Grafische Buttons nutzen

 von 

Beschreibung 

Ein unkonventionelles aber konsequentes Beispiel von Hirf, zum Thema grafische Schaltflächen, Option-Buttons und Checkboxen. Dies ist seine offizielle Abschlußarbeit im Leistungskurs Informatik ;-)

Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetWindowLongA (GetWindowLong), LoadImageA (LoadImage), SendMessageA (SendMessage), SetWindowLongA (SetWindowLong)

Download:

Download des Beispielprojektes [16,84 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (MSCOMCTL.OCX)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Optionsfeld-Steuerelement "Option1" auf Frame1
' Steuerelement: Optionsfeld-Steuerelement "Option2" auf Frame1
' Steuerelement: Schaltfläche "Command1" auf Frame1
' Steuerelement: Schaltfläche "Command4"
' Steuerelement: Bilderlistenelement "ImageList1"
' Steuerelement: Rahmensteuerelement "Frame2"
' Steuerelement: Kontrollkästchen-Steuerelement "Check1" auf Frame2
' Steuerelement: Schaltfläche "Command3" auf Frame2
' Steuerelement: Schaltfläche "Command2" auf Frame2
' Steuerelement: Anzeige-Steuerelement "Image1"
' Steuerelement: Anzeige-Steuerelement "Image3"
' Steuerelement: Anzeige-Steuerelement "Image2"
' Steuerelement: Anzeige-Steuerelement "Image4"

Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias _
        "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As _
        Long, ByVal dwNewLong As Long) As Long
        
Private Declare Function GetWindowLong Lib "user32" Alias _
        "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As _
        Long) As Long


Private Declare Function SendMessage Lib "user32" Alias _
        "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As Any) As Long

Private Declare Function LoadImage Lib "user32" Alias _
        "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, _
        ByVal iImageType As Long, ByVal cx As Long, ByVal cy As _
        Long, ByVal fFlags As Long) As Long

Const GWL_STYLE As Long = -16&

Const BM_SETIMAGE As Long = &HF7&

Const IMAGE_BITMAP As Long = 0&
Const IMAGE_ICON As Long = 1&

Const BS_ICON As Long = &H40&
Const BS_BITMAP As Long = &H80&
Const BS_RIGHT As Long = &H200&
Const BS_CENTER As Long = &H300&
Const BS_TOP As Long = &H400&

Const LR_DEFAULTCOLOR As Long = &H0&
Const LR_LOADFROMFILE As Long = &H10&
Const LR_DEFAULTSIZE As Long = &H40&

Private Sub Form_Load()
    Dim n As Long
    Dim m_hbmSave As Long
    Dim m_hbmSettings As Long
    Dim m_hbmIcon As Long
    Dim m_hbmGerman As Long
    Dim m_hbmFrench As Long
    Dim m_hbmInstall As Long
    Dim m_hbmFrame As Long
    Dim m_hbmQuit As Long
    Dim lReturn As Long
    
    n = GetWindowLong(Frame1.hwnd, GWL_STYLE)
    n = n Or BS_CENTER
    SetWindowLong Frame1.hwnd, GWL_STYLE, n
    Frame1.Refresh
    
    'Grafiken aus Res
    If Compiled = True Then
        n = GetWindowLong(Command2.hwnd, GWL_STYLE)
        n = n Or BS_ICON
        SetWindowLong Command2.hwnd, GWL_STYLE, n
        Command2.Refresh
        
        n = GetWindowLong(Frame2.hwnd, GWL_STYLE)
        n = n Or BS_BITMAP Or BS_CENTER
        SetWindowLong Frame2.hwnd, GWL_STYLE, n
        Frame2.Refresh
    End If
    
    ' Andere Grafikquellen
    ' CommandButtons
    n = GetWindowLong(Command4.hwnd, GWL_STYLE)
    n = n Or BS_BITMAP
    SetWindowLong Command4.hwnd, GWL_STYLE, n
    Command4.Refresh
    
    n = GetWindowLong(Command3.hwnd, GWL_STYLE)
    n = n Or BS_BITMAP
    SetWindowLong Command3.hwnd, GWL_STYLE, n
    Command3.Refresh
    
    n = GetWindowLong(Command1.hwnd, GWL_STYLE)
    n = n Or BS_ICON
    SetWindowLong Command1.hwnd, GWL_STYLE, n
    Command1.Refresh
    
    ' OptionButtons
    n = GetWindowLong(Option1.hwnd, GWL_STYLE)
    n = n Or BS_ICON Or BS_TOP Or BS_RIGHT
    SetWindowLong Option1.hwnd, GWL_STYLE, n
    Option1.Refresh
    
    n = GetWindowLong(Option2.hwnd, GWL_STYLE)
    n = n Or BS_ICON Or BS_TOP Or BS_RIGHT
    SetWindowLong Option2.hwnd, GWL_STYLE, n
    Option2.Refresh
    
    ' CheckBoxen
    n = GetWindowLong(Check1.hwnd, GWL_STYLE)
    n = n Or BS_BITMAP
    Call SetWindowLong(Check1.hwnd, GWL_STYLE, n)
    Check1.Refresh

    If Compiled = True Then
        ' Grafiken aus Res
        m_hbmIcon = LoadResPicture(200, vbResIcon)
        
        ' Laden von Bitmaps aus einer Ressourcendatei und zuweisen
        ' in eine Variable bringt Probleme, sie müssen zuerst der
        ' Picture-Eigenschaft eines Steuerelements zugewiesen werden.
        Image1.Picture = LoadResPicture(100, vbResBitmap)
        m_hbmFrame = Image1.Picture
        
        Call SendMessage(Command2.hwnd, BM_SETIMAGE, IMAGE_ICON, _
                         ByVal m_hbmIcon)
                         
        Call SendMessage(Frame2.hwnd, BM_SETIMAGE, IMAGE_BITMAP, _
                         ByVal m_hbmFrame)
    End If
    
    m_hbmQuit = LoadImage(0&, App.Path & "\Quit.bmp", IMAGE_BITMAP, _
                          0, 0, LR_DEFAULTSIZE Or LR_DEFAULTCOLOR _
                          Or LR_LOADFROMFILE)
                          
    m_hbmSave = Image4.Picture
    m_hbmInstall = Command1.Picture
    m_hbmGerman = Image2.Picture
    m_hbmFrench = Image3.Picture
    m_hbmSettings = ImageList1.ListImages(1).Picture
    
    ' Andere Grafikquellen
    Call SendMessage(Command1.hwnd, BM_SETIMAGE, IMAGE_ICON, _
                     ByVal m_hbmInstall)
                     
    Call SendMessage(Command3.hwnd, BM_SETIMAGE, IMAGE_BITMAP, _
                     ByVal m_hbmSave)
                     
    Call SendMessage(Command4.hwnd, BM_SETIMAGE, IMAGE_BITMAP, _
                     ByVal m_hbmQuit)
                     
    Call SendMessage(Option1.hwnd, BM_SETIMAGE, IMAGE_ICON, _
                     ByVal m_hbmGerman)
                     
    Call SendMessage(Option2.hwnd, BM_SETIMAGE, IMAGE_ICON, _
                     ByVal m_hbmFrench)
                     
    Call SendMessage(Check1.hwnd, BM_SETIMAGE, IMAGE_BITMAP, _
                     ByVal m_hbmSettings)
    
    ' Anzeigen
    Me.Show
    
    If Compiled = False Then
        MsgBox "Die Grafiken, die aus der Ressourcendatei " & _
                "geladen werden, können beim Ausführen in " & _
                "der Entwicklungsumgebung nicht geladen " & _
                "werden.", 48, App.Title
    End If
End Sub

Private Sub Check1_Click()
    'Das Deaktivieren von Steuerelementen mit Bitmap-Grafiken
    'verursacht Probleme wegen der "transparenten" Hintergrund-
    'farbe (auch GIFs). Icons funktionieren.
    
    Option1.Enabled = Check1.Value
    Option2.Enabled = Check1.Value
    Command1.Enabled = Check1.Value
End Sub

Private Sub Command4_Click()
    Unload Me
End Sub

Private Function Compiled() As Boolean
    On Error Goto NotCompiled
    
    Debug.Print 1 / 0
    Compiled = True
    
NotCompiled:
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Andy am 17.04.2002 um 22:22

Hallo,
ich suche ein Tool, Add-In mit dem ich eine grafik zeichnen kann, darauf buttons definieren, und mit VB dann benutzen kann. Vielen Dank

Kommentar von Manuel Wiedner am 31.08.2001 um 12:53

Wollte nur meine Lösung zu eigenen Buttons angeben: Button zeichnen (Bitmap oder Shape), Text drüber, darüber dann ein image-objekt ohne bild (absolut unsichtbar) und das per image_click() aktivieren.