11. April 2008

Picture Combo Box in .NET

Prinzipiell kann man in einer Standard ComboBox (namespace System::Windows::Forms::ComboBox) lediglich Texte anzeigen.
Zwar kann das Control Objekte enthalten, zeigt aber lediglich die Texte, die es mittels der "ToString()" Methode enthält an.

Durch einen kleinen Umbau kann man das Control jedoch dazu bringen, auch Images in der Auwahl anzuzeigen ^^

Dazu muss man lediglich das "DrawItem" Event abhandlen,
der Code im Folgenden hier:

// Event Abonnement
this->comboBox->DrawItem += gcnew System::Windows::Forms::DrawItemEventHandler(this, &Form1::comboBox_DrawItem);

// Methode
private: System::Void comboBox1_DrawItem(System::Object^ sender, System::Windows::Forms::DrawItemEventArgs^ e)
{
ComboBox ^combo = (ComboBox ^)sender;
if (e->Index != -1)
{
e->Graphics->DrawString(combo->Items[e->Index]->ToString(), this->Font,
(gcnew System::Drawing::Pen(System::Drawing::Color::Black))->Brush,
50, e->Bounds.Y + 16);
e->Graphics->DrawImage(this->m_imageList->Images[e->Index], e->Bounds.Location);
}
}

(Alle codebezogenen Abschnitte beziehen sich auf VC++.NET 2.0)

Alle verwendeten Images werden in einer System::Windows::Forms::ImageList gehalten und Folgendermaßen zugewiesen:
this->m_imageList->Images->SetKeyName(0, L"Bildname.png");

Wichtig ist, dass die ComboBox als DrawModen einen OwnerDrawn hat,
also System::Windows::Forms::DrawMode::OwnerDrawVariable oder
System::Windows::Forms::DrawMode::OwnerDrawFixed
Die if-Verzweigung überprüft den Index, also ob die aktuelle Auswahl eine gültige ist.


Das wars soweit von mir,
falls eventuelle Fragen auftauchen sollten, einfach einen Comment hinterlassen,
ich kann dann entweder sources schicken oder das Problem direkt behandlen ^^

angenehmen Tag noch
mfg
euer incredible Leitman


EDIT:
Ich bitte um Einsicht und Entschuldigung wegen der durchaus schlechten und unübersichtlichen Formatierung. Leider unterstützt die Blogging Oberfläche keine Code - Tags oder ermöglicht eine angenehme Formatierung -.-

Keine Kommentare: