TN003: Mapeamento de Windows manipula a objetos
Esta anotação descreve o MFC rotinas que oferecem suporte a mapeamento Windows objeto identificadores de objetos do C++.
O problema
Objetos do Windows normalmente são representados por vários MANIPULAR objetos de classes do MFC A encapsular identificadores de objeto do Windows com objetos C++.A alça de quebra automática de funções da biblioteca de classes do MFC permite localizar o objeto C++ disposto o objeto do Windows que tem um identificador específico.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 como wrapper C++.
Os objetos do Windows que usam mapas alça são:
HWND (CWnd e CWnd-classes derivadas)
HDC (CDC e CDC-classes derivadas)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
SOQUETE (CSocket)
Recebe um identificador para qualquer um desses objetos, você pode localizar o objeto MFC que encapsula a alça, chamando o método estático FromHandle.Por exemplo, considerando um HWND chamado hWnd, a seguinte linha irá retornar um ponteiro para o CWnd que empacota hWnd:
CWnd::FromHandle(hWnd)
Se hWnd não tem um objeto de invólucro específico temporário CWnd é criado para quebrar o hWnd.Isso torna possível obter um objeto C++ válido de qualquer alça.
Depois de ter um objeto de invólucro, você pode recuperar seu identificador de uma variável de membro público da classe wrapper.No caso de um CWnd, m_hWnd contém o HWND para o objeto.
Anexar identificadores a objetos do MFC
Dado um objeto recém-criado do empacotador de alça e um identificador para um objeto do Windows, você pode associar os dois chamando o Attach funcionar como neste exemplo:
CWnd myWnd;
myWnd.Attach(hWnd);
Isso faz uma entrada de mapa permanente associando myWnd e hWnd.Chamando CWnd::FromHandle(hWnd) retornará um ponteiro para myWnd.Quando myWnd é excluído, o destruidor automaticamente destruirá hWnd chamando o Windows DestroyWindow função.Se não for desejado, hWnd deve ser desanexado do myWnd antes de myWnd é destruído (normalmente ao sair do escopo no qual myWnd foi definido).O 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 que não possui um objeto de invólucro.Esses objetos temporários são desanexados do seu identificador e excluídos pelo DeleteTempMap funções.Por padrão CWinThread::OnIdle automaticamente chama DeleteTempMap para cada classe que oferece suporte a mapas de identificador temporário.Isso significa que não pode assumir que um ponteiro para um objeto temporário será válido após o ponto de saída da função de onde o ponteiro foi obtido.
Objetos de invólucro e vários segmentos
Objetos temporários e permanentes são mantidos em uma base por thread.Ou seja, um thread não é possível acessar objetos de invólucro de C++ do segmento, independentemente de ser permanente ou temporária.
Para passar esses objetos de um thread para outro, sempre enviá-los como seu nativo HANDLE tipo.Passar um objeto de invólucro do C++ de um thread para outro geralmente causará resultados inesperados.