Шаг 167.
Microsoft Visual C++ 2010. Язык С/С++.
Компоненты Windows Forms. Компонент CheckedListBox

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

    Компонент находится в списке All Windows Forms (Все формы Windows Forms) палитры компонентов. Компонент CheckedListBox является расширением ListBox. Он делает почти все, что делает ListBox, но дополнительно выводит окна контроля (флажки-переключатели), в которых можно делать отметку галочкой. Вид компонента показан на рисунке 1.


Рис.1. Вид компонента CheckedListBox, помещенного в форму

    Пользователь может помечать элементы списка, щелкая мышью на одной или нескольких позициях (устанавливать флажок). Повторный щелчок снимает включение флажка. Выбор элемента списка еще не означает, что флажок устанавливается/снимается. Существует свойство CheckOnClick, которое разрешает/запрещает делать пометку (устанавливать/снимать флажок). Если это свойство установлено в False, то при щелчке мышью на позиции галочка (флажок) в ней не появится. Но одновременно со щелчком на позиции идет подсветка строки. Если повторно щелкнуть на отмеченной строке, то галочка появится. Таким образом, при значении свойства CheckOnClick, установленным в False, для включения флажка надо сначала отметить элемент списка (щелчком на строке), потом сделать повторный щелчок.

    А выключается флажок при щелчке на строке или на нем самом.

    Если же CheckOnClick установлено в True, то флажок включается одновременно с выбором элемента (и выключается при повторном щелчке на нем).

    Существует свойство ThreeDCheckBoxes, которое определяет стиль окна флажка (будет ли оно в стиле Flat или Normal). Если значение свойства равно True, то стиль Flat, иначе - Normal.

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


Рис.2. Свойства компонента CheckedListBox

    Компонент CheckedListBox поддерживает три состояния флажка:

    Такое состояние можно устанавливать только в режиме исполнения, т. е. программно (т. к. этого механизма выполнения в режиме дизайна нет).

    Существуют методы CheckedListBox, с помощью которых можно определять и устанавливать состояние флажка:

Здесь:

    Приведем пример задания состояния флажков и определения их состояния. Текст обработчика события DoubleClick компонента CheckedListBox приведен ниже, а результат - на рисунке 3.

private: System::Void checkedListBox1_DoubleClick(System::Object^  sender, 
     System::EventArgs^  e) {
	 checkedListBox1->SetItemCheckState(0, CheckState::Checked);
	 checkedListBox1->SetItemCheckState(1, CheckState::Unchecked);
	 checkedListBox1->SetItemCheckState(2, CheckState::Indeterminate); 
	 int i = (int)checkedListBox1->GetItemCheckState(0);
 }


Рис.3. Программная установка флажков

    Пояснение: Здесь задаются состояния для флажков 1, 2 и 3-й строк. Последний оператор определяет состояние 1-й строки. Так как тип результата, выдаваемого методом GetItemCheckState(), - это тип CheckState, то чтобы увидеть состояние, надо этот тип привести к типу int принудительно. Поэтому после знака присваивания стоит (int).

    Чтобы узнать, помечен ли элемент списка, можно выполнить оператор:

  bool b = this->checkedListBox1->GetItemChecked(i);

    Результат метода GetItemChecked() - логическая переменная, i - индекс элемента.

    Можно и другим способом установить флажок. Для этого следует выполнить оператор:

  this->checkedListBox1->SetItemChecked(3, 1);

    Здесь:

    Обратим внимание на событие ItemCheck, которое возникает, когда состояние флажка меняется. Оно пригодится при обработке выборки из CneckedListBox.

    В CheckedListBox можно также загружать текстовые строки из файла, как для ListBox. Пример такой загрузки показан на рисунке 4. Фрагменты текста программы - в примере ниже.

.   .   .   .   
#include <stdio.h>
namespace My167_1 {
.   .   .   .   
private:
	/// <summary>
	// функция: загружает из файла текстовые строки в CheckedListBox 
	void LoadFromFile(char *File, CheckedListBox ^lb)
	{
		char s[300];
		FILE *fp;
		lb->Items->Clear();
		if (!(fp=fopen(File, "r")))
		{
			MessageBox::Show("Ошибка открытия файла", 
                           "Работа с CheckedListBox", 
			   MessageBoxButtons::OK, 
			   MessageBoxIcon::Asterisk); 
		        return;
		}
		fgets(s, 300, fp); 
		while(!feof(fp)) {
			String ^dd = gcnew String(s); 
			// этот способ конвертирования не удаляет последний 
			// управляющий символ, который надо удалить:
			int j = dd->Length-1; 
			dd = dd->Substring(0, j); 
			lb->Items->Add(dd);
			fgets(s,300,fp); 
		}
	}
		/// Требуется переменная конструктора.
.   .   .   .   
// Выход
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
		 Close();
 }
// Загрузка из файла
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
		 LoadFromFile("d:\\file.txt", this->checkedListBox1);
 }
Архив проекта можно взять здесь.


Рис.4. Пример загрузки текстового файла в CheckedListBox

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




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