Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції_ІЗВП_укр.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
6.39 Mб
Скачать

2. Обробка натискання кнопки

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

void f ()

{

AfxMessageBox ("1");

}

Цей код треба написати де-небудь в класі. Це і буде наша функція. Тепер зв'яжемо її з нашою кнопкою:

... ON_WM_CREATE () ON_COMMAND (1200, f) END_MESSAGE_MAP ()

Макрос ON_COMMAND (1200, f) доданий в карту повідомлень має два параметри. Перший параметр - це ідентифікатор кнопки. Другий - ім'я функції, яка з нашою кнопкою зв'язується. Тепер при натисканні на кнопку в нас буде вискакувати відповідний MessageBox. Взагалі кажучи, таке зв'язування ідентифікатора об'єкта і функції, зустрічається досить-таки часто. Наприклад, якщо вам треба пов'язати з певним елементом меню деяку функцію, то ви дієте абсолютно аналогічно.

3. Клас cListBox

 Давайте додамо в нашу програму ListBox (список). Для такого списку в MFC існує клас CListBox. Для додавання списку ми повинні спочатку визначити у віконному класі покажчик на змінну типу CListBox:

CButton * m_btn1;

CButton * m_btn2;

CListBox * m_lbListBox;

...

Далі ми повинні створити відповідний об'єкт:

int CMyMainWnd :: OnCreate (LPCREATESTRUCT lpCreateStruct)

{

   m_btn1 = new CButton;

   m_btn2 = new CButton;

   m_lbListBox = new CListBox;

...

m_lbListBox-> Create (WS_VISIBLE | WS_CHILD | LBS_STANDARD | WS_HSCROLL | LBS_STANDARD, CRect (130,0,230,180), this, 1202);

return 0;

}

Параметри у функції Create аналогічні параметрам однойменної функції для кнопки. У першому з них присутні деякі стилі, специфічні для ListBox'а (з префіксом LBS_). Останній параметр, як завжди, треба вибрати унікальним.

Так як ми створили наш ListBox динамічно, то його треба знищити в деструкції класу:

~ CMyMainWnd ()

{

...

delete m_btn2;

delete m_lbListBox;

}

Запускаємо програму. На формі повинен з'явиться список.

Природно він порожній. Додамо в функції OnCreate кілька елементів для нього:

int CMyMainWnd :: OnCreate (LPCREATESTRUCT lpCreateStruct)

{

...

m_lbListBox-> Create (WS_VISIBLE | WS_CHILD | LBS_STANDARD | WS_HSCROLL | LBS_STANDARD, CRect (130,0,230,180), this, 1202);

m_lbListBox-> AddString ("Igor");

m_lbListBox-> AddString ("Otto");

m_lbListBox-> AddString ("Victor");

return 0;

}

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

Подивимося, що ми взагалі можемо з елементами списку робити. Операцій не так вже й багато. Додати елемент на певну позицію, видалити елемент з певної позиції, перерахувати елементи і т. д. Давайте все це втілювати. У нас є кнопка з написом MyButton. Всі наші дії зі списком будуть відбуватися при натисканні цієї кнопки.

Давайте для початку додамо елемент на певну позицію. Для цього напишемо наступний код:

void CMyMainWnd :: f ()

{

m_lbListBox-> InsertString (1, "New String");

}

Метод класу InsertString для CListBox вставляє рядок, передану в якості другого параметра, на місце, що задається першим параметром. Нумерація при цьому починається з нуля. Запустіть програму і натисніть на кнопку MyButton. На першому місці в нашому списку з'явиться рядок New String:

Для видалення рядка з якимсь номером використовуєте метод DeleteString. Наприклад, наступний код буде видаляти верхній елемент нашого списку (пам'ятаєте, що нумерація елементів починається з нуля):

void CMyMainWnd :: f ()

{

m_lbListBox-> DeleteString (0);

}

Тепер подивимося, як очистити весь список. Для цього використовуємо метод ResetContent:

void CMyMainWnd :: f ()

{

m_lbListBox-> ResetContent ();

}

Параметрів у цього методу немає.

Рухаємося далі. Що ми ще зі списком можемо зробити? Ну, наприклад, підрахувати кількість елементів. Давайте на цей раз код помістимо в таймер - так, щоб кількість елементів списку відображалося в заголовку вікна:

void CMyMainWnd :: OnTimer (UINT nIDEvent)

{

  ...

Else

{

CString s; s.Format ("% d items in ListBox", m_lbListBox-> GetCount ());

SetWindowText (s);

}

}

Тепер після запуску програми у нас в заголовку вікна буде показуватися кількість елементів списку:

І, наостанок, подивимося, як знайти потрібну нам рядок у списку. Для цього використовуємо метод FindString:

void CMyMainWnd :: f ()

{

...

int k = m_lbListBox-> FindString (0, "Igor");

if (k == LB_ERR) AfxMessageBox ("Рядок не знайдено");

else

{

CString s; s.Format ("Рядок знайдена на% d-му місці", k);

AfxMessageBox (s);

}

}

Даний код шукає рядок "Igor". Якщо вона є, то наш метод поверне номер цього рядка, а якщо ні, то значення LB_ERR.

КОНТРОЛЬНІ ЗАПИТАННЯ

1. Як проводитись додавання кнопки до вікна?

2. Як виконується обробка натиснення кнопки?

3. Що таке ClistBox?

4. Як працювати з елементом ClistBox?

5. Як виконати пошук рядків у списку?

Лекція 7

Тема: Програмування інтерфейсу користувача:клас CComboBox

ПЛАН:

1. Клас CcomboBox бібліотеки MFC. створення ComboBox

2. Завдання реакції на вибір в ComboBox

3. Операції з елементами

4. Діалог в якості головного вікна

1. Клас CcomboBox бібліотеки MFC. створення ComboBox

Комбінований список. Клас CcomboBox бібліотеки MFC

Елемент управління список, що розкривається (combo box control), інкапсульований класом CcomboBox, являє собою унікальний елемент управління, фактично поєднує два елементи управління в одному. Прямокутне поле, яке бачить користувач у нерозкритого списку, являє собою поле введення, а його розкрита частина - елемент управління звичайний список.

Фактично, існують 3 різних типу списку, що розкривається, що розрізняються стилем, встановленим при їх створенні. Типи списків, що розкриваються (задаються значенням властивості Type), значення стилю вікна (використовуваного для створення списку, що розкривається за допомогою функції CreateWindow) і опис відображуваного на екрані елемента керування, наведені в таблиці.

Список, що розкривається використовується в тих випадках, коли користувачеві необхідно надати на вибір список допустимих значень. Список, що розкривається в стилі Drop-down list найкраще, ймовірно, підходить для тих випадків, коли користувач може лише вибрати одне з допустімийх значень, оскільки запис в полі введення заборонена. Для ситуацій, коли поользователь може вводити в список додаткові значення, найбільш підходить стиль Simple або Drop-down.

Комбінований список забезпечує всю повноту функціональних можливість списку в поєднанні з можливостями впровадженого елемента керування - статичного тексту або елемента редагування. Звідси і походить назва елемента управління: - комбінований список. Список може бути або спадним, у відповідь на натискання кнопки в правій частині елемента, або постійно видимим. Обраний елемент відображається у вікні списку.

Існують три різновиди комбінованих списків:

• простий комбінований список;

• розкривається комбінований список;

• список, що розкривається.

Простий комбінований список видний завжди, а вікно редагування яв-ляется дружнім (підлеглим) елементом управління. Розкривається комбінований список виводиться на екран тільки тоді, коли його розкривають, а вікно редагування є дружнім елементом. Список, що розкривається виводиться на екран, коли його розкривають, а дружнім елементом є статичний текст.

Усі функціональні можливості комбінованого списку визначені в класі CComboBox бібліотеки MFC. Клас CComboBox є похідним від класу cwnd і успадковує всі його можливості.

Комбінований список може бути створений як програмно, так і доданий в редакторі ресурсів (останній варіант набагато зручніше).

Стилі, повідомлення комбінованого списку і методи класу CComboBox

Комбінований список може використовувати елементарні стилі, доступні всім об'єктам класу cwnd, а також ряд спеціальних стилів (табл. 7.2). Стиль комбінованого списку визначає його зовнішній вигляд і поведінку. Стилі встановлюються або при ініціалізації методом CComboBox :: Create, або завданням відповідних властивостей в редакторі ресурсів.

Таблиця 7.2 - Елементарні стилі комбінованого списку

Макроопределение стиля

Значення

cbs_disablenoscroll, свойство Disable No Scroll равно True

Блокує (затінює) вертикальну смугу прокрутки списку, замість того щоб прибрати її в тому випадку, коли список містить недостатню для прокрутки кількість елементів

cbs_dropdown, свойство Type равно Dropdown

Список не виводиться на екран до тих пір, поки користувач не натисне на кнопку розкриття. Обраний елемент списку відображається у вікні редагування

cbs_dropdownlist, свойство Type равно Drop List

Список не виводиться на екран до тих пір, поки користувач не натисне на кнопку розкриття. Обраний елемент списку відображається у вікні статичного тексту

cbs_lowercase, свойство

Uppercase равно False

Перетворює весь текст у нижній регістр, як у вікні вибору, так і в списку

cbs_nointegralheight, свойство No Integral Height равно True

Встановлює точно такі ж розміри комбиниро-ванного списку, які були задані при його створенні. Список показує частину елементів

cbs_oemconvert, свойство OEM Convert равно True

Перетворює рядок в кодування OEM (застосовується у поєднанні зі стилями CBS_SIMPLE І CBS DROPDOWN)

cbs_ownerdrawfixed, свойство

Owner Draw равно Fixed

Встановлює однакову висоту елементів у списку

cbs_ownerdrawvariable, свой­ство Owner Draw равно Variable

Встановлює неоднакову висоту елементів в списку

cbs_simple, свойство Type равно Simple

Список завжди видно, а вибраний елемент списку відображається в підлеглому вікні редагування

cbs_sort, свойство Sort равно True

Автоматично сортує рядки в списку

cbs_uppercase, свойство

Uppercase равно True

Перетворює весь текст у верхній регістр, як у вікні вибору, так і в списку

Примітка

Всі макроси стилів смуги прокрутки починаються із префікса cbs_ (від Combo Box Styles).

Частина комбінованого списку - безпосередньо список - може виводи-диться на екран весь час (стиль cbs simple) або може розкриватися з текстового поля (стилі cbs dropdown і cbs_dropdownlist). Поточна обрана запис списку виводиться в прямокутному вікні, яке являє собою вікно найпростішого текстового поля і може бути доступна (стилі cbs simple і cbs dropdown) або недоступна (стиль cbs dropdownlist) для редагування. Якщо комбінований список визначений як розкривається, то при натисканні символьної клавіші на клавіатурі рядок, що починається з даного символу, буде виділена.

Методи класу CComboBox бібліотеки MFC діляться на методи загального призначення, спеціальні рядкові методи і віртуальні методи.

Методи загального призначення класу CComboBox перераховані в табл. 7.3 і застосовні для всіх трьох типів комбінованих списків.

Таблиця 7.3 - Методи загального призначення класу CComboBox

Метод

Опис

Clear

Видаляє елемент із списку

Сору

Копіює вибраний елемент (у форматі тексту) в буфер обміну

Cut

"Вирізає" вибраний елемент тексту і поміщає його в буфер обміну (у форматі тексту)

GetCount

Повертає число елементів у списку

GetCurSel

Повертає індекс вибраного елементу

GetDroppedControlRect

Повертає екранні координати видимої частини розкривається комбінованого списку

GetDroppedState

Визначає, чи видна розкривається частину списку

GetDroppedWidth

Повертає мінімально допустиму ширину розкривається частині списку

GetEditSel

Витягує положення першого і останнього символів виділеного тексту у вікні редагування комбінованого списку

GetExtendedUI

Визначає, чи має комбінований список стандартний або розширений інтерфейс користувача

GetHorizontalExtent

Повертає величину в пікселах, на яку можливо гори ¬ зонтальное прокручуванню розкривається частині списку

GetltemData

Повертає 32-розрядне значення, яке додаток пов'язує із зазначеним елементом комбінованого списку

GetltemDataPtr

Повертає покажчик типу void * на спеціальне 32-розрядне значення, яке додаток пов'язує із зазначеним елементом комбінованого списку

GetltemHeight

Повертає висоту елементів комбінованого списку

GetLBText

Повертає рядок з комбінованого списку

GetLBTextLen

Витягує довжину рядка елемента в комбінованому списку

GetLocale

Витягує локальний ідентифікатор комбінованого списку

GetTopIndex

Повертає індекс першого видимого елемента в спісдчной частини комбінованого списку

LimitText

Обмежує довжину тексту, який користувач може ввести у вікно редагування комбінованого списку

Paste

Вставляє дані з буфера обміну у вікно редагування комбінованого списку

SetCurSel

Встановлює рядок у вікні редагування комбінованого списку

SetDroppedWidth

Встановлює мінімально допустиму ширину розкривається частини комбінованого списку

SetEditSel

Встановлює положення першого і останнього символів виділеного тексту у вікні редагування комбінованого списку

SetExtendedUI

Встановлює стандартний або розширений інтерфейс користувача

SetHorizontalExtent

Встановлює величину в пікселах, на яку можливо горизонтальне прокручування розкривається частини комбінованого списку

SetltemData

Встановлює 32-розрядне значення, яке додаток пов'язує із зазначеним елементом комбінованого списку

SetltemDataPtr

Встановлює вказівник типу void * на 32-розрядне значення, яке додаток пов'язує із зазначеним елементом комбінованого списку

SetltemHeight

Встановлює висоту елементів комбінованого списку

SetLocale

Встановлює локальний ідентифікатор комбінованого списку

SetTopIndex

Встановлює індекс першого видимого елемента в обліковій частини комбінованого списку

ShowDropDown

Показує або ховає розкриваються частина комбінованого списку

Строкові методи класу CComboBox перераховані в табл. 7.4, застосовні для всіх трьох типів комбінованих списків і призначені для обра ¬ лення строкових даних елементів списку.

Таблиця 7.4 - Спеціальні методи для роботи з рядками класу CComboBox

Метод

Опис

AddString

Додає рядок в кінець списковій частини комбінованого списку або в відповідну алфавітну позицію

DeleteString

Видаляє рядок зі списку

Dir

Додає імена файлів поточного каталогу в комбінований список

FindString

Шукає перший строковий елемент в комбінованому списку, що має зазначений строковий префікс

FindStringExact

Знаходиться перший строковий елемент в комбінованому списку, що співпадає з рядком пошуку

InsertString

Вставляє в комбінований список рядок у позицію з вказаним індексом

ResetContent

Видаляє з комбінованого списку всі елементи і очищає вікно редагування

SelectString

Шукає рядок в комбінованому списку і, якщо знаходить, виділяє її і копіює в вікно редагування

На цьому уроці ми з вами подивимося основні властивості та методи класу CComboBox.

Для того, що б не плутатися з кодом від попередніх уроків, створіть просте вікно, і додайте в нього меню MyMenu з підменю Dialog. При збереженні дайте йому ім'я resource.rc:

Після цього підключіть ClassWizard і створіть діалогове вікно, і зробіть, щоб це вікно показувалося при виклику меню Dialog. Додайте в нашому діалозі елемент ComboBox:

Створення ComboBox

Після такої підготовчої роботи приступаємо безпосередньо до ComboBox. Для початку подивимося, що треба зробити, щоб при появі діалогового вікна в ComboBox'е вже з'явився деякий список. Для цього нам спочатку треба виконати деякі попередні кроки.

Для того, щоб працювати з будь-яким елементом, в тому числі і з ComboBox, ми повинні поставити йому деяку змінну. Для цього використовується такий засіб, як ClassWizard. Викличте його (Ctrl + W) і перейдіть на вкладку Member Variables. Зверніть увагу, що в рядку з ідентифікатором нашого ComboBox'а (IDC_COMBO1) нічого немає:

Натисніть на кнопку Add Variable. У вікні Add Member Variable додайте ім'я змінної (у нас це m_cbComboBox) і в категорії (Category) встановіть значення Control:

Натисніть OK. Тепер у рядку ClassWizard для ідентифікатора IDC_COMBO1 з'явиться змінна m_cbComboBox типу CComboBox:

Тепер нам треба написати заготовку для коду, який, який буде виконаються при ініціалізації діалогу. Для цього знову викличте ClassWizard (якщо ви його вже закрили), перейдіть в ньому на вкладку MessageMaps, виберіть клас CDlg в Class name, у списку Object IDs виберіть CDlg, і в списку повідомлення виберіть WM_INITDIALOG:

Після цього натисніть в цьому ж діалоговому вікні на кнопку Add Function і потім на Edit Code. У вікні коду введіть наступний текст:

BOOL CDlg :: OnInitDialog ()

{

  CDialog :: OnInitDialog (); / / TODO: Add extra initialization here

m_cbComboBox.AddString ("Igor");

m_cbComboBox.AddString ("Otto");

m_cbComboBox.AddString ("вушка");

return TRUE; ...

Тепер можете запустити додаток, зайти в меню і переконається, що в ComboBox'е є три значення. Правда ComboBox виглядає не цілком привабливим:

Виправимо це. Для цього відкрийте редактор діалогів, клацніть на стрілочці в правій частині нашого ComboBox'а, і потім потягніть мишкою на нижній край з'явився (порожнього) списку:

Після цього ваш ComboBox повинен бути вже більш звичних розмірів.