Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0279: Arbeiten mit dem ImageList-Control

 von 

Beschreibung 

Das ImageList-Control dient in erster Linie als Puffer für eine Auswahl gleichgroßer Bitmaps oder Icons. Darüberhinaus stellt es die Basis für die grafische Belebung von ListViews, TreeViews und ToolBars. Hier wird seine Handhabung kurz erklärt und als kleines Extra gezeigt wie weitere, von VB nicht unterstützte, Methoden dieses Controls nutzbar zu machen sind. Dazu gehört vorallem die einfache Maskengenerierung und Kombination verschiedener Stile.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

ImageList_Draw

Download:

Download des Beispielprojektes [14,69 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 5.0 (SP2) (comctl32.ocx)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Bildfeld-Steuerelement "Picture1"
' Steuerelement: Textfeld "Text1" auf Picture1
' Steuerelement: Bildfeld-Steuerelement "Picture2" (Index von 0 bis 9) auf Picture1
' Steuerelement: Beschriftungsfeld "Label1" (Index von 0 bis 9) auf Picture1
' Steuerelement: Schaltfläche "Command3"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Bildfeld-Steuerelement "Picture3"
' Steuerelement: Beschriftungsfeld "Label8" auf Picture3
' Steuerelement: Beschriftungsfeld "Label3" auf Picture3
' Steuerelement: Beschriftungsfeld "Label4" auf Picture3
' Steuerelement: Beschriftungsfeld "Label5" auf Picture3
' Steuerelement: Beschriftungsfeld "Label6" auf Picture3
' Steuerelement: Kontrollkästchen-Steuerelement "Check1"
' Steuerelement: Bilderliste "ImageList1"
' Steuerelement: Beschriftungsfeld "Label9"
' Steuerelement: Anzeige-Steuerelement "Image2"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Anzeige-Steuerelement "Image1"
' Steuerelement: Beschriftungsfeld "Label7"

Option Explicit

Private Declare Function ImageList_Draw Lib "comctl32.dll" ( _
        ByVal hIml As Long, ByVal nIndex As Long, ByVal hDCDest _
        As Long, ByVal xDest As Long, ByVal yDest As Long, _
        ByVal idlFlags As Long) As Long

Const ILD_MASK = &H10
Const ILD_TRANSPARENT = &H1
Const ILD_SELECTED = &H4
Const ILD_FOCUS = &H4
Const ILD_NORMAL = &H0
Const ILD_BLEND = &H1
Const ILD_BLEND25 = &H2
Const ILD_BLEND50 = &H4
Const ILD_IMAGE = &H20
Const ILD_OVERLAYMASK = &HF00

Dim Selected%

Private Sub Form_Load()
  With ImageList1
    .ImageHeight = 32
    .ImageWidth = 32
    .UseMaskColor = True
    .MaskColor = RGB(255, 0, 128)
    .ListImages.Clear
  End With
  
  Image1.Picture = LoadPicture(App.Path & "\Back.jpg")
  Picture3.Picture = Image1.Picture
  Call ReloadImageList
End Sub

Private Sub Form_Paint()
  Call DisplayImageList
End Sub

Private Sub Form_Unload(Cancel As Integer)
  ImageList1.ListImages.Clear
End Sub

Private Sub Command1_Click()
  Call ReloadImageList
End Sub

Private Sub Command2_Click()
  If ImageList1.ListImages.Count = 0 Then Exit Sub
  ImageList1.ListImages.Remove (Selected + 1)
  If Selected = ImageList1.ListImages.Count Then
    Selected = Selected - 1
    If Selected < 0 Then Selected = 0
  End If
  Call DisplayImageList
End Sub

Private Sub Command3_Click()
  Static InsCnt%
  
    InsCnt = InsCnt + 1
    If ImageList1.ListImages.Count = 10 Then Exit Sub
    ImageList1.ListImages.Add (Selected + 1), "Insert " & _
                               CStr(InsCnt), Image2.Picture
    Call DisplayImageList
End Sub

Private Sub Picture2_Click(Index As Integer)
  ImageList1.BackColor = RGB(255, 255, 255)
  Call SetImage(CLng(Index))
  Selected = Index
End Sub

Private Sub Picture2_DblClick(Index As Integer)
  Call Label1_Click(Index)
End Sub

Private Sub Text1_LostFocus()
  With Text1
    .Visible = False
    ImageList1.ListImages(CInt(.Tag) + 1).Key = .Text
    Label1(.Tag).Caption = .Text
  End With
End Sub

Private Sub Check1_Click()
  Call SetImage(CLng(Selected))
End Sub

Private Sub Label1_Click(Index As Integer)
  With Text1
    If .Visible Then
      ImageList1.ListImages(CInt(.Tag) + 1).Key = .Text
      Label1(.Tag).Caption = .Text
    End If
  
    .Text = Label1(Index).Caption
    .Top = Label1(Index).Top
    .Left = Label1(Index).Left
    .Visible = True
    .SelStart = 0
    .SelLength = Len(.Text)
    .SetFocus
    .Tag = Index
  End With
End Sub

Private Sub SetImage(x&)
  Dim TPX%, TPY%
        
    With ImageList1
      If .ListImages.Count = 0 Then Exit Sub
      
      TPX = Screen.TwipsPerPixelX
      TPY = Screen.TwipsPerPixelY
      Picture2(x).Picture = LoadPicture("")
      Picture3.AutoRedraw = True
            
      If Selected <> -1 And x <> Selected Then
        .ListImages(Selected + 1).Draw Picture2(Selected).hDC, _
                                       0, 0, imlNormal
                                       
        Label1(Selected).BackColor = RGB(255, 255, 255)
        Label1(Selected).ForeColor = RGB(0, 0, 0)
      End If
     
      .ListImages(x + 1).Draw Picture2(x).hDC, 0, 0, imlSelected
      Label7.Caption = .ListImages(x + 1).Key
      Label1(x).BackColor = RGB(128, 0, 0)
      Label1(x).ForeColor = RGB(255, 255, 255)
     
      If Check1.Value = vbUnchecked Then
        .ListImages(x + 1).Draw Picture3.hDC, 5 * TPY, 5 * TPX, _
                                imlNormal
                                
        .ListImages(x + 1).Draw Picture3.hDC, 5 * TPY, 42 * TPX, _
                                imlTransparent
                                
        .ListImages(x + 1).Draw Picture3.hDC, 5 * TPY, 79 * TPX, _
                                imlSelected
                                
        .ListImages(x + 1).Draw Picture3.hDC, 5 * TPY, 116 * TPX, _
                                imlFocus
        Call ImageList_Draw(.hImageList, x, Picture3.hDC, 5&, 153&, _
                                ILD_MASK)
      Else
        Picture3.Picture = Image1.Picture
        Call ImageList_Draw(.hImageList, x, Picture3.hDC, 5&, 5&, _
                            ILD_NORMAL Or ILD_TRANSPARENT)
                            
        Call ImageList_Draw(.hImageList, x, Picture3.hDC, 5&, 42&, _
                            ILD_TRANSPARENT)
                            
        Call ImageList_Draw(.hImageList, x, Picture3.hDC, 5&, 79&, _
                            ILD_SELECTED Or ILD_TRANSPARENT)
                            
        Call ImageList_Draw(.hImageList, x, Picture3.hDC, 5&, 116&, _
                            ILD_FOCUS Or ILD_TRANSPARENT)
                            
        Call ImageList_Draw(.hImageList, x, Picture3.hDC, 5&, 153&, _
                            ILD_MASK Or ILD_TRANSPARENT)
      End If
      Picture3.Refresh
      Picture3.AutoRedraw = False
    End With
End Sub

Private Sub DisplayImageList()
  Dim x%
  
    For x = 0 To 9
      Picture2(x).AutoRedraw = True
    Next x
  
    For x = 1 To 10
      If x <= ImageList1.ListImages.Count Then
        Picture2(x - 1).Visible = True
        ImageList1.ListImages(x).Draw Picture2(x - 1).hDC, _
                                      0, 0, imlNormal
        Label1(x - 1).Caption = ImageList1.ListImages(x).Key
        Label1(x - 1).Visible = True
      Else
        Picture2(x - 1).Visible = False
        Label1(x - 1).Visible = False
      End If
    Next x
  
    For x = 0 To 9
      Picture2(x).Refresh
      Picture2(x).AutoRedraw = False
    Next x

    Call SetImage(CLng(Selected))
End Sub

Private Sub ReloadImageList()
  Dim x%, aa$

    ImageList1.ListImages.Clear
    For x = 0 To 9
      aa = "Bild" & Chr$(x + 65) & ".bmp"
      ImageList1.ListImages.Add , aa, LoadPicture(App.Path & _
                                                  "\" & aa)
    Next x
    Call DisplayImageList
End Sub
'---------- 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 1 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 GDMaster am 19.11.2009 um 11:10

In dem Download scheint ein Fehler zu sein.
Bei mir kommt die Fehlermeldung: 'c:\Arbeiten mit dem ImageList-Control\comctl32.ocx' konnte nicht geladen werdenLaden des Projekts forsetzen?