Subclassificação dos controles com um procedimento de janela gerenciado

The .NET Compact Framework Fornece a funcionalidade para código nativo chamar código gerenciado, usando um retorno de telefonar delegado. Subclassificação um controle gerenciado para receber um retorno de chamada de seu controle nativo correspondente, você pode criar controles com funcionalidade não diretamente disponível no .NET Compact Framework.

Este é um tópico avançado para desenvolvedores com conhecimentos sobre programação em Windows e subclassificação de controle.Para subclassificar um controle, será necessário saber os detalhes internos do controle nativo e como ele mapeia para a funcionalidade que você deseja fornecer na extensão para o controle gerenciado.Você precisará saber quais mensagens do Windows para monitorar e nativo Windows Embedded CE funções para chamar para fornecer a funcionalidade desejada.

Este tópico descreve dispondo em subclasse o TreeView e Button controles e os tópicos a seguir fornecem os exemplos de código e instruções para criar os aplicativos.

Tópico de instrução

Demonstra

Como: Subclasse a TreeView by Using nativo Callbacks

Dispondo em subclasse o TreeView controle para criar uma implementação das NodeMouseClick evento. The .NET Compact Framework não suporta diretamente esse método causa da necessidade de limitar o dimensionar recursos restritos.

Como: Um botão by Using nativo Callbacks subclasse

Dispondo em subclasse o Button controle para exibir um preenchimento gradiente colorido.

Observe que esse botão é fornecido primeiramente para demonstrar como usar subclassificação e retornos de chamada.Para uma maneira fácil de criar um botão de gradiente preenchido, consulte Como: Exibir um preenchimento gradual.

Ambos esses programas de subclassificação incluem a WndProcHooker classe e uma classe auxiliar de estruturas nativas da Win32, declarações de invocação de plataforma e um WndProc delegado. Para listagens de código, consulte Como: Usar uma classe de interceptação de procedimentos do Windows e Como: Use a auxiliar classe para plataforma Invokes.

Classe WndProcHooker

The WndProcHooker classe fornece a capacidade para que um controle nativo ou janela, chamem um retorno de chamada para código gerenciado quando uma determinada mensagem de Windows é recebida para esse controle. Isso é conseguido substituindo o procedimento de janela do controle nativo (WndProc) por um procedimento de janela genérico, WindowProc, que executa uma pesquisa para determinar se o controle está em uma lista de controles associados a métodos de retorno de chamada a ser invocado. Nesse caso, o controle é considerado como sendo enganchado.

Se o controle é enganchado, WindowProc Determina se o controle é mapeado para responder a uma determinada mensagem de Windows. Este é o MAP da mensagem, que mapeia uma mensagem do Windows com um WndProcCallback delegado chama o método gerenciado contendo a funcionalidade desejada. Se o MAP da mensagem contém a mensagem, a WndProcCallback delegado invoca seu código usando os parâmetros da mensagem que foram fornecidos para WindowProc.

Controles de enganchamento

The HookWndProc método associa o identificador do controle um MAP da mensagem a ser usada pelo procedimento de janela genérico WindowProc. Isso é chamado de enganchar um controle.

The HookWndProc método determina se um controle já tem sido enganchado. Caso contrário, ele cria um HookedProcInformation objeto para o controle. Este objeto contém uma referência ao controle e o mapa da mensagem.Se o identificador para o controle já tiver sido criado, ele engancha a janela, criando um ponteiro para o procedimento de janela original da janela para restauração posterior.Se o identificador não tiver sido criado, ele será enganchado pelo ctrl_HandleCreated método que manipula o HandleCreated evento.

Em seguida, a HookWndProc método adiciona a HookedProcInformation objeto a uma das duas coleções de dicionário genérico:

  • The hwindDict dicionário, que contém uma lista global de todas as janelas enganchadas. A chave é um hwnd. Controles cujos manipuladores foram criados vão para esse dicionário.Controles nesse dicionário são avaliados por WindowProc para toda mensagem mapeada.

  • The ctlDict dicionário, que contém controles cujas alças não foram criadas. Quando o ctrl_HandleCreated método é chamado, o controle for movido para o hwndDict dicionário.

Controles desenganchados

The UnhookWndProc método fornece duas maneiras de desencaixe de um controle:

  • Remover uma mensagem do MAP da mensagem para um controle mas ainda manter o controle no hwndDict dicionário de janelas enganchadas. Esse método também restaura o procedimento de janela original para o controle, usando um ponteiro mantido no HookedProcInformation objeto.

  • Remova o controle do hwndDict dicionário de controles enganchados e ou remova seu identificador e coloque-na ctrlDict dicionário ou dispor do controle totalmente. Esse método também restaura o procedimento de janela original para o controle, usando um identificador mantido no HookedProcInformation objeto.

Subclassificação do controle TreeView

