В настоящей записке описывается 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, можно связать два вызывая Attach. Например:
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; Технические примечания по категориям