다음을 통해 공유


TN003: Windows의 매핑 개체를 처리 하

MFC는이 참고 설명 Windows 매핑 지원 루틴 C++ 개체의 핸들을 개체입니다.

문제

Windows 개체는 일반적으로 표시 하면 다양 한 처리 개체는 MFC 클래스 C++ 개체와 Windows 개체 핸들을 배치 합니다.MFC 클래스 라이브러리의 함수를 래핑하는 핸들 특정 핸들을 갖는 Windows 개체를 래핑하는 C++ 개체를 찾을 수 있습니다.그러나 때로는 개체는 C++ 래퍼 개체 없고 해당이 시간에 시스템으로 C++ 래퍼 역할을 하는 임시 개체를 만듭니다.

핸들 맵을 사용 하 여 Windows 개체는 다음과 같습니다.

  • HWND (CWndCWnd-파생 클래스)

  • HDC (CDCCDC-파생 클래스)

  • 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++ 개체에서 핸들을 얻을 수 있습니다.

래퍼 개체를 얻었으면 래퍼 클래스의 공용 멤버 변수를 핸들을 검색할 수 있습니다.경우에 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 정의 된).Detach 메서드가이 수행 합니다.

myWnd.Detach();

임시 개체에 대 한 자세한 내용은

임시 개체를 만들 때마다 FromHandle 래퍼 개체를 아직 설치 하지 않은 핸들을 받습니다.이러한 임시 개체를 해당 핸들에서 분리 하 고 삭제를 DeleteTempMap 함수.기본적으로 CWinThread::OnIdle 호출을 자동으로 DeleteTempMap 임시 핸들 맵을 지 원하는 각 클래스에 대 한.따라서 임시 개체에 대 한 포인터를 포인터를 가져온 함수의 종료 시점의 유효 하지 가정 수 없습니다.

래퍼 개체 및 다중 스레드

임시 및 영구 개체에는 스레드 단위로 유지 됩니다.즉, 하나의 스레드가 일시적인 지 영구적인 지 여부에 관계 없이 다른 스레드의 C++ 래퍼 개체를 액세스할 수 없습니다.

이러한 개체를 다른 스레드에서 전달 하려면 항상 원래로 보내 HANDLE 형식입니다.다른 스레드에서 C++ 래퍼 개체를 전달 하면 예기치 않은 결과가 자주 발생 합니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트