Ovládací prvky ImageCombo a ImageList

Ovládací prvek ComboBox (Pole se seznamem) znáte asi všichni. Potřebovali jste někdy na formuláři seznam, ve kterém by namísto prostých textových položek byly obrázky? Pak je pro vás určen prvek ImageCombo a pro něj coby zdroj obrázků prvek ImageList. Oba najdete ve výčtu prvků po klepnutí pravým tlačítkem na Toolbox. Po výběru se přidají mezi ostatní ovládací prvky. Pozn. Ve výčtu najdete prvek pojmenovaný jako ImageComboBox. Na formuláři se už potkáte ale jen s názvem ImageCombo.

Ovládací prvky ImageCombo a ImageList

Ovládací prvky ImageCombo a ImageList

Oba prvky pochází z Visual Basicu 6, něco už pamatují a nejsou úplně ideálně optimalizované pro VBA. Nejprve si naplníme obrázky prvek ImageList. Jej zastupuje čtverové tlačítko s ikonou na formuláři, které po spuštění zůstane skryté. Jedná se tedy o jakéhosi zástupce ovládacího prvku (ve skutečnosti jde o zásobník se zdroji obrázků). Vybereme tlačítko s ikonou na formuláři a rozbalíme dialog pod tlačítkem vlastnosti Custom v okně Properties. Na záložce General zaškrtneme volbu Custom a zadáme hodnoty pro výšku a šířku použitých obrázků (v mém případě 128 x 128 pixelů). Poté na záložce Images prostřednictvím tlačítka Insert Picture vložíme do zásobníku potřebné obrázky. Musíme se spokojit s jednoduchými ikonami (jednoobrázkové .ico) nebo rastry (.bmp, .jpg, .gif). Jak asi tušíte, podpora formátu PNG chybí. Prvek sice umí bitmapové maskování, ale doporučuji nechat jej bez povšimnutí. ImageList si obrázkové zdroje ukládá „do šuplíku“, není potřeba uchovávat ve složce načítané obrázky (v souboru ke stažení jsou pouze pro testování, stačí distribuovat samotný sešit).

Ovládací prvky ImageCombo a ImageList v době návrhu

Ovládací prvky ImageCombo a ImageList v době návrhu

A jak napojíme obrázky ze zásobníku na prvek ImageCombo? Doplníme kód do inicializační procedury formuláře (nelze přes vlastnost Custom prvku ImageCombo).

Private Sub UserForm_Initialize()

    With ImageCombo1
        'přiřazení zdroje obrázků
        .ImageList = ImageList1
        'přidání položek a přiřazení obrázků
        'poslední indexy ... indexy obrázků
        .ComboItems.Add 1, , "Dům 1", 1
        .ComboItems.Add 2, , "Dům 2", 2
        .ComboItems.Add 3, , "Dům 3", 3
    End With

End Sub
Ovládací prvky ImageCombo a ImageList v akci

Ovládací prvky ImageCombo a ImageList v akci

Obrázek výše ukazuje i zatím nekomentovanou dvojici prvků Image a CommandButton, které jako takové dobře znáte (na formuláři v pravé části). Po klepnutí na tlačítko je do prvku Image nad ním načten vybraný obrázek (z prvku ImageCombo přečteme pořadí vybraného obrázku a vytáhneme si jej ze zásobníku ImageList). Popisek obrázkové položky (Dům X) pak přiřadíme do vlastnosti ControlTipText prvku Image.

Private Sub CommandButton1_Click()
    With Image1
        .Picture = ImageList1.ListImages( _
                   ImageCombo1.SelectedItem.Index).Picture
        .ControlTipText = ImageCombo1.SelectedItem.Text
    End With
End Sub

ImageCombo nastavuje svou velikost (výšku) automaticky (podle připojených obrázků), takže nezbývá, než polohu ostatních ovládacích prvků poupravit až po spuštění formuláře. Předběžně můžete počítat s výškou stejnou jako mají zobrazované položky.

U prvku ImageCombo mi po chvíli začala lézt na nervy jedna věc – vybraná položka zůstane po výběru ze seznamu označená, což znamená, že i obrázek je „pod závojem“ a k odznačení dojde až při ztrátě zaměření (fokusu) při ručním výběru jiného prvku. Programové předání fokusu nefunguje vždy (je potřeba jej provádět v události Click, ne Change a i tak je to nespolehlivý způsob).

Soubor ke stažení:
imagecombo.zip