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

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

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


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

    Обычно он используется для привязки компонентов к одной из границ формы. Например, если панель привязана к нижней границе формы, то независимо от размера окна (при изменении размера окна во время работы программы) кнопки, находящиеся на панели, всегда будут находиться в нижней его части. Панель позволяет легко управлять компонентами, которые на ней находятся. Например, чтобы сделать недоступными компоненты панели, достаточно присвоить значение False свойству Enabled панели.

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

Таблица 1. Свойства компонента Panel
Свойство Описание
Dock Определяет границу формы, к которой привязана (прикреплена) панель. Панель может быть прикреплена к левой (Left), правой (Right), верхней (Top) или нижней (Bottom) границе
BorderStyle Вид границы панели: FixedSingle - рамка; Fixed3D - объемная граница; None - граница не отображается
Enabled Свойство позволяет сделать недоступными (False) все компоненты, которые находятся в панели
Visible Позволяет скрыть (False) панель
AutoScroll Признак необходимости отображать полосы прокрутки, если компоненты, которые находятся в панели, не могут быть выведены полностью

    Свойство Dock позволяет "привязать" панель и, следовательно, находящиеся в ней компоненты к границе формы. В результате привязки панели к границе формы размер панели автоматически изменяется - ширина панели становится равной ширине формы (при привязке к верхней или нижней границе) или высота панели становится равной высоте формы (при привязке к левой или правой границе). На рисунке 2 приведена форма программы просмотра иллюстраций из 34 шага. Кнопки перехода к следующей и предыдущей иллюстрациям размещены в панели, свойство Dock которой равно Bottom.


Рис.2. Форма просмотра иллюстраций

    Приведем текст приложения.

.   .   .   .
public:
	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;
		SetPicture();
		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;
		if (!FillListBox(fb->SelectedPath))
			// в каталоге нет файлов иллюстраций
			pictureBox1->Image = nullptr;
	}
 }

// Пользователь выбрал другой элемент списка
// щелчком кнопкой мыши или перемещением по списку
// при помощи клавиатуры
private: System::Void listBox1_SelectedIndexChanged(System::Object^  sender, 
       System::EventArgs^  e) {
	SetPicture();
}

//  Функция загрузки изображений
private: void SetPicture() {
	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;
 }

// Кнопка Вперед
private: System::Void button3_Click(System::Object^  sender, 
         System::EventArgs^  e) {
	 // Получаем текст текущей строки из listBox1
	 String^ curItem = listBox1->SelectedItem->ToString();
	 // Определяем номер этой строки в listBox1
	 int i = listBox1->FindString (curItem);
	 // Определяем количество строк
	 int count = listBox1->Items->Count;
                 i++;
	 if (i<count) {
	           listBox1->SetSelected(i, true); // Устанавливаем выделение 
	           SetPicture(); // Отображаем картинку
	         }
 }

// Кнопка Назад
private: System::Void button2_Click(System::Object^  sender, 
         System::EventArgs^  e) {
	 // Получаем текст текущей строки из listBox1
	 String^ curItem = listBox1->SelectedItem->ToString();
	 // Определяем номер этой строки в listBox1
	 int i = listBox1->FindString (curItem);
	 // Определяем количество строк
	 int count = listBox1->Items->Count;
                 i--;
	 if (i>-1) {
	           listBox1->SetSelected(i, true); // Устанавливаем выделение 
	           SetPicture(); // Отображаем картинку
	         }
 }

// Обработка нажатия кнопки Esc
private: System::Void Form1_KeyPress(System::Object^  sender, 
                   System::Windows::Forms::KeyPressEventArgs^  e) {
           if( e->KeyChar == (char)27 ) // Если нажата кнопка Esc...
		 panel1->Visible = !(panel1->Visible); // ... изменяем ее видимость
}
Архив проекта можно взять здесь.

    Прокомментируем приведенный текст.

    Результаты работы приложения приведены на рисунках 3 и 4, причем на последнем рисунке отсутствует панель с кнопками. Чтобы ее скрыть/отобразить, используется клавиша Esc.


Рис.3. Панель с кнопками отображается


Рис.4. Панель с кнопками скрыта

    Для выполения этой операции используется обработчик формы KeyPress. Важно отметить, что у формы обязательно надо установить в True обработчик события KeyPreview для того, чтобы сначала форма получала доступ к возникающим событиям, а не тот компонент, в фокусе которого это событие произошло.

    Перемещаться по списку картинок можно не только в компоненте listBox1, но и используя соответствующие кнопки >> и <<. Алгоритм обработчиков этих кнопок достаточно прост:

    Так как операция загрузки картинки выполняется достаточно часто, мы оформили ее в отдельную функцию SetPicture().

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




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