TN014: Настроюваних елементів керування

Цієї записці описується підтримка MFC для користувача і self-drawing контролю. Динамічна subclassing також описав. Загальні консультації стосовно власності CWnd об'єктів проти HWNDs представлена.

Зразок застосунку MFC CTRLTEST ілюструє багато хто з цих особливостей. Будь ласка, зверніться до вихідного коду для MFC Генеральний зразок CTRLTEST і онлайн-довідка.

Власник нічия контролю/меню

Windows підтримує "власник розіграшу" елементи керування та меню. Це Windows повідомлення надіслано до вікна батьківського елемента керування або меню, що дозволяють налаштувати зовнішній вигляд і поведінку керування або меню.

MFC безпосередньо підтримує власник внічию з повідомлення карта записи:

Ви можете змінити їх у ваш CWnd-отриманих класу (зазвичай діалогове вікно або основні рамки вікна), для виконання поведінки власника нічия.

Такий підхід не призведе до повторного використання коду. Якщо у вас є два подібних елементів керування в двох різних діалогів, ви повинні виконати митного контролю поведінки в двох місцях. Підтримується MFC self-drawing керування архітектура вирішує цю проблему.

Self-Drawing елементи керування та меню

MFC замовчуванням реалізація (в CWnd і CMenu) забезпечує стандартний власник нічия повідомлень. Це за замовчуванням реалізація декодування власник нічия параметрів і делегувати власник нічия повідомлень, які елементи керування або меню. Це називається "self-draw" тому що малювання (/ вимірювання/порівняння) код в класі керування або меню, не у вікні власника.

Це дозволяє побудувати багаторазового контролю класи, які відображення елемента керування за допомогою «власник намалювалася» семантики. Код для малювання керування, не власник елемента керування, є в класі контролю. Це об'єктно орієнтований підхід до настроюваного елемента керування програмування.

Докладну інформацію про власника нічия структур (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; Технічні примітки за категоріями

Index