69275

Елементи керування

Лекция

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

Щоб краще зрозуміти, як саме MFC забезпечує підтримку елементів управління ймовірно, було б цікаве розглянути процес створення елементів управління безвідносно до MFC. Звернете увагу, практично будь-який прямокутник, що відображається на екрані, здатний взаємодіяти з користувачем, є вікно.

Украинкский

2014-10-02

53 KB

0 чел.

Лекція № 17

Тема: Елементи керування

План:

  1.  Елементи управління -  вікна
  2.  Асоціація класів MFC з елементами управління
  3.  Застосування функції GetDlgltem

Елементи управління - це теж вікна

Щоб краще зрозуміти, як саме MFC забезпечує підтримку елементів управління ймовірно, було б цікаве розглянути процес створення елементів управління безвідносно до MFC. Звернете увагу, практично будь-який прямокутник, що відображається на екрані, здатний взаємодіяти з користувачем, є вікно. Тут маються на увазі кнопки, поля редагування, звичайні списки, що розкриваються. Щоб створити елементи управління, використовуються ті ж самі функції Win32 CreateWindow і CreateWindowEx, які використовуються для створення будь-яких інших вікон.

Звернете увагу на стандартний прототип функції CreateWindow:

HWND CreateWindow(

LPCTSTR lpClassName // зареєстроване ім'я класу

LPCTSTR lpWindowName // ім'я вікна

DWORD dwStyle // стиль вікна

int х II горизонтальна позиція вікна

int у // вертикальна позиція вікна

int nWidth // ширина вікна

int nHeight // висота вікна

HWND hWndParent // дескриптор батьківського вікна

HMENU hMenu // дескриптор меню

Нinstance hlnstance // дескриптор екземпляра додатку

LPVOID lpParam // дані для створення вікна

) ;

Перший параметр функції CreateWindow — це ім'я класу вікна (window class name). Класу кожного загального елементу управління (common control) привласнено унікальне ім'я. При запуску операційної системи Windows здійснюється виклик функції RegisterClass, що дозволяє асоціювати процедуру вікна (window procedure) з класом вікна кожного із загальних елементів управління. Потім, при зверненні до функції CreateWindow, операційній системі Windows вже буде відомо, яку саме процедуру вікна необхідно викликати, щоб створити таке вікно, і куди послати повідомлення, адресовані цьому вікну. Імена класів загальних елементів управління визначені у файлі CommCtrl.h. Нижче приведений фрагмент файлу CommCtrl.h, у якому визначено ім'я класу для елементу управління поле введення (edit control). Звернете увагу, для кожного елементу управління існують дві версії імені класу: для UNICODE і для ASCII.

// Ім'я класу поля введення

#define WC_EDITA "Edit"

#define WC_EDITW L"Edit"

#ifdef UNICODE

#define WC_EDIT WC_EDITW

fielse

#define WC__EDIT WC_EDITA

#endif

#else

#define WC_EDIT "Edit"

#endif

Але як все це пов'язано з обговорюваними елементами управління MFC? Насправді, щоб краще зрозуміти, як саме працюють елементи управління MFC, дуже важливо виразно уявляти, що саме класи MFC роблять самостійно, а, отже, що вони приховують від користувача.

Для кожного із загальних елементів управління в бібліотеці MFC визначений клас C++. Наприклад, існує клас CEdit, що є оболонкою елементу управління поле введення (edit control); клас CButton є оболонкою елементу управління кнопка (button) і так далі Класи всіх елементів управління є похідними від базового класу CWnd, в якому визначена змінна-член m_hwnd, що є дескриптором фактичного вікна, яким можна управляти за допомогою функцій і змінних-членів цього класу.

Табл. містить список даних елементів управління, імена відповідних ним класів вікон, а також класів MFC, використовуваних для маніпулювання цими елементами управління і реалізації обробників подій для них. Наступний розділ демонструє, як асоціювати клас елементу управління MFC з певним елементом управління під час виконання додатку.

Таблиця Класи елементів управління Windows

Елемент управління  Класи MFC   Класи Windows 

Кнопка (Button)  CButton   BUTTON

Звичайний список (List box) CListBox   LISTBOX

Поле введення (Edit control) CEdit    EDIT

Список, що розкривається

(Combo box)  CComboBox  COMBOBOX

Асоціація класів MFC з елементами управління

Класи елементів управління MFC виконують дві дуже важливі завдання. В першу чергу за допомогою своїх функцій-членів вони надають засоби для передачі повідомлень головному вікну. Наприклад, щоб додати в елемент управління список, що розкривається, нове строкове значення за допомогою SDK. Win32, довелося б послати йому відповідне повідомлення. Це можна зробити таким чином:

HWND hwnd = ::GetDlgltem (hvmdDialog, IDC__COMB01);

::SendMessage (hwnd, CB_ADDSTRING, 0L, (LPARAM) "GetDlgItem");

Те ж саме завдання, але за допомогою класу-оболонки елементу управління (а саме CComboBox), можна було б виконати таким чином:

