Цієї записці описується підтримка MFC для користувача і self-drawing контролю. Динамічна subclassing також описав. Загальні консультації стосовно власності CWnd об'єктів проти HWNDs представлена.
Зразок застосунку MFC CTRLTEST ілюструє багато хто з цих особливостей. Будь ласка, зверніться до вихідного коду для MFC Генеральний зразок CTRLTEST і онлайн-довідка.
Власник нічия контролю/меню
Windows підтримує "власник розіграшу" елементи керування та меню. Це Windows повідомлення надіслано до вікна батьківського елемента керування або меню, що дозволяють налаштувати зовнішній вигляд і поведінку керування або меню.
MFC безпосередньо підтримує власник внічию з повідомлення карта записи:
Ви можете змінити їх у ваш CWnd-отриманих класу (зазвичай діалогове вікно або основні рамки вікна), для виконання поведінки власника нічия.
Такий підхід не призведе до повторного використання коду. Якщо у вас є два подібних елементів керування в двох різних діалогів, ви повинні виконати митного контролю поведінки в двох місцях. Підтримується MFC self-drawing керування архітектура вирішує цю проблему.
Self-Drawing елементи керування та меню
MFC замовчуванням реалізація (в CWnd і CMenu) забезпечує стандартний власник нічия повідомлень. Це за замовчуванням реалізація декодування власник нічия параметрів і делегувати власник нічия повідомлень, які елементи керування або меню. Це називається "self-draw" тому що малювання (/ вимірювання/порівняння) код в класі керування або меню, не у вікні власника.
Це дозволяє побудувати багаторазового контролю класи, які відображення елемента керування за допомогою «власник намалювалася» семантики. Код для малювання керування, не власник елемента керування, є в класі контролю. Це об'єктно орієнтований підхід до настроюваного елемента керування програмування.
CButto&n:DrawItem(LPDRAWITEMSTRUCT);
nbsp; / / Нічия цієї кнопки
CMe&nu:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp; / / вимірювання розміру елемента в цьому меню
CMenu:DrawItem(LPDRAWITEMSTRUCT);
/ / Нічия елемента в цьому меню
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / вимірювання розміру елемента в цьому списку
CListBox:DrawItem(LPDRAWITEMSTRUCT);
/ / Нічия пункту в цьому списку
CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / порівняти два елементи цього списку, якщо LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / видалити повідомлення з цього списку
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / вимірювання розміру елемента у це поле зі списком
CComboBox:DrawItem(LPDRAWITEMSTRUCT);
/ / намалювати елемент у цьому полі зі списком
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / порівняти два елементи в цьому полі зі списком, якщо CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / видалити елемент із цього поля зі списком
Докладну інформацію про власника нічия структур (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTта DELETEITEMSTRUCT) зверніться до документації MFC для CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItemта CWnd::OnDeleteItem відповідно.
За допомогою self-drawing елементів керування та меню
Для self-drawing меню ви повинні змінити MeasureItem і DrawItem функції члена.
Для self-drawing списків і полів зі списком, ви повинні змінити, MeasureItem і DrawItem. Необхідно вказати стиль OWNERDRAWVARIABLE у діалоговому шаблон (LBS_OWNERDRAWVARIABLE і CBS_OWNERDRAWVARIABLE відповідно). Стиль OWNERDRAWFIXED не буде працювати з self-drawing елементів, оскільки висота фіксованого елемента визначається, перш ніж self-drawing елементи керування додаються до списку. (3.1 Виграти член функції CListBox::SetItemHeight , і CComboBox::SetItemHeight можуть бути використані, щоб обійти це обмеження).
Крім того, зверніть увагу, що перехід на OWNERDRAWVARIABLE -стилю вплине на NOINTEGRALHEIGHT стилю. Тому, що елемент керування не можна обчислити невід'ємною висота зі змінним розміром елементів, стандартний стиль INTEGRALHEIGHT ігнорується, і це завжди NOINTEGRALHEIGHT. Якщо елементи є Фіксована висота, можна заборонити часткового елементи розробляється, вказавши розмір елемента керування бути невід'ємною частиною множник розміру елемента.
Для self-drawing списку поля та поля зі списком СОРТУВАННЯ стиль (LBS_SORT і CBS_SORT відповідно), ви повинні змінити CompareItem функції члена.
Для self-drawing списків і полів зі списком, DeleteItem не зазвичай заміщений. DeleteItem можуть бути змінені, якщо додаткової пам'яті або інших ресурсів збережені з кожного списку або поля зі списком вікні пункт.
Приклади Self-Drawing контролю/меню
Генеральний MFC зразок CTRLTEST забезпечує зразки self-draw меню (показані кольорів) та self-draw списку (також показані кольорів).
Найбільш типовий приклад self-drawing кнопки є крапковий малюнок кнопки (кнопки, яка показує одну, дві або три растрових зображень для різних Штатів). Це передбачено в класі MFC CBitmapButton.
Динамічна Subclassing
Subclassing є термін Windows для заміни WndProc вікна з різними WndProc і закликаючи старі WndProc функціональність (суперкласу).
Це не слід плутати з C++ клас диференціювання (C++ термінології використання слова "базу" і "похідні", хоча моделі об'єкта Windows використовує «супер» і «південь»). Диференціювання C++ з MFC і Windows subclassing є функціонально дуже схоже, за винятком C++ підтримує функцію аналогічні динамічної subclassing.
CWnd клас забезпечує зв'язок між на C++ об'єкт (походить від CWnd) і Windows вікні об'єкта (також відомий як на HWND).
Існують три поширених способів це пов'язано:
Цей останній випадок робиться з функцій-членів:
Обидва процедур вкладати CWnd об'єкт існуючі Windows HWND. SubclassWindow приймає HWND безпосередньо, і SubclassDlgItem є допоміжні, що приймає керування ID і вікна батьків (зазвичай діалогового вікна). SubclassDlgItem призначена для кріплення C++ об'єктів діалоговому контролю, створений із шаблону діалогове вікно.
Будь ласка, зверніться до на CTRLTEST приклад для кілька прикладів використання SubclassWindow і SubclassDlgItem.
Технічні примітки за номером |nbsp; Технічні примітки за категоріями