Шаг 156.
Microsoft Visual C++ 2010. Язык С/С++.
Компоненты Windows Forms. Свойства ListBox

    На этом шаге мы рассмотрим некоторые свойства этого компонента.

    Перечень свойств компонента, отображенных в окне Properties (Свойства), показан на рисунке 1.


Рис.1. Свойства компонента 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^ и выбирая из них большую.
  }

    На следующем шаге мы рассмотрим, как использовать этот компонент.




Предыдущий шаг Содержание Следующий шаг