combobox.AddString(“GetDlgItem”);

Мається на увазі, що з елементом управління список, що розкривається, вже асоційована змінна combobox.

Це найпростіша частина, оскільки, як тільки клас MFC буде асоційований з певним елементом управління (не забувайте, що його базовий клас CWnd володіє змінною-членом, призначеною для зберігання дескриптора HWND елементу управління), маніпулювати їм досить просто, тому що при виклику певних функцій-членів цього класу елементу управління передаються відповідне повідомлення. Нижче приведена фактична реалізація функції-члена CComboBox::AddString (розташованою у файлі afxwin2 . inl).

_AFXWIN_INLINE int CComboBox::AddString(LPCTSTR IpszString)

{

ASSERT(::IsWindow(m_hWnd));

return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM) IpszString);

}

Далі приводиться список переваг застосування класів MFC для елементів управління в порівнянні з SDK Win32.

- Не потрібно визначати значення дескриптора HWND, оскільки клас елементу управління зберігає його у відповідній змінній-членові (при його приєднанні до фактичного елементу управління).

-  Не потрібно запам'ятовувати точне повідомлення (в даному випадку CB_ADDSTRING). Замість нього можна використовувати більш описові, інтуїтивно зрозумілі імена функцій-членів (наприклад, AddString).

- Невживані параметри (в даному випадку WPARAM, наприклад) у функціях-членах класів не застосовуються. Замість них функція-член посилає значення за умовчанням.

Ще однією важливою перевагою, що надається класами елементів управління, є полегшена обробка подій елементів управління. Застосування SDK Win32 має на увазі створення власного циклу обробки повідомлень, що включає перевірку ідентифікатора кожного повідомлення, що поступило, на відповідність ідентифікатору кожного елемент управління, а також створення обробника для кожного підмета обробці повідомлення. Класи MFC для елементів управління, навпаки, інкапсулюють процедуру вікна елементу управління, перехоплюють повідомлення, призначені для цього вікна, а також перенаправляють їх карті повідомлень класу і, кінець кінцем, необхідним обробникам, яких реалізує базовий клас або перевизначає клієнтський код.

З'ясувавши, що саме класи елементів управління MFC здійснюють самостійно, залишилося з'ясувати, як асоціювати клас елементу управління з самим елементом управління. Це можна здійснити декількома способами.

- За допомогою функції GetDlgltem.

- За допомогою DDX і шаблону елементу управління діалогового вікна.

- За допомогою виклику методу Attach і шаблону елементу управління діалогового вікна.

- За допомогою динамічного створення елементу управління і подальшого виклику методу Attach.

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

Застосування функції GetDlgltem

Функцію CWnd::GetDlgltem викликають зазвичай з функцій класу CDialog для того, щоб отримати покажчик класу (типу) елементу управління на елемент управління, розташований в діалоговому вікні.

 

CWnd* CWnd::GetDlgItem(int nID) const;

void CWnd::GetDlgItem(int nID, HWND* phWnd) const;

Як можна відмітити, існують дві переобтяжені версії цієї функції. Першій версії передають тільки один параметр — ідентифікатор ресурсу елементу управління, а повертає вона покажчик класу CWnd. Цей покажчик можна привести до типу необхідного класу. Друга версія цієї функції використовується в тих ситуаціях, коли доводиться поклопотатися про отримання дескриптора HWND для елементу управління.

Тепер розглянемо застосування цієї функції. У проекті демонстраційного додатку ControlAttaching перетягнете з панелі інструментів в шаблон головного діалогового вікна додатку елемент управління тієї, що розкривається список (combo box). Звернете увагу, за умовчанням для елементу управління заданий ідентифікатор IDC_C0MB01. Цього значення і потребує функція GetDlgltem Потім додайте в діалогове вікно кнопку (з ідентифікатором IDC GETDLGITEM), яка використовуватиметься для додавання нового рядка в список, що розкривається.

Додайте обробник події клацання на кнопці Using GetDlgltem (Застосування функції GetDlgltem), а також наступний код:

void CControlAttachingDlg::OnBnClickedGetDlgItem()

{

CComboBox* рCbo = (CComboBox*)GetDlgltem(IDC_COMB01);

ASSERT(pCbo);

if (pCbo)

{

pCbo->AddString("GetDlgItem-l");

pCbo->SetCurSel(0);

}

}

Виконання цієї коди повинне привести до додавання в список, що розкривається, рядка GetDlgltem-1" і вибору її в цьому елементі управління. Управляти елементом управління дозволяє функція GetDlgltem, але як реагувати на його події? Як буде продемонстровано в наступному розділі, це дозволяє зробити функція Attach.


 

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