O programa de exemplo TreeViewBonus classe, listado na Como: Subclasse a TreeView by Using nativo Callbacks, estende o TreeView controle para incluir a NodeMouseClick evento, que não está disponível diretamente no .NET Compact Framework.

The NodeMouseClick evento é obtido, adicionando a mensagem WM_NOTIFY ao MAP da mensagem para o controle, sistema autônomo executado pela WndProcHooker classe. O método de gerenciado de retorno de chamada WM_Notify_Handler invoca o nativo GetMessagePos função para obter coordenadas do cursor do mouse no momento em que as mensagens do Windows foram enviadas.

Observe que essas coordenadas são em relação à área de cliente visível da tela, não em relação à TreeView controle. The TreeViewBonus classe converte coordenadas de tela às coordenadas do cliente com o PointToClient método para o controle. Então essas coordenadas do cliente serão enviadas junto com a mensagem TVM_HITTEST para determinar se e onde o TreeViewBonus objeto foi clicado.

The TreeViewBonus classe contém código para obter as coordenadas relativas ao controle usando mensagem TVM_HITTEST do controle nativo.

Se o clicar ocorreu em um de nós de modo de exibição de árvore, a estrutura nativa TVHITTESTINFO contém o identificador para esse nó.A etapa final é desviar recursivamente através o gerenciado TreeView nós, executados pela FindTreeNodeFromHandle método, para localizar a correspondência manipular e elevar o NodeMouseClick evento. The TreeNodeMouseClickEventArgs classe fornece os seguintes dados:

  • O nó que foi clicado.

  • O botão foi clicado.

  • O número de cliques, definida em 1.

  • A coordenada x onde ocorreu o clique.

  • A coordenada y onde ocorreu o clique.

The TreeViewBonus classe engancha pai do controle de modo nativo da árvore com um procedimento de janela gerenciado sistema autônomo executad pela WndProcHooker classe. Ele responde à OnParentChanged evento enganchando o controle pai, assim, acomodando a possibilidade de que o TreeView w sistema autônomo movido para outro pai, tal sistema autônomo das Form para um Panel.

Subclassificação do controle de Botão

The GradientFilledButton e GradientFill classes listadas no Como: Um botão by Using nativo Callbacks subclasse Estender a Button controle para exibir um preenchimento gradiente entre duas cores. Principalmente este programa é destinado a demonstrar subclassificação.No entanto, uma maneira mais fácil de exibir um preenchimento gradiente em um botão é criar um controle personalizado derivado de Control, conforme descrito em Como: Exibir um preenchimento gradual.

O construtor para o GradientFilledButton classe cria instâncias de WndProcHooker classe para mapear mensagens do Windows para retornos de chamada gerenciado. Esses métodos de retorno de chamada desenham o botão no estado apropriado de acordo com a mensagem o Windows e o estado do Capture propriedade do controle. A tabela a seguir lista as mensagens do Windows mapeadas e seus retornos de chamada correspondentes.

Mensagem de Windows

Método de retorno de chamada gerenciado e descrição

WM_KEYDOWN

WM_KeyDown_Handler -Redesenha o botão em um estado enviado se a tecla barra de barra de espaços ou ENTER (ou ação) é pressionada.

WM_KEYUP

WM_KeyUp_Handler -Redesenha o botão em um estado não enviado e dispara o Click evento se a tecla pressionada for a barra de barra de espaços ou ENTER (ação) chave.

WM_LBUTTONDOWN

WM_LeftButtonDown_Hander -Redesenha o botão em um estado enviado e define o mouse Capture propriedade do controle para true.

WM_LBUTTONUP

WM_LButtonUp_Handler -Redesenha o botão em um estado não enviado, dispara o MouseUp evento se o cursor for lançado dentro da área de cliente do controle e define o mouse Capture propriedade do controle para false.

WM_MOUSEMOVE

WM_MouseMove_Handler -Redesenha o botão se ele foi anteriormente clicado e Capture é true.

WM_PAINT

WM_Paint_Handler -Redesenha o botão no estado adequado.

Esses métodos gerenciado de retorno de chamada usam o DrawButton método para desenhar o botão no estado adequado. Esse método tem duas sobrecargas para desenho no botão tanto em uma janela, usado por este exemplo ou em um Graphics objeto. Ambas sobrecargas levam um valor booliano que é true Se o botão foi pressionado.

The GradientFilledButton usos de classe a GradientFill classe para executar invocação de plataforma chamadas para código nativo para fazer o preenchimento. The GradientFill classe fornece propriedades para conjunto o início e fim cores e especificar a direção de preenchimento sistema autônomo da esquerda para a direita ou de cima para baixo.

Consulte também

Tarefas

Como: Usar uma classe de interceptação de procedimentos do Windows

Como: Use a auxiliar classe para plataforma Invokes

Como: Subclasse a TreeView by Using nativo Callbacks

Como: Exibir um preenchimento gradual

Conceitos

Tópicos "como" do .NET compact estrutura

Outros recursos

Interoperabilidade no .NET Compact Framework