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

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


 

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

28162. Основные направления и этапы развития человека как субъекта труда. (Е.А. Климов) 209 KB
  Развитие в период выбора профессии проектирования профессионального старта и жизненного пути 4. Приблизительность связана с тем что некоторые дети уже с 15 лет приступают к профессиональному обучению переходят на основе неполного общего образования в систему среднего специального профтехнического профессионального образования а некоторые делают это после окончания полной средней школы; впрочем в последнем случае учебная деятельность уже в старших классах приобретает смысл подготовки к будущей профессии и становится своего рода...
28163. Профессиональные деформации 32 KB
  Многолетнее выполнение любой профессиональной деятельности приводит к образованию деформаций личности снижающих продуктивность осуществления трудовых функций а иногда и затрудняющих этот процесс. Все многообразие факторов детерминирующих профессиональные деструкции можно разделить на три группы: объективные связанные с социальнопрофессиональной средой: социальноэкономической ситуацией имиджем и характером профессии профессиональнопространственной средой; субъективные обусловленные особенностями личности и характером профессиональных...
28165. Корпускулярно-волновой дуализм. Гипотеза Луи де-Бройля. Опыты по дифракции микрочастиц и их интерпретация 109 KB
  Гипотеза Луи деБройля. Такие волны получили название фазовых волн волн вещества или волн де Бройля. Так как частица и волна де Бройля являются различными аспектами одного и того же физического объекта то между ними должна существовать однозначная связь; релятивистски инвариантным соотношением между 4векторами характеризующими частицу и соответствующую ей волну де Бройля является формула 2 или ; . 3 Выражения 3...
28166. ПОНЯТИЕ КВАНТОВОГО СОСТОЯНИЯ ВОЛНОВАЯ ФУНКЦИЯ. СООТНОШЕНИЕ НЕОПРЕДЕЛЕННОСТИ 100.5 KB
  Так функцией состояния свободной частицы является плоская монохроматическая волна де Бройля . 1 Для частицы подверженной внешнему воздействию например для электрона в поле ядра это волновое поле может иметь весьма сложный вид. Волновая функция зависит от параметров микрочастицы и от тех физических условий в которых частица находится. Согласно статистической интерпретации волн де Бройля вероятность локализации частицы определяется интенсивностью волны де Бройля так что...
28167. УРАВНЕНИЕ ШРЁДИНГЕРА. ПРЯМОУГОЛЬНАЯ ПОТЕНЦИАЛЬНАЯ ЯМА. ГАРМОНИЧЕСКИЙ ОСЦИЛЛЯТОР. ТУННЕЛЬНЫЙ ЭФФЕКТ 216 KB
  Решением стационарного УШ является функция состояния частицы . Потенциальная яма – это область пространства в которой потенциальная энергия частицы меньше чем за ее пределами. Рассмотрим решение стационарного УШ для частицы находящейся в бесконечно глубокой одномерной потенциальной яме. Найдем функции состояния и значения энергии отвечающие возможным состояниям частицы в этом потенциальном поле.
28168. Магнитные свойства атомов. Опыты Штерна и Герлаха. Спин электрона. Спектроскопические проявления спина электрона 145 KB
  Спин электрона. Спектроскопические проявления спина электрона Природа магнетизма явления известного еще с начала XIX века была понята только после создания квантовой механики. Орбитальное движение электрона движение относительно ядра атома характеризуется магнитным моментом . 1 Здесь ‒ гиромагнитное отношение 2 где m масса электрона е – модуль заряда электрона момент импульса электрона модуль которого квантуется по правилу .
28169. Принцип тождественности неразличимых микрочастиц. Бозоны и фермионы. Проблема гелия 145.5 KB
  Проблема гелия В основе исследования сложных атомов как и атома водорода также лежит уравнение Шредингера решением которого является функция состояния атома. Однако теперь функция состояния зависит от пространственных координат всех электронов атома и от времени. Для получения правильной функции состояния системы электронов необходимо учитывать принцип тождественности неразличимых частиц. Суть это принципа состоит в следующем: В силу неразличимости частиц состояния системы получающиеся друг из друга перестановкой обеих частиц должны быть...
28170. Многоэлектронные атомы. Электронные оболочки атома и их заполнение. Физическое объяснение периодического закона. Рентгеновские спектры атомов 186.5 KB
  Электронные оболочки атома и их заполнение. Такая одноэлектронная собственная функция атома называется атомной спинорбиталью АО. При рассмотрении многоэлектронного сложного атома можно воспользоваться приближением центрального поля. Однако в сложных атомах энергия электронов зависит как от главного квантового числа так и от орбитального квантового числа то есть происходит снятие вырождения по .