29953. Чрезвычайные ситуации природного характера. Общая характеристика чрезвычайных ситуаций природного характера, их классификация 31.5 KB
  Общая характеристика чрезвычайных ситуаций природного характера их классификация Ответ: Чрезвычайная ситуация природного характера это неблагоприятная обстановка на определенной территории сложившаяся в результате опасного природного явления которое может повлечь за собой человеческие жертвы ущерб здоровью людей материальные потери и нарушение условий жизнедеятельности населения. Классификация чрезвычайных ситуаций природного характера: Ситуации геофизического характера извержения вулканов и землетрясения; Ситуации...
29954. Природные чрезвычайные ситуации геологического происхождения: землетрясения, извержения вулканов, оползни и обвалы. Их последствия, мероприятия по защите населения! 36.5 KB
  Наиболее типичные последствия землетрясений: опасные геологические явления обвалы камнепады оползни снежные лавины сели; цунами сейши наводнения; пожары; паника; травмирование и гибель людей; повреждение и разрушение сооружений и зданий; выбросы радиоактивных аварийно химически опасных и других вредных веществ; транспортные аварии и катастрофы; нарушение работы систем жизнеобеспечения. Меры по защите населения от землетрясений: строительство на территориях подверженных землетрясениям сейсмостойких сооружений и...
29955. Природные чрезвычайные ситуации метеорологического происхождения: ураганы, бури, смерчи и их последствия; меры, принимаемые по защите населения 34.5 KB
  Последствиями воздействия ураганов бурь и смерчей являются повреждение и разрушение зданий и сооружений линий электропередачи и связи заносы и завалы на дорогах уничтожение посевов сельскохозяйственных культур повреждение и гибель кораблей. Чаще всего они поражаются летящими предметами и обрушивающимися конструкциями зданий и сооружений. Меры по защите от ураганов бурь и смерчей: точный прогноз и своевременное оповещение населения; уменьшение воздействия вторичных поражающих факторов пожаров прорывов плотин аварий на различных...
29956. Природные чрезвычайные ситуации биологического происхождения: эпидемии, эпизоотии, эпифитотии; меры, принимаемые по защите населения 43 KB
  Эпизоотия это одновременное прогрессирующее во времени и пространстве в пределах определенного региона распространение инфекционной болезни среди большого числа одного или нескольких видов животных значительно превышающее обычно регистрируемый на данной территории уровень заболеваемости. Эти чрезвычайные ситуации возможны при наличии и взаимодействии трех непременных элементов: возбудителя инфекционной болезни путей его передачи и восприимчивых к этому возбудителю людей животных и растений. Основные мероприятий направленные на...
29957. Теоретические подходы к изучению мышления в зарубежной психологии 53 KB
  Теоретические подходы к изучению мышления в зарубежной психологии Мышление это процесс познавательной деятельности индивида включает в себя анализ синтез обобщение условий и требований решаемой задачи и способов ее решения. В настоящее время мышление изучается не только психологией но и философией логикой физиологией кибернетикой лингвитсикой. Мышление как ассоциация представлений Психология мышления стала специально разрабатываться лишь в XX в. Поэтому представители ассоциативной психологии не считали нужным специально исследовать...
29958. Теоретические подходы к изучению мышления в отечественной психологии 59 KB
  Теоретические подходы к изучению мышления в отечественной психологии. Развитие мышления ребенка происходит постепенно. Генетически наиболее ранняя форма мышления нагляднодейственное мышление появляется в конце первого начале второго года жизни еще до овладения им активной речью. Связь мышления с практическими действиями хотя и сохраняется но не является такой тесной прямой и непосредственной как раньше.
29959. Творческое мышление как предмет исследования в психологии 43.5 KB
  Продуктивная умственная деятельность не обеспечивается только свойствами интеллекта она определяется качествами мышления и личной позицией занимаемой субъектом по отношению к своей деятельности. Проблема изучения продуктивного творческого мышления. На основе модели были сконструированы южнокалифорнийские тесты RP тесты творческого мышления Торренса. Выделил 4 особенности творческого мышления: оригинальность семантическая гибкость способность видеть новое спонтанная гибкость способность дальновидения.
29960. Учение о развитии интеллекта Ж.Пиаже и других представителей швейцарской школы 51 KB
  Развитие операционального интеллекта в концепции Пиаже. Позднее Пиаже при изучении детского мышления больше фокусируется на анализе самих действий основными для Пиаже становятся исследования систем операций интеллекта. Важнейшее открытие Пиаже открытие эгоцентризма ребенка как центральной особенности мышления скрытой умственной позиции и как следствие своеобразие детской логики детской речи детских представлений о мире. Феномены Пиаже: 1.
29961. Психологическая сущность и механизмы воображения 45.5 KB
  Воображение и его развитие в детском возрасте Рибо Т. В основе способности к предвосхищению лежит воображение. В старой психологии существовала точка зрения согласно которой воображение не рассматривается как самостоятельный психический процесс поскольку преобразование образа и открытие нового традиционно выделяемые в качестве основных признаков воображения являются необходимыми сторонами любого процесса чувственного отражения действительности и функциями всех психических процессов Вундт Т. Рибо: воспроизводящее воображение = памяти...