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.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria