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), приведе до помилки, оскільки Вона застосовується лише до першого елементу в групі перемикачів.

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


 

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

73081. Теории развития культуры в эпоху Просвещения. Д.Вико и И.Гердер 36.5 KB
  Просветителей интересовала возможность духовного совершенствования человека, взаимопонимания народов. Эти идеи оказали значительное влияние на развитие общественной мысли. Вместе с тем в 19-20 вв. идеология Просвещения нередко подвергалась критике за идеализацию человеческой природы...
73082. РЕЧЕВЫЕ АКТЫ В СТАНДАРТНОЙ ТЕОРИИ 90 KB
  Речевой акт в понимании Дж. Остина Первой своей задачей при создании теории речевых актов Дж. Остин считал выяснение характера отношений между констативными и перформативными высказываниями и условий удачности перформативов.
73083. Социальная философия и теоретическая социология 272 KB
  В противоположность кайресу следует обозначить состояние которе метафорически можно назвать исторической дремотой сном истории. Сон истории -– это период когда как кажется ничего не происходит. Это и есть ритм истории. Факторы исторического процесса и их соотношение...
73084. Вывод (доказательство) в логике 31.5 KB
  Вывод доказательство в логике: вывод и вывод из данных формул в аксиоматическом исчислении высказываний прямое и косвенное доказательство в системах естественного вывода. Доказательство логическая форма мысли обосновывающая истинность того или иного положения посредством других положений...
73085. Политика снижения рождаемости, ее результативность в разных странах 23.47 KB
  Политика одного ребёнка на одну семью (или одна семья — один ребёнок) — демографическая политика Китая. Китай был вынужден законодательно ограничить размер семьи в 1970-х годах, когда стало понятно, что огромное количество людей перегружает земельные, водные и энергетические ресурсы страны.
73086. Демографическая ситуация в экономически развитых странах мира (на примерах Европейских стран, Североамериканских, Тихоокеанских) 23.59 KB
  Население планеты постоянно растет. Самые быстрые темпы роста численности населения по-прежнему сохраняются в группе из 50 наименее развитых стран: 95% всего прироста численности населения мира приходится на данные регионы, и лишь 5% — на более развитые.
73088. Темпы роста населения мира. Модель Мальтуса 18.56 KB
  Томас Мальтус родился 13 февраля 1766 года в имении Рукери, Доркинг (английское графство Суррей), близ города Гилдфорд, в состоятельной дворянской семье. Отец учёного, Дэниел Мальтус, был последователем Давида Юма и Жан-Жака Руссо (с обоими он был лично знаком).
73089. Безопасность и санитарно-гигиенические требования к технологическим процессам и оборудованию 28.5 KB
  При разработке и организации технологических процессов и конструировании производственного оборудования станков машин аппаратуры инструментов и пр. Основными направлениями в организации технологических процессов при конструировании и модернизации оборудования обеспечивающими указанные...