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.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria