Шаг 34.
Microsoft Visual C++ 2010. Начала.
Базовые компоненты. Компонент ListBox

    На этом шаге мы рассмотрим назначение, основные свойства и пример использования этого компонента.

    Компонент ListBox (рисунок 1) представляет собой список, в котором можно выбрать нужный элемент.


Рис.1. Компонент ListBox

    Свойства компонента приведены в таблице 1.

Таблица 1. Свойства компонента ListBox
Свойство Описание
Items Элементы списка - коллекция строк
Items.Count Количество элементов списка
Items.SelectedIndex Номер элемента, выбранного в списке. Если ни один из элементов списка не выбран, то значение свойства равно -1
Sorted Признак необходимости автоматической сортировки (True) списка после добавления очередного элемента
SelectionMode Определяет режим выбора элементов списка: One - только один элемент; MultiSimple - можно выбрать несколько элементов, сделав щелчок на нужных элементах списка; MultiExtended - можно выбрать несколько элементов, сделав щелчок на нужных элементах списка при нажатой клавише Ctrl, или выделить диапазон, щелкнув при нажатой клавише Shift на первом и последнем элементе диапазона
ScrollAlwaysVisible Признак необходимости всегда отображать вертикальную полосу прокрутки. Если значение свойства равно False, то полоса прокрутки отображается, только если все элементы списка нельзя отобразить при заданном размере компонента
MultiColumn Признак необходимости отображать список в несколько колонок. Количество отображаемых колонок зависит от количества элементов и размера области отображения списка
Location Положение компонента на поверхности формы
Size Размер компонента без (для компонентов типа DropDown и DropDownList) или с учетом (для компонента типа Simple) размера области списка или области ввода
Font Шрифт, используемый для отображения содержимого поля редактирования и элементов списка

    Список, отображаемый в поле редактирования, можно сформировать во время создания формы или во время работы программы. Чтобы сформировать список во время создания формы, надо щелкнуть на кнопке с тремя точками в строке свойства Items и в окне String Collection Editor (Редактор коллекции строк) ввести элементы списка. Формирование списка во время работы программы обеспечивает метод Add свойства Items.

    Программа "Просмотр иллюстраций" (вид ее окна приведен на рисунке 2) демонстрирует использование компонента ListBox.


Рис.2. Окно программы "Просмотр иллюстраций"

    Программа позволяет просмотреть иллюстрации (фотографии), находящиеся в указанной пользователем папке.

    Текст программы приведен в листинге ниже. Заполняет список компонента ListBox функция FillListBox. В начале работы программы эту функцию вызывает конструктор формы. Во время работы — функция обработки события Click на кнопке Папка. Сначала эта функция отображает диалог Выбор папки (отображение диалога обеспечивает метод ShowDialog объекта FolderBrowserDialog), затем — вызывает функцию FillListBox. Для доступа к папке используется объект DirectoryInfo. Список файлов представлен в виде массива типа FileInfo. Формирует массив метод GetFiles. Отображение иллюстраций обеспечивает компонент PictureBox. Чтобы иллюстрации отображались без искажения, его свойству SizeMode надо присвоить значение Zoom. Отображение выбранной в списке иллюстрации осуществляет функция обработки события SelectedIndexChanged, которое происходит в результате щелчка на элементе списка или перемещения указателя текущего элемента списка при помощи клавиш управления курсором.

    Приведем описания переменных и тексты основных функций:

.   .   .   .
using namespace System::IO; // для DirectoryInfo
.   .   .   .
// конструктор
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	// Настройка listBox1: 
	// элементы списка сортируются в алфавитном порядке 
	listBox1->Sorted = true; 
	// получить имя каталога "Мои рисунки" 
	DirectoryInfo^ di; // каталог 
	di = gcnew DirectoryInfo(Environment::GetFolderPath( 
		Environment::SpecialFolder::MyPictures));
	aPath = di->FullName; 
	label1->Text = aPath; 
	// Сформировать и отобразить в поле компонента listBox 
	// список иллюстраций 
	FillListBox(aPath);
}
.   .   .   .
private: String^ aPath; // путь к файлам картинок
.   .   .   .
private: System::Boolean FillListBox(String^ aPath)
{
	// информация о каталоге
	DirectoryInfo^ di = gcnew DirectoryInfo(aPath);
	// информация о файлах
	array<FileInfo^> ^fi = di->GetFiles("*.jpg");
	// очистить список listBox1
	listBox1->Items->Clear();
	// Добавляем в listBox1 имена jpg-файлов,
	// содержащихся в каталоге aPath
	for each (FileInfo^ fc in fi)
	{
		listBox1->Items->Add(fc->Name);
	}
	label1->Text = aPath;
	if (fi->Length == 0) return false;
	else
	{
		// выбираем первый файл из полученного списка
		listBox1->SelectedIndex = 0;
		return true;
	}
}

// щелчок на кнопке Папка
private: System::Void button1_Click(System::Object^  sender, 
          System::EventArgs^  e) {
	// FolderBrowserDialog - окно Обзор папок
	FolderBrowserDialog^ fb = gcnew FolderBrowserDialog();

	fb->Description = "Выберите папку,\n" +
		"в которой находятся иллюстрации";
	fb->ShowNewFolderButton = false;
	fb->SelectedPath = aPath;
	// Отобразить окно Обзор папок и проверить,
	// щелчком на какой кнопке пользователь закрыл его
	if (fb->ShowDialog() == System::Windows::Forms::DialogResult::OK)
	{
		// пользователь выбрал каталог и щелкнул на кнопке OK
		aPath = fb->SelectedPath;
		label1->Text = aPath;
		if (!FillListBox(fb->SelectedPath))
			// в каталоге нет файлов иллюстраций
			pictureBox1->Image = nullptr;
	}
 }

// Пользователь выбрал другой элемент списка
// щелчком кнопкой мыши или перемещением по списку
// при помощи клавиатуры
private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, 
       System::EventArgs^  e) {
	pictureBox1->Visible = false;
	// загружаем изображение в pictureBox1
	pictureBox1->Image = gcnew Bitmap(aPath + "\\" +
	listBox1->SelectedItem->ToString());
	if ((pictureBox1->Image->Width > pictureBox1->Size.Width) ||
		(pictureBox1->Image->Height > pictureBox1->Size.Height))
	{
		// масштабируем
		pictureBox1->SizeMode = PictureBoxSizeMode::Zoom;
	}
	else
	{
		// масштабировать не надо
		pictureBox1->SizeMode = PictureBoxSizeMode::CenterImage;
	}
	pictureBox1->Visible = true;
}
Архив проекта можно взять здесь.

    На следующем шаге мы рассмотрим компонент ListView.




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