TN003: Mapeamento do Windows manipula a objetos
Esta nota descreve o MFC rotinas que oferecem suporte a mapeamento Windows objeto identificadores para objetos C++.
O problema
Objetos do Windows normalmente são representados por vários ALÇA objetos classes MFC A dispor alças de objeto do Windows com C++ objetos.A alça de quebra automática de funções da biblioteca de classes do MFC permitem que você localizar o objeto C++ que é o objeto do Windows que tem um determinado identificador de quebra.No entanto, às vezes, um objeto não tem um objeto de invólucro do C++ e nestes horários, o sistema cria um objeto temporário para atuar sistema autônomo o wrapper do C++.
sistema autônomo objetos do Windows que usam mapas de identificador são:
HWND (CWnd and CWnd-classes derivadas)
HDC (CDC and CDC-classes derivadas)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
SOCKET (CSocket)
Recebe um identificador para qualquer um desses objetos, você pode encontrar o objeto MFC que empacota a alça chamando o método estático FromHandle. Por exemplo, dada um HWND chamado hWnd, a seguinte linha irá retornar um ponteiro para o CWnd que encapsula hWnd:
CWnd::FromHandle(hWnd)
If hWnd não tem um determinado wrapper objeto, um temporário CWnd é criada para empacotar hWnd. Isso torna possível obter um objeto válido do C++ de qualquer alça.
Depois que um objeto de conteúdo adicional, você pode recuperar sua alça de uma variável de membro público da classe wrapper.No caso de um CWnd, m_hWnd contém o HWND para esse objeto.
Anexando identificadores a objetos do MFC
Dado um objeto recém-criado de wrapper de identificador e um identificador a um objeto do Windows, você pode associar sistema autônomo dois, chamando o Attach função sistema autônomo neste exemplo:
CWnd myWnd;
myWnd.Attach(hWnd);
Isso cria uma entrada no MAP permanente associando myWnd e hWnd. De chamadaCWnd::FromHandle(hWnd) retornará um ponteiro para myWnd. Quando myWnd é excluído, o destruidor serão destruídos automaticamente hWnd chamando o Windows DestroyWindow função.Se não for desejado, hWnd deve ser desanexado do myWnd antes de myWnd é destruída (normalmente ao sair do escopo em que myWnd foi definido). The Detach método faz isso.
myWnd.Detach();
Mais informações sobre objetos temporários
Objetos temporários são criados sempre que FromHandle recebe um identificador ainda não tiver um wrapper objeto. Esses objetos temporários são destacados da sua alça e excluídos pelo DeleteTempMap funções. Por padrão, CWinThread::OnIdle chama automaticamente DeleteTempMap para cada classe que ofereça suporte a identificador temporário mapas. Isso significa que não pode assumir que um ponteiro para um objeto temporário será válido após o ponto de sair da função de onde o ponteiro foi obtido.
Objetos de wrapper e vários segmentos
Objetos temporários e permanentes são mantidos em uma base por thread.Ou seja, um segmento não pode acessar objetos de wrapper de C++ do segmento, independentemente de ele é permanente ou temporário.
Para passar esses objetos de um thread para outro, sempre enviá-las sistema autônomo suas nativo HANDLE Digite. Passar um objeto de invólucro C++ de um thread para outro geralmente irá causar resultados inesperados.