TN014: Controles personalizados.

Esta anotação descreve o suporte do MFC para controles Personalizars e Self-desenho. Dinâmico subclassificação também é descrita. Conselhos gerais sobre a propriedade de objetos de CWnd vs. HWNDs é apresentado.

O aplicativo de exemplo do MFC CTRLTEST ilustra muitos desses recursos. Por favor, consulte o código-fonte para o MFC geral exemplo CTRLTEST e ajuda on-line.

Proprietário-desenhar controles/Menus

O Windows fornece suporte para menus e controles "proprietário desenhar". Estas são mensagens do Windows enviadas para uma janela pai de um controle ou no menu que lhe permitem personalizar a aparência visual e o comportamento do controle ou do menu.

MFC diretamente suporta proprietário desenhar com as entradas de mapa de mensagem:

Você pode substituir esses no seu CWnd-derivado classe (geralmente uma caixa de diálogo ou janela de quadro principal) para implementar o comportamento de proprietário-desenhar.

Esta abordagem não funciona de código reutilizável. Se você tiver dois controles semelhantes em dois diferentes caixas de diálogo, você deve implementar o comportamento do Controlarar Personalizar em dois lugares. A arquitetura de controle self-Desenho suporte para MFC resolve esse problema.

Menus e controles self-Desenho

MFC fornece uma implementação padrão (na CWnd e CMenu) para as mensagens padrão proprietário-desenhar. Esta implementação padrão irá decodificar os parâmetros de proprietário-desenhar e delegate as mensagens proprietário-desenhar os controles ou menu. Isso é chamado de "Self-Desenhar" uma vez que o código de desenho (/ medição/comparação) é na classe do Controlarar ou menu, não na janela do proprietário.

Isso permite que você crie classes de Controlarar reutilizável que exibir o Controlarar usando semântica "proprietário desenhar". O código para desenhar o controle, não é o proprietário do controle, é a classe de Controlarar. Esta é uma abordagem orientada a objeto para programação de Controlarar Personalizar.

Para obter detalhes sobre o proprietário-desenhar estruturas (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTe DELETEITEMSTRUCT) consulte a documentação do MFC para CWnd:: OnDrawItem, CWnd:: OnMeasureItem, CWnd:: OnCompareIteme CWnd::OnDeleteItem respectivamente.

Usando menus e controles self-Desenho

Para menus self-Desenho, você deve substituir funções de membro MeasureItem e DrawItem.

Para self-Desenho caixas de listagem e caixas de combinação, você deve substituir o MeasureItem e DrawItem. Você deve especificar o estilo OWNERDRAWVARIABLE no modelo de diálogo (LBS_OWNERDRAWVARIABLE e CBS_OWNERDRAWVARIABLE respectivamente). O estilo OWNERDRAWFIXED não funcionará com self-desenho itens, desde que a altura do item fixo é determinada antes de self-Desenho controles estão conectados à caixa de listagem. (O membro Win 3.1 funções CListBox::SetItemHeight e CComboBox::SetItemHeight pode ser usado para contornar essa limitação.)

Além disso, note que a mudança para um estilo OWNERDRAWVARIABLE vai afetar o estilo NOINTEGRALHEIGHT . Porque o controle não pode calcular uma integral altura com itens de tamanhos variáveis, o estilo padrão de INTEGRALHEIGHT é ignorada e o controle é sempre NOINTEGRALHEIGHT. Se os itens são fixos altura, você pode impedir itens parciais sendo desenhada, especificando o tamanho do Controlarar para ser um multiplicador integrante do tamanho do item.

Para self-Desenho caixas de listagem e caixas de combinação com o estilo SORT (LBS_SORT e CBS_SORT respectivamente), você deve substituir a função de membro CompareItem.

Para self-Desenho caixas de listagem e caixas de combinação, DeleteItem não é normalmente substituído. DeleteItem pode ser substituído se memória adicional ou outros recursos são armazenados com cada lista caixa ou combinação caixa item.

Exemplos de controles/Menus Self-desenho

O MFC geral exemplo CTRLTEST fornece exemplos de um menu self-Desenhar (apresentando cores) e uma caixa de listagem self-Desenhar (também mostra cores).

O exemplo mais característico de um self-Desenho botão é um botão de bitmap (um botão que mostra um, dois ou três imagens de bitmap para os Estados diferentes). Isso é fornecido na classe do MFC CBitmapButton.

Dinâmico subclassificação

Subclassificação é o termo Windows para substituir WndProc de uma janela com um diferente WndProc e chamar o antigo WndProc para funcionalidade padrão (superclasse).

Isso não deve ser confundido com derivação de classe C++ (usos de terminologia C++ as palavras "baseiam" e "derivados", enquanto o modelo de objeto do Windows usa "super" e "sub"). Derivação de C++ com subclassificação MFC e Windows são funcionalmente muito semelhantes, exceto C++ não dá suporte a um recurso semelhante ao Dinâmico subclassificação.

A classe CWnd fornece a conexão entre um objeto C++ (derivado de CWnd) e um objeto de janela do Windows (também conhecido como um HWND).

Há três comum maneiras que esses são relacionados:

Neste último caso é feito com as funções de membro:

Ambas rotinas anexar um objeto de CWnd a um Windows existente HWND. SubclassWindow leva o HWND diretamente, e SubclassDlgItem é um auxiliar que leva uma identificação de Controlarar e a janela pai (geralmente uma caixa de diálogo). SubclassDlgItem foi projetado para anexar objetos do C++ a controles de caixa de diálogo criadas de um modelo de caixa de diálogo.

Por favor, consulte o exemplo CTRLTEST para vários exemplos de quando usar SubclassWindow e SubclassDlgItem.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index