
- •Лекція №1 Тема: Мова програмування: загальні поняття та означення. Загальні поняття візуального програмування план
- •2. Інтегроване середовище розробки
- •3. Основні поняття візуального програмування
- •4. Етапи розв’язування задачі на еом
- •Лекція № 2
- •Поняття та призначення відладчика програми.
- •Інтегроване середовище розробки програм. Керовані і некеровані програми
- •Поняття та призначення відладчика програми
- •3. Інтегроване середовище розробки програм. Керовані і некеровані програми
- •Контрольні запитання
- •Лекція 3
- •1 Консольний додаток
- •2. Діалоговий додаток
- •3 Багатовіконний додаток Windows
- •4.Одновіконний додаток
- •Контрольні запитання
- •Лекція № 4
- •2. Оголошення або специфікація класу
- •3. Реалізація класу
- •Контрольні запитання
- •Лекція 5
- •1. Програмне середовище Windows
- •2. Основи програмування під Windows
- •3. Типи даних в Windows
- •Переваги використання mfc (самостійно)
- •5. Архітектура додатка
- •6. Типи майстрів проектів (самостійно)
- •7. Обробка подій в додатках класу mfc
- •Повідомлення миші
- •Введення за допомогою миші
- •Контрольні запитання
- •Лекція 6 Тема: Програмування інтерфейсу користувача: кнопки, списки план:
- •2. Обробка натискання кнопки
- •3. Клас cListBox
- •2. Завдання реакції на вибір в ComboBox
- •3. Операції з елементами
- •4. Діалог в якості головного вікна
- •Контрольні запитання
- •Лекція 8 Тема: Програмування інтерфейсу користувача: меню, діалогові вікна план
- •2. Створення обробника меню
- •3. Додавання діалогового вікна
- •4. Додавання діалогу за допомогою класу
- •5. Обмін даними з діалогом
- •4. Назвіть послідовність етапів створення діалогу за допомог класу?
- •2. Забезпечення видалення, редагування, додавання записів в бд
- •3. Забезпечення сортування та фільтрації записів з бд.
- •4.Стандарт odbc і dao
- •Контрольні запитання
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 повинен бути вже більш звичних розмірів.