Застосування класу CListBox

Елемент управління звичайний список (list box control), що інкапсулюється класом CListBox, застосовується для відображення набору рядків, званих його елементами (item) або пунктами. Звичайні списки застосовуються для відображення одноманітно організованої інформації, такий, наприклад, як список штатів або поштових індексів. Фактично, звичайний список може відображати щось, що може бути представлене у вигляді рядків. Звернете увагу, не дивлячись на те, що цілком можливо створити клієнтський елемент управління список (owner-drawn list box control), який здатний містити декілька столбцов3, зазвичай він використовується для відображення тільки одного стовпця елементів. У тих ситуаціях, коли необхідно відображати інформацію в декількох стовпцях, значно простіше скористатися елементом управління список (list view control), описаним в розділі 7, "Елементи управління деревовидне уявлення і список".

Щоб продемонструвати застосування звичайного списку на практиці, додамо в діалогове вікно проекту ControlsDcmo елемент управління звичайний список з ідентифікатором IDD_LISTBOX. Визначите для цього шаблону клас, похідний від CDialog, на ім'я CListBoxDlg. Додайте в ресурс головного меню (у меню Controls) новий пункт меню, а також додайте обробник події вибору цього пункту, який відобразить діалогове вікно CListBoxDlg, як і у всіх попередніх випадках.

Використовуючи той же самий підхід, що і при описі поля введення, розглянемо спочатку елементарні завдання, зв'язані із застосуванням елементу управління звичайний список, а потім перейдемо до демонстраційного додатку Controls Demo.

Додавання і видалення елементів

Найзвичайнішими діями, які доводиться здійснювати при роботі із звичайним списком, є додавання і вставка елементів. Для цього клас CListBox володіє Двома функціями-членами: AddString і InsertString.

Функції AddString передають покажчик на рядок, який необхідно додати в звичайний список. Якщо сортування не передбачене (стиль LBS_SORT або властивість Sort}, 0 рядок буде доданий в кінець списку, інакше буде викликана підпрограма сортування рядків. Повертане в результаті виконання функції значення відповідає позиції (індексу) розташування нового елементу в списку починаючи з нуля. int CListBox::AddString(LPCTSTR value);

Функції InsertString передають два параметри. Перший з них є індексом (починаючи з нуля) рядка, що додається, в списку. Другий параметр — це покажчик на рядок, значення якого і буде додано. Звернете увагу, оскільки функція InsertString додає рядок у вказану позицію, вона перевизначає стиль сортування, тому підпрограма сортування рядків в цьому випадку не викликається. Подібно до функції AddString, функція InsertString повертає значення, відповідне індексу нового рядка в списку.

 

int CListBox::InsertString(int index, LPCTSTR value);

 

Незалежно від того, як саме рядки були вставлені список, віддаляються вони по одній за допомогою функції CListBox::DeleteString, якою як єдиний аргумент передають індекс елементу, підмета видаленню. Повертає ця функція кількість елементів, що залишилися в списку після видалення.

Щоб видалити із звичайного списку всі елементи відразу, можна скористатися функцією CListBox::ResetContent

Майже всі функції-члени класу CListBox при відмові повертають значення LB_ERR. Тому, після спроби зміни вмісту елементу управління звичайний список має сенс завжди перевіряти це значення.

 

Пошук і вибір елементів

Клас CListBox володіє набором функцій, що дозволяють як отримувати інформацію про пункт, вибраний в списку в даний момент, так і управляти поточним вибором. У простих списків, де для вибору доступний тільки один пункт, використовується функція GetCurSel, що повертає індекс (починаючи з нуля) елементу, вибраного в даний момент. Якщо в списку не вибрано нічого, то функція GetCurSel повертає значення LB_ERR.

І навпаки, щоб встановити виділення пункту звичайного списку, застосовується функція SetCurSel, якою передають індекс елементу, підмета вибору. Для скидання всіх виділених пунктів списку функції SetCurSel передають значення -1.

Поточний вибір можна встановити на підставі самого рядка за допомогою функції SelectString.

 

int SelectString( int nStartAfter, LPCTSTR lpszltem);

 

Як можна відмітити, функції SelectString передають два аргументи. Перший з них, nStartAfter, указує індекс елементу, з якого необхідно починати пошук. Для пошуку за всім списком слід вказати значення -1. Другий аргумент, lpszltem, містить підрядок, з яким повинен починатися текст тих, що підлягають вибору елементів. Виходячи з умов, представлених на мал. 10.13, результатом виклику приведеного нижче рядка коди буде вибір елементу Jean Vaijean (Жан Вальжан), оскільки це перший рядок, починаючи з третього елементу (не забувайте, значення nStartAfter починається з нуля), на початку якої знаходиться підрядок "J".

 

m_lbx.SelectString(2,"J") ;

 

Для пошуку рядка в списку, але без зміни поточного вибору, використовується функція FindString або FindStringExact. Функція FindString здійснює пошук подібно до функції SelectString, по початкових значеннях рядків, а функція FindStringExact шукає точний збіг з вказаним текстом. Обидві функції повертають індекс знайденого елементу або значення LB_ERR, якщо жодного відповідного елементу не знайдено.

Із списками, що допускають вибір декількох елементів, працюють трохи по-іншому. Для вибору одного елементу можна скористатися функцією SetSel, а для вибору діапазону пунктів — функцією SelltemRange. Для створення складніших комбінацій виділення ці функції можуть бути об'єднані:

 

m_ListBoxl.SetSel(5);

m_ListBoxl.SelltemRange{TRUE,7,12) ;

m_ListBoxl.SelltemRange(FALSE,1,4);

 

Цей код вибирає п'ятий елемент і елементи з сьомого по дванадцятий, а потім відміняє вибір елементів з першого по четвертий.