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

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


 

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

40168. АРИФМЕТИКО-ЛОГИЧЕСКИЕ УСТРОЙСТВА 190 KB
  Представляют собой логическое комбинационное устройство предназначенное для выполнения операции арифметического сложения чисел представленных в виде двоичных кодов. 1 Сложение двух одноразрядных двоичных кодов. Функцию S называют функцией исключения ИЛИ или суммой по модулю два которую необходимо выполнить для суммирования двух двоичных одноразрядных кодов. 2 Сложение разрядов многоразрядных двоичных кодов.
40169. БАЗОВЫЕ ЛОГИЧЕСКИЕ ЭЛЕМЕНТЫ 298 KB
  1 Пример обозначения базовых логических элементов БЛЭ: 15.2 Основные сведения о БЛЭ Способы представления логических переменных: 1 Потенциальный способ  значениям логических 0 и 1 соответствуют два различных уровня напряжения и тока в связи с чем различают положительную и отрицательную логики. Основные свойства БЛЭ: 1 Нагрузочная способность ЛЭ  свойство получать сигнал от нескольких ЛЭ и одновременно быть источником информации для других элементов.3 БЛЭ транзисторнотранзисторной логики ТТЛ Схемы ТТЛ состоят из двух базовых...
40170. ГЕНЕРАТОРЫ НА ЛОГИЧЕСКИХ ЭЛЕМЕНТАХ И ТАЙМЕРЫ 766.5 KB
  Для защиты элемента ТТЛ от действия напряжения отрицательной полярности в его входной цепи установлен обратно включенный диод, который шунтирует резистор время задающей цепи. Длительность интервалов tи и Tг определяется
40171. СХЕМОТЕХНИКА УСИЛИТЕЛЬНЫХ УСТРОЙСТВ НА ТРАНЗИСТОРАХ 531 KB
  Класс применяется только в маломощных каскадах предварительных усилителях для которых К. около 07; 2 используется в усилителях средней и большой мощности; Рис.1 Входная характеристика каскада с ОЭ а; Выходная характеристика каскада с ОЭ б; Характеристика каскада в режиме А в; Характеристика каскада в режиме В г 3 происходит усиление только одной положительной полуволны усиливаемого сигнала UВХ поэтому выходной имеет прерывистый характер; недостатком является значительные нелинейные искажения UВЫХ называются...
40172. ОПЕРАЦИОННЫЕ УСИЛИТЕЛИ 328 KB
  Наличие этого напряжения приводит к нарушению условия согласно которому Uвых.V характеризует частотные свойства усилителя при его работе в импульсных схемах измеряется при подаче на вход ОУ напряжения ступенчатой формы.3 Схема трехкаскадного ОУ Входной дифференциальный усилительный каскад уменьшает величину дрейфа усилителя позволяет получить высокое усиление высокое входное сопротивление и максимально подавить действующие на входе синфазные составляющие обусловленные изменением температуры окружающей среды изменением напряжения...
40173. АКТИВНЫЕ ФИЛЬТРЫ 83 KB
  Необходимо чтобы ОУ охваченный ООС обеспечивал заданный коэффициент усиления как в полосе пропускания. Основной параметр: полоса пропускания которая определяется по уровню падения коэффициента передачи в 141 раза на 3дб. Ширина полосы пропускания изменяется варьированием RC. Коэффициент передачи в полосе пропускания постоянный и равен Кио.
40174. ГЕНЕРАТОРЫ 102 KB
  По форме выходного напряжения классифицируются: генераторы гармонических колебаний и генераторы негармонических колебаний импульсные или релаксацоинные. Ku=U2 U1=Kuωejφkω где Kuω=U2ω U1ω модуль коэффициента усиления на частоте ω; φkω=ψ2ωψ1ω сдвиг фаз между выходным и входным напряжениями Ku на частоте ω; Bu=U1 U2=Buωejφbω где Buω=U1ω U2ω модуль коэффициента передачи на частоте ω; φbω=ψ1ωψ2ω сдвиг фаз между выходным и входным напряжениями четырёхполюсника Bu на частоте ω. Если на входе...
40175. ИСТОЧНИКИ ВТОРИЧНОГО ЭЛЕКТРОПИТАНИЯ 269 KB
  Классификация: 1 устройства согласования уровня напряжения служат для преобразования постоянного или переменного напряжения одного уровня в напряжение другого уровня. 2 устройства согласования стабильности напряжения: сглаживающие фильтры служат для стабилизации мгновенного значения пульсирующего напряжения тока и стабилизаторы служат для стабилизации среднего значения выходного тока напряжения или мощности. 3 устройства согласования частоты: выпрямители преобразователи напряжения переменного тока в напряжение содержащее...
40176. Портфельное инвестирование 24.5 KB
  Если у вас куплены акции двух и более разных компаний из разных отраслей то такое инвестирование можно назвать портфельным. Чтобы достичь успеха в портфельном инвестировании необходимо грамотно подбирать бумаги компаний. Если инвестор нацелен на получение максимальной прибыли то и риски будут весьма велики в такой портфель войдет большинство примерно 8090 процентов акции молодых динамично развивающихся компаний с большими перспективами роста. Когда вы нацелены на хорошую прибыль но не готовы принять на себя большие риски тогда...