69276

Кнопки, перемикачі

Лекция

Информатика, кибернетика и программирование

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

Украинкский

2014-10-02

49.5 KB

0 чел.

Лекція № 18

Тема: Кнопки, перемикачі

План

  1.  Застосування класу CButton
  2.  Кнопки
  3.  Перемикачі
  4.  Обробка подій перемикача
  5.  DDX і перемикачі

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

Вивчення класів елементів управління не випадково почате саме з класу кнопки, оскільки це найбільш часто використовуваний елемент управління, який присутній практично в кожному діалоговому вікні. Вважаємо, ні для кого не буде новиною, що клас CButton інкапсулює функціональні можливості елементу управління кнопка, а ось про те, що клас CButton здатний створювати кнопки чотирьох різних стилів (прапорці (checkbox), перемикачі (radio button), групові перемикачі (group box), а також найзвичайніші нажимные кнопки (push button)), відомо можливо не всім. Цілком очевидно, що якщо в редакторові діалогових вікон перетягнути один з цих елементів управління на шаблон діалогового вікна, то піклуватися про те, як саме буде створена ця кнопка не доведеться. Але якщо кнопку знадобиться створити динамічно, то про допустимі значення її стилів, а також про способи їх установки (за допомогою функції CButton::Create, прототип якої приведений нижче) слід знати.

virtual BOOL Create(LPCTSTR IpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

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

 

Стиль   Опис

BS_PUSHBUTTON  Звичайна кнопка

BS_DEFPUSHBUTTON  Кнопка з товстою окантовкою. У діалогових вікнах зазвичай позначає кнопку за умовчанням (тобто ту, яка спрацює при натисненні клавіші <Enter>)

BS_RADIOBUTTON  Елемент управління перемикач

BS_AUTORADIOBUTTOM Перемикач, вибір якого скидає решту всіх перемикачів в групі

BS_GROUPBOX   Елемент управління група

BS_CHECKBOX  Стандартний прапорець

BS_AUTOCHECKBOX  Прапорець, який при клацанні встановлює і скидає сам себе

BS_3STATE   Прапорець, що має три стани: вибраний (selected), скинутий (deselected) і невизначений (indeterminate)

BS_AUTO3STATE  Аналогічний прапорцю BS_3STATE за винятком того, що при клацаннях автоматично (циклічно) змінює свій стан

У цьому розділі мається на увазі, що елементи управління створюються за допомогою редактора діалогових вікон, а потім зв'язуються із змінними-членами класу елементу управління діалогового вікна за допомогою DDX.

Знову відкрийте створений раніше проект ControlsDemo і додайте діалогове вікно з ідентифікатором IDD_BUTTONS. Додайте для нього клас, похідний від CDialog, на ім'я CButtonsDlg. Додайте в клас CMainFrame обробник події клацання на цій кнопці (його код приведений нижче), Крім того, упевніться, що на початку файлу Mainfrra.срр підключений файл заголовка ButtonsDlg.h.

void CMainFrame::OnControlsButtons()

{

CButtonsDlg().DoModal() ;

)

Отримавши діалогове вікно, здатне відобразити кнопку і відреагувати на взаємодію з нею, давайте розглянемо різні типи кнопок.

Кнопки

Про кнопки (button) можна сказати небагато, оскільки зазвичай вони використовуються лише для ініціалізації користувачем яких-небудь дій в додатку. Саме тому в статтях, присвячених програмуванню кнопок, про їх функціональні можливості мова ніколи не йде, а основна увага приділяється створенню химерних кнопок з непрямокутними формами або вишуканими зображеннями. Докладніша інформація про кнопки, що містять растрові зображення, приведена в розділі "Кнопки із зображенням".

Найбільш цікавим із стилів кнопок є стиль BS_DEFPUSHBUTTON. Він може бути встановлений в діалоговому вікні Properties елементу управління (для цього досить привласнити властивості Default значення True). У діалогових вікнах ця кнопка з товстою окантовкою позначає кнопку за умовчанням. Якщо користувач, не змінюючи фокус введення, натисне клавішу <Enter>, то саме ця кнопка пошле діалоговому вікну повідомлення WM_COMMAND, нібито користувач клацнув на ній мишею. Звернете увагу, це роисходит тільки в тому випадку, якщо фокус введення не був переміщений, крім того, натиснення клавіші <Enter>, у той час коли кнопка володіє фокусом введення (незалежно від її стилю), рівнозначно клацанню на ній.

Як вже було сказано, щоб створити обробник повідомлення WM COMMAND, передаваного при клацанні на кнопці, на зображенні цій кнопці достатньо двічі клацнути в редакторові діалогових вікон. При цьому обробник повідомлення WM_COMMAND в класі діалогового вікна буде не тільки створений, але і автоматично асоційований з кнопкою в шаблоні діалогового вікна, що володіє відповідним ідентифікатором. Звернете увагу, якщо клас діалогового вікна ще не був асоційований з шаблоном діалогового вікна, то автоматично викликається майстер MFC Class Wizard, що дозволить створити відповідний клас діалогового вікна.

Перемикачі

Перемикач (radio button) є круглою кнопкою з рядком тексту опису. Цей елемент управління отримав своє ім'я від старовинних автомобільних радіоприймачів, горизонтальних кнопок-перемикачів, що володіють набором, при натисненні на одній з яких інша, натиснута раніше, виштовхувалася. Тому перемикачі поміщають зазвичай усередині елементу управління група (group box control), щоб наочніше продемонструвати їх взаємозв'язок. У додатку перемикачі застосовують для того, щоб надати користувачеві можливість вибору одного з декількох взаємовиключних параметрів. У середовищі розробки Visual Studio .NET можна знайти безліч прикладів застосування цього елементу управління. При створенні нового проекту MFC, наприклад, діалогове вікно Application Type (Тип додатку) містить три набори перемикачів, що дозволяють вибрати тип додатку (SDI, MDI або діалоговий), стиль проекту (Windows Explorer або стандартний MFC) і застосування MFC (як сумісна використовувана бібліотека DLL або бібліотеки, підключеної статично). Як можна відмітити, вибір один із значень (усередині кожної з груп) відміняє вибір будь-якого іншого.

Обробка подій перемикача

Більшість обробників події клацання на звичайній кнопці служать для негайного виконання певного завдання, обробник клацання на перемикачі, навпаки, служить лише для зміни стану призначеного для користувача інтерфейсу діалогового вікна. Дане діалогове вікно — хороший приклад подібної ситуації, оскільки в цьому випадку деякі з елементів управління повинні бути доступні тільки тоді, коли вибраний відповідний ним перемикач. Отже, додамо обробники для трьох перемикачів групи Tender Information (їх код приведений нижче).

В даному випадку має сенс звернути увагу на наступні моменти. По-перше, за допомогою функції GetDlgltem отримаємо покажчик на об'єкт CWnd для кожного з елементів управління, доступністю яких належить управляти. Причина, по якій вибравши саме цей підхід, а не DDX, дуже проста: оскільки в даному демонстраційному застосуванні не передбачається подальше застосування цих елементів управління для Інших цілей, окрім дозволу/заборони доступу до них, немає ніякої реальної необхідності в спеціальній змінній-членові, що зберігається впродовж всього періоду існування діалогового вікна. По-друге, встановлені за умовчанням ідентифікатори елементів управління IDC_EDIT1 і IDC_EDIT2 були змінені на більш інтуїтивно зрозумілі. Цілком очевидно, це зробило код більш читабельним. По-третє, цей код виглядає просто огидно! Якщо запустити це застосування, то працювати воно звичайно буде, але автор особисто і, вважаємо, всі останні також неполюбляють такий надмірний код. Оскільки ж бути в тих випадках, коли, як і тут, доводиться мати справу з трьома окремими обробниками подій? Відповідь проста: "Всі обробники подій необхідно об'єднати в один". Обидва способи реалізації цього підходу викладено далі.

void CButtonsDlg::OnBnClickedCreditcard()

{

CWnd* pWnd;

pWnd = GetDlgItem(IDC_CARDNUMBER);

ASSERT(pWnd);

if (pWnd) { pWnd->EnableWindow(TRUE); }

pWnd = GetDlgItem(IDC_EXPIRATION);

ASSERT(pWnd);

if (pWnd) { pWnd->EnableWindow(TRUE); }

pWnd = GetDlgItem(IDC__CHECKNUMBER);

ASSERT(pWnd);

if (pWnd) { pWnd->EnableWindow(FALSE); }

}

DDX і перемикачі

Подібно до того, як функція DDX DDX_Text дозволяє асоціювати елемент управління із змінною-членом, що містить текст цього елементу управління, спеціальна функція DDX DDX_Radio організовує взаємодію з перемикачами. Ця функція дозволяє пов'язати з групою перемикачів змінну типу int (цілочисельну). Звернете увагу, ця функція застосовується не для всіх перемикачів, а тільки для першого перемикача в групі. Цілочисельне значення містить номер вибраного перемикача в групі (починаючи з нуля), крім того, значення -1 свідчить про відсутність вибору.

Отже розглянемо, як все це можна зробити.

1. Додайте в клас CButtonsDlg змінну-член типу int на ім'я m_iAnswer.

2. Зміните ідентифікатори ресурсів кнопок Yes (Так), No (Немає) і Maybe (Можливо) перемикача на IDC_BTN_YES, IDC_BTN_N0 і IDC__BTN_MAYBE відповідно. Хоч це і не обов'язково, але зробить код зрозумілішим.

3. Додайте у функцію CButtonsDlg: :DoDataExchange виклик наступної функції (новий рядок виділений напівжирним шрифтом).

void CButtonsDlg::DoDataExchange(CDataExchange* pDX)

{

СDialog::DoDataExchange(pDX);

DDX_Radio(pDX, IDC_BTN_YES, m_iAnswer);

}

 

4. Зміните ідентифікатор ресурсу кнопки Get Values (Набути значень) на IDC_GET_RADIOBUTTON_VALUES, а також додайте обробник події клацання на ній. Обробник повинен відображати поточний стан перемикачів при кожному клацанні на кнопці Get Values.

Звернення до функції DDX_Radio для елементу управління, що не володіє стилем WS_GROUP (Group = True), приведе до помилки, оскільки Вона застосовується лише до першого елементу в групі перемикачів.

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


 

А также другие работы, которые могут Вас заинтересовать

33973. Тактика хирурга при лечении кишечной непроходимости. Особенности 35.5 KB
  Тактика хирурга при лечении кишечной непроходимости. Перед началом лечения необходимо четко представлять с каким видом непроходимости приходится иметь дело. При странгуляционной непроходимости или обоснованном подозрении на нее показана экстренная операция ибо задержка хирургического вмешательства может привести к некрозу кишки и разлитому перитониту. При обтурационной кишечной непроходимости можно попытаться использовать консервативное лечение с целью ликвидации кишечной непроходимости с последующим устранением вызвавшей .
33974. Неспецифический язвенный колит 34 KB
  Это заболевание представляет собой хронический воспалительный процесс с развитием язвеннонекротических изменений в слизистой оболочке прямой и ободочной кишки. В сыворотке крови больных неспецифическим язвенным колитом можно обнаружить специфические антитела к слизистой оболочке толстой кишки. Слизистая оболочка толстой кишки продуцирует антиген образуются антитела. Далее присоединяется вторичная инфекция кишечная микрофлора поражение нервного аппарата кишки алиментарная недостаточность.
33975. Болезнь Крона 32 KB
  Болезнь Крона Болезнь Крона хроническое неспецифическое воспалительное заболевание которое может поражать любой отдел пищеварительного тракта от пищевода до прямой кишки. наблюдавшими его в терминальном отделе подвздошной кишки и назвавшими терминальным илеитом. В патогенезе заболевания основным считают поражение лимфатической системы приводящее к поражению стенки кишки и развитию гранулематозного воспаления. Патологическая анатомия: стенка кишки отечна утолщена рубцово изменена.
33976. Дифузный полипоз. (Полипы толстой кишки. Ворсинчатые опухоли.) 26 KB
  Полипы толстой кишки. Полипы доброкачественное новообразование исходящее из эпителия склонное к малигнизации. Хирургическое: одиночные полипы ворсинчатые опухоли с хорошо выраженной ножкой электрокоагуляция через ректо и колоно скоп при малигнизации ворсинчатой опухоли радикальная операция право и левостороняя гемиколэктомия резекция сигмовидной. Множественные полипы ограниченная резекция пораженного отдела кишки.
33977. Прямая кишка. Исследования 24.5 KB
  Нижнеампулярный отдел прямой кишки переходит в анальный канал длиной 25 4 см и заканчивается задним проходом. В отличие от других отделов толстой кишки прямая кишка не имеет гаустрации ее продольный мышечный слой не собран в ленты а равномерно распределен по всей окружности. Слизистая оболочка прямой кишки покрыта цилиндрическим эпителием. В нижнеампулярном отделе прямой кишки слизистая оболочка образует продольные складки колонны Морганьи у основания которых находятся анальные пазухи крипты.
33978. Трещины анального канала. Локализация. Клиника. Механизм боли. Лечение 25.5 KB
  Трещины анального канала. Боль обусловливает спазм и углубление трещины. Может быть несколько трещин в таком случае наиболее типичная локализация их передняя и задняя комиссуры зеркальные трещины. Трещины заднего прохода чаще наблюдают у женщин в возрасте от З0 до 50 лет.
33979. ВЫПАДЕНИЕ ПРЯМОЙ КИШКИ (Пролапс прямой кишки) 28 KB
  ВЫПАДЕНИЕ ПРЯМОЙ КИШКИ Пролапс прямой кишки Выпадение прямой кишки прогрессирующее заболевание характеризующееся смещением стенок дистального отдела толстой кишки и выпадением выворачиванием их через заднепроходное отверстие. Длительно существующее выпадение приводит к выраженным морфологическим и функциональном изменениями в стенке кишки и её замыкательном аппарате. Выпадение влагалища и прямой кишки 176780. Этиология Производящие причины Повышение внутрибрюшного давления: тяжёлый физический труд затяжные роды упорные запоры...
33980. Полипы прямой кишки 23.5 KB
  Полипы прямой кишки. Гиперпластические полипы. Аденоматозные полипы. Согласно гистологическим критериям различают следующие виды аденоматозных полипов: тубулярные 6580 тубуловорсинчатые 1025 и ворсинчатые 510 Аденоматозные полипы являются предшественниками карциномы.
33981. Эндемический зоб 29.5 KB
  Эндемический зоб. Эндемический зоб. Диффузный зоб: семейная патология поддается терапии тироксином. Лекарственный зоб требует периодической отмены соответствующего препарата если это возможно если нет пациент получает тироксин.