TN003: Сопоставление дескрипторов окон к объектам
Эта заметка описывает процедуры MFC, поддерживающие маркеры объекта окна сопоставления объектов C++.
Проблема
Объекты windows обычно представлены различными объектами МАРКЕР объект окна " использование программы-оболочек классов MFC обрабатываются с объектами C++.Дескриптор создавая программу-оболочку функции библиотеки классов MFC препятствовал необходимо найти объект C++, который создает программу-оболочку объект окон, который содержит указанный маркер.Однако иногда объект не является владельцем объекта программы-оболочки C++ и в этих случаях система создает временный объект для использования в качестве программа-оболочка C++.
Объекты окон, что сопоставления маркеров использования следующим образом:
HWND (CWnd и CWnd- производные классы)
HDC (CDC и CDC- производные классы)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
СОКЕТ (CSocket)
Получив дескриптор до любой из этих объектов можно найти объект MFC, который создает дескриптор программу-оболочку с помощью статического метода FromHandle.Например, если HWND вызвать hWnd, следующая линия возвращает указатель на CWnd, который создает программу-оболочку hWnd:
CWnd::FromHandle(hWnd)
Если hWnd не имеет определенный объект программы-оболочки, то создается временное CWnd для создания hWnd программу-оболочку.Это делает возможным получить объект допустимым C++ из любого дескриптора.
После создания объект программы-оболочки, можно извлекать его дескриптор из переменной члена класс-оболочки public.В случае CWnd, m_hWnd содержащее HWND для этого объекта.
Вложения маркеров к объектам MFC
При наличии вновь созданный объект маркер-программы-оболочки и дескриптор объекта windows, можно связать 2 путем вызова функции Attach как показано в следующем примере:
CWnd myWnd;
myWnd.Attach(hWnd);
Это делает запись в постоянном сопоставлении связывание myWnd и hWnd.Вызов CWnd::FromHandle(hWnd) теперь возвращает указатель на myWnd.При myWnd будет удалено, деструктор автоматически разрушит hWnd путем вызова функции DestroyWindow windows.Если это не hWnd необходимости, то необходимо удалить из myWnd, прежде чем myWnd удалено (обычно оставляя область, в которой было указано myWnd ).Метод Detach делается.
myWnd.Detach();
Дополнительные сведения о временных объектов
Временные объекты создаются при значении FromHandle дескриптор, который уже не является владельцем объекта программы-оболочки.Эти временные объекты и, наконец, удаляются из них удаляются и функциями DeleteTempMap.По умолчанию CWinThread::OnIdle автоматически вызывает DeleteTempMap для каждого класса, который поддерживает временные сопоставления маркеров.Это означает, что невозможно получить указатель к временному объекту будет допустимым с точки выйти из функций, где был получен указатель.
Объекты и несколько потоков программы-оболочки
Постоянных и временных, а объекты поддерживаются отдельно для каждого потока.Иными словами, один поток не может получить доступ к объектам программы-оболочки C++ другого потока, независимо от того, является ли он является временным или постоянным.
Чтобы передать эти объекты от одного потока к другому всегда отправить их как свой собственный тип HANDLE.Передача объект программы-оболочки C++ из одного потока к другому часто будет приводить к непредвиденным результатам.