На этом шаге мы рассмотрим некоторые свойства этого компонента.
Перечень свойств компонента, отображенных в окне Properties (Свойства), показан на рисунке 1.
Рис.1. Свойства компонента ListBox
Уточним смысл некоторых свойств.
Рис.2. Диалоговое окно для задания источника данных
Примечание. В данной версии эта возможность отключена, поэтому диалоговое окно на рисунке 2 пустое!
Рис.3. Окно редактора для ввода строк в компонент ListBox
Извлечь строки из компонента можно так:
String^ it = listBox1->Items[i]->ToString();
Обнаружить строку, на которой был щелчок мыши (обработка события Click), можно так:
String^ it = this->listBoxl->Items[this->listBoxl->SelectedIndex]->ToString();
Рис.4. Вид компонента ListBox в одноколоночном и многоколоночном режимах
Приведем пример использования этого свойства.
// Одноколоночный режим private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->listBox1->Items->Clear(); //очистка компонента String^ it; listBox1->MultiColumn = false; //одноколоночный режим for (int i = 0; i < 50; i++) { it = Convert::ToString(i); //так преобразуется int to String it = it->Concat("Items_", it); listBox1->Items->Add(it); } } // Многоколоночный режим private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->listBox1->Items->Clear(); for ( int x = 0; x < 50; x++ ) { String^ it = Convert::ToString(x); //так преобразуется int to String it = it->Concat("Items_", it); listBox1->Items->Add(it); } listBox1->MultiColumn = true; //многоколоночный режим listBox1->ColumnWidth = 50; //это ширина колонки в пикселях // Чтобы автоматически выводить любой текст в многоколоночном варианте // надо уметь рассчитать максимальную длину строки в пикселях, // т. е. уметь переводить символы в пиксели. }
Результат работы приложения изображен на рисунке 5.
Рис.5. Результат работы приложения
Определение максимальной ширины строки в пикселях для нашего примера:
int width = (int)listBox1->CreateGraphics()->MeasureString( listBox1->Items[listBox1->Items->Count - l]->ToString(), listBox1->Font).Width; listBox1->ColumnWidth = width;
Пояснение:
Метод CreateGraphics() создает графический объект для listBox1 (выбор строк происходит в графике).
У этого объекта есть метод MeasureString(String,Font), который измеряет длину строки в пикселях, выводимую данным шрифтом (разные шрифты занимают на экране разное количество пикселей).
Параметр String - это:
listBox1->Items[listBox1->Items->Count - 1]->ToString()
i-й элемент извлекается так:
String ^it=listBoxl->Items[i]->ToString();
Параметр Font - это:
listBox1->Font
Метод MeasureString(String, Font) возвращает данные по структуре типа sizeF, которая состоит из 2-х элементов типа float. Это координаты прямоугольника (в пикселях), куда помещается изображение строки на экране. Haм надо знать ширину этого прямоугольника, т. к. она определяет размер строки в пикселях. Поэтому мы пишем:
MeasureString(String,Font).width,
Но поскольку этот элемент имеет тип float, то его надо перевести в int, потому что ширина в ListBox задается в int.
Поэтому перед ListBox1->CreateGraphics() стоит (int) - принудительный перевод float в int.
В общем случае надо определять строку максимальной длины, образуя цикл:
String^ it; String^ it_0; // здесь будет предыдущая строка it_0=listBoxl->Items[0]->ToString(); for(int i=0; i < listBox1->Items->Count; i++) { it=listBoxl->Items[i]->ToString(); // и далее сравнивать текущую и предыдущую строки, // применяя метод сравнения для строк типа String^ и выбирая из них большую. }
На следующем шаге мы рассмотрим, как использовать этот компонент.