TN003: Зіставлення Windows обробляє до об'єктів

Цієї записці описується MFC процедур, які підтримують відображення Windows об'єкт ручки на C++ об'єкти.

Проблема

Зазвичай Windows об'єктів представлені ОБРОБЛЯТИs. Класи MFC перенос Windows обробки об'єктів з C++ об'єктів. Дескриптор обтікання функції бібліотеки класів MFC надають можливість знайти об'єкт C++, що упаковка Windows об'єкт з ручкою зокрема. Є моменти, коли Windows об'єкт має C++ обгортки об'єкт, однак і в ці періоди, як C++ обгортки, створюється тимчасовий об'єкт.

Windows об'єкти, які використовують карти ручкою:

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

CWnd::FromHandle(hWnd)

повертає вказівник на CWnd переносом hWnd. Що hWnd має конкретні обгортку об'єкт, потім тимчасових CWnd створюється обернути hWnd. Це робить можливим отримати припустимого об'єкта C++ з будь-яку ручку.

Після обгортку об'єкта, ви можете отримати її ручку через громадських член змінну. У випадку з в CWnd m_hWnd містить HWND для цього об'єкта.

Властиві ручки MFC об'єктів

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

CWnd myWnd;
myWnd.Attach(hWnd)

Це робить запис в постійних карта, пов'язуючи myWnd і hWnd. Виклик CWnd::FromHandle(hWnd) тепер повертає вказівник до myWnd. Під час видалення myWnd , деструктора автоматично буде знищити до hWnd шляхом виклику функції Windows DestroyWindow . Якщо це не потрібно, hWnd повинен бути відділений від myWnd перед myWnd об'єкта знищено (як правило, коли залишивши сфери, в яких myWnd було визначено). Відкріпити член функція робить це.

myWnd.Detach()

Більше про тимчасові об'єкти

Тимчасових об'єктів створюються кожного разу, коли FromHandle надається маркером, який ще не містить обгортку об'єкта. Ці тимчасові об'єкти відірвані від їх ручку і видалили DeleteTempMap функції. За замовчуванням OnIdle обробки в CWinThread автоматично називає DeleteTempMap для кожного класу, який підтримує тимчасові ручкою карти. Це означає, що ви не вважати, що вказівник на тимчасове об'єкт будуть дійсні минуле точки виходу з функцію де він був отриманий, як тимчасовий об'єкт буде видалено під час простою повідомлення цикл Windows.

Обгортка об'єктів і декілька потоків

Тимчасові та постійні об'єкти зберігаються на основі на потік. Тобто, один потік неможливо отримати доступ до іншої теми C++ обгортки об'єктів, незалежно від того, чи це тимчасове або постійне. Як зазначено вище, тимчасових об'єктів видаляються після нитка, яка належить тимчасові об'єкта входить OnIdle.

Пройти ці об'єкти з одного потоку на інший, завжди надсилання їх як свої рідні ОБРОБЛЯТИ введіть. Часто проходять на C++ обгортки об'єкт з одного ланцюжка призведе до несподіваних результатів.

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index