Exemplo do CTRLTEST: Implementa Custom Controls
O exemplo CTRLTEST ilustra várias técnicas para implementar e usar controles personalizados:
Implementação de CParsedEdit, um especializados edição funcionalidade deriving de controle de sua classe de controle de biblioteca e três métodos de usar controles personalizados.
Usando o controle de rotação.O controle de rotação possui pequenos botões de seta para cima e seta para baixo para incrementar ou decrementar um valor.
Implementação de botão de bitmap de Personalizado comandos de menu usandoCBitmapButton.
Proprietário (janela pai) de menus e caixas de listagem de desenho.Classes de controle correspondentes a derivação do CMenu classe e CListBox fornecer esse recurso de forma orientada a objeto.
Usando arquivos de recursos pelos editores de recursos do Microsoft Visual C++ não passível de manutenção.Isso ilustra os benefícios e desvantagens de usar um arquivo .rc2 em uma caixa de diálogo que tem um controle personalizado com estilos definidos pelas constantes em um arquivo de cabeçalho.
Todas as ilustrações CTRLTEST são iniciadas por meio de comandos de menu.
Observação de segurança: |
---|
Este código de exemplo é fornecido para ilustrar um conceito e não deve ser usado em aplicativos ou sites da Web, pois ele não pode ilustrar sistema autônomo práticas de codificação mais seguras.Microsoft sistema autônomo sumes nenhuma responsabilidade por danos incidentais ou conseqüenciais deve o código de exemplo ser usado para fins diferentes de sistema autônomo se destina. |
Para obter exemplos e instruções para instalá-los:
Sobre o Visual Studio Ajuda menu, clicar Exemplos.
Para obter mais informações, consulte Localizando arquivos de exemplo.
A versão mais recente e a lista completa das Exemplos está disponível online a partir de O Visual Studio 2008 Exemplos página.
Você também pode localizar exemplos no disco rígido do seu computador.Por padrão, exemplos e um arquivo Leiame são copiados para uma pasta sob \programa Files\Visual Studio 9.0\Samples\.Para edições Express do Visual Studio, todos os exemplos estão localizados online.
Criando e executando o exemplo
Para criar e executar a amostra CTRLTEST
Abra a solução Ctrltest.sln.
Sobre o Compilação menu, clicar Compilação.
No menu Debug, clique em Start Without Debugging.
Exemplo: Implementar e usar controles personalizados
Você pode implementar um controle personalizado derivando de CWnd, mas é muito mais fácil se podem emprestar funcionalidade de controles padrão do Windows, derivando de sua classe de controle na biblioteca. CTRLTEST faz isso para implementar um controle de edição especializadas, CParsedEdit.Esse controle de edição aceita apenas especificados conjuntos de caracteres sistema autônomo entrada do usuário: numérico, alfabético, ou noncontrol caracteres.CParsedEdit é derivado de CEdit. Ele possui um OnChar manipulador de mensagens para filtrar os caracteres.
A implementação de comandos no deSimples menu ilustra três métodos de usar um controle personalizado.Os métodos são diferenciados de acordo com a como o aplicativo associa ocorrências do controle na caixa de diálogo com o CParsedEdit classe.Cada Simples comando de menu exibe uma caixa de diálogo com quatro instâncias do CParsedEdit controle.Dados inseridos na caixa de diálogo são enviados para a porta de depurar sistema autônomo RASTREAMENTO saída.Os três Simples comandos de menu são:
Teste C++ derivado de classe
The CParsedEdit controles são membros de dados da caixa de diálogo classe.Os controles são criados explicitamente em OnInitDialog função chamando CParsedEdit::CreateSet.Consulte Dertest.cpp.
Teste WNDCLASS registrado
The CParsedEdit controles são dispostos em um recurso de modelo de caixa de diálogo (IDD_WNDCLASS_EDIT) sistema autônomo controles personalizados com um WNDCLASS identificado sistema autônomo "paredit." É instrutivo para examinar as propriedades desses controles personalizados usando o editor de diálogo do Visual C++.
Legenda em branco.Esse é o valor inicial que mostra o CParsedEdit controle.
Classe: paredit.Este é o nome WNDCLASS registrado por CParsedEdit::RegisterControlClass PAREDIT2.CPP, antes que a caixa de diálogo é chamada.
Visível: marcada.O controle é visível.
TabStop: marcada.O usuário pode guia para esse controle.
Estilo: 0x5081002, 0x5081001, 0x5081003, 0x5081ffff para os quatro controles de edição analisada.O estilo 0x500000 é para o estilo e WS_VISIBLE e 0 x 1000 é para WS_TABSTOP.Todos os controles personalizados possuem o estilo do estilo.Os estilos WS_VISIBLE e WS_TABSTOP são definidos automaticamente pelo editor de diálogo quando você verificar os estilos visível e TabStop.0x80000 é WS_BORDER.Desde o editor da caixa de diálogo propriedade página para um controle personalizado oferece todos sistema autônomo estilos de janela sistema autônomo WS_BORDER, você deve Pesquisar a constante no \Microsoft Visual Studio.NET 2003\Vc7\PlatformSDK\Include\WINUSER.H.sistema autônomo estilos 0 x 0001, 0 x 0002, 0x0004 e 0x0ffff são definidos PAREDIT.H sistema autônomo, respectivamente, PES_NUMBERS, PES_LETTERS, PER_OTHERCHARS e PES_ALL.
Os estilos hexadecimais na página de propriedades de controle personalizado não são autodocumentado.Se for importante para você usar estilos simbólicos, sistema autônomo PES_NUMBERS e PES_LETTERS, você pode também editar manualmente um arquivo de recurso separado, sistema autônomo RES\Ctrltest.rc2, que está incluído pelo compilador de recurso em time de compilar, mas não é lido pelo Visual C++ no time de edição.Para uma discussão sobre os prós e contras de editar uma caixa de diálogo de controle personalizado em um arquivo .rc2 manualmente, consulte Usando arquivos de recurso não passível de manutenção, os editores de recursos do Visual C++.
Testar uma subclasse dinâmica
sistema autônomo controles são dispostos em um recurso de modelo de caixa de diálogo (IDD_SUB_EDIT em Ctrltest.rc) sistema autônomo controles de edição padrão.sistema autônomo controles são declarados sistema autônomo CParsedEdit dados membros da classe de caixa de diálogo.OnInitDialog chamadas de função CParsedEdit::SubClassEdit, que por sua vez chama a CWnd::SubclassDlgItem, para associar cada instância específica de controle de edição com o CParsedEdit classe.Consulte Paredit.cpp.
Exemplo: Controle de rotação
O exemplo CTRLTEST inclui uma implementação de um controle de rotação.O controle de rotação tem uma pequena seta up e um pequeno botão de seta para baixo para incrementar ou decrementar um valor.
The Controle de rotação comando chama uma caixa de diálogo que tem quatro CParsedEdit controles, cada associados com um controle de rotação.Dados inseridos no CParsedEdit controles nesta caixa de diálogo é filtrado para aceitar apenas números inteiros não negativos.O usuário pode inserir dados numéricos digitando o valor para o CParsedEdit controle ou usando o controle de rotação associado.
Exemplo: Botão de bitmap
A implementação a seguir Personalizado comandos de menu ilustra maneiras de usar CBitmapButton:
Botão 1 do bitmap - Caixa de diálogo Construtor explicitamente carrega os recursos de bitmap para cada um dos três estados (acima, abaixo, e foco) do botão chamando CBitmapButton::LoadBitmaps.
Botão de bitmap 2 - OnInitDialog chamadas de função CBitmapButton::Autoload para carregar os recursos de bitmap com base na seguinte convenção de nomeclatura. O texto da janela do controle funciona sistema autônomo o nome de recurso base e sistema autônomo letras U, D e F são acrescentados para criar nomes de recursos para cada uma das imagens três bitmap, respectivamente, o backup, para baixo e se concentrar.Por exemplo, os três recursos para o de bitmapOK botão são nomeado OKU, OKD e OKF.
Botão de bitmap 3 - Caixa de diálogo é uma extensão da segunda caixa de diálogo acima, usando um estado de botão possíveis quarto, desabilitado.Para usar esta caixa de diálogo, clicar no botão de bitmap seta para esquerda ou direita até que a exibida atinge número 1, o número mais baixo ou 10, o maior número.Quando o limite é alcançado, o botão está desabilitado e uma quarta imagem de bitmap é exibida.convenção de nomeclatura para o recurso de bitmap para o estado desabilitado é um sufixo de X, conforme refletido dos nomes dos recursos PREVX e NEXTX.
Exemplo: Desenho proprietário (menu e lista caixa)
Vários menus e controles do Windows têm um desenho do proprietário o recurso que permite que a janela pai (ou proprietário) desenhar tudo o que quer na área de cliente do controle em vez do comportamento padrão do controle.As classes de controle correspondente e CMenu classe fornecem esse recurso de uma forma mais conveniente e orientada a objeto: A classe de controle ou menu lida com o desenho.Isso é chamado de "auto-desenho".
CTRLTEST ilustra a técnica geral de implementar os seguintes comandos no de desenho proprietárioPersonalizado menu:
Menu personalizado - Este item de menu chama um CColorMenu menu pop-up, derivado de CMenu. Cada item de submenu exibe uma das oito cores usando o recurso self-desenho.Uma caixa de mensagem confirma a cor selecionada no submenu.
Caixa lista personalizado - Este item de menu chama uma caixa de diálogo que exibe um CColorlistaBox, derivado de CListBox. O lista caixa tem oito entradas, cada desenhadas em uma das oito cores usando o recurso self-desenho.RASTREAMENTO saída confirma sua seleção na caixa de listagem.
Exemplo: Utilização de recurso não arquivos passível de manutenção pelo Visual editores de recursos do C++
O arquivo de recurso CTRLTEST\RES\Ctrltest.rc2 é um exemplo de um arquivo de recurso não passível de manutenção, os editores de recursos do Visual C++ de forma legível.Se você em aberto Ctrltest.rc2 no Visual C++ e, em seguida, salvá-lo, você poderia perder informações legíveis úteis, mesmo que o recurso compilador ainda será capaz de compilar o arquivo .rc2 e produzir um arquivo .res binário equivalente.Assim, RES\Ctrltest.rc2 foi adicionado sistema autônomo um #include em Ctrltest.rc com uma diretiva de time de compilar especificada com o Inclui o conjunto de arquivos de recursocomando .
Estas são as três categorias de informações legíveis que não são de fácil manutenção pelos editores de recursos do Visual C++.Dois desses são demonstradas em Ctrltest.rc2:
Símbolos de estilos de controle personalizado-Por exemplo, "msctls_updown32" é um estilo definido para o controle de rotação.Embora o Visual C++ pode interpretar esse símbolo, ele lê o arquivo .rc2, Visual C++ seria gravar-lo de volta para o arquivo .rc2 sistema autônomo um valor hexadecimal.
Símbolos de estilo Windows WS_ ou controle padrão usados em um controle de uma classe de codificação derivado de controle padrão - Por exemplo, ES_AUTOHSCROLL está definido para o controle de rotação na caixa de diálogo IDD_SPIN_EDIT.Embora o Visual C++ pode interpretar esses símbolos, ele lê o arquivo .rc2, Visual C++ escreveria-lo de volta para sistema autônomo arquivos .rc2 sistema autônomo um valor hexadecimal.
Aritmética no arquivo .rc-Expressões sistema autônomo "IDC_EDIT1 + 2" para identificar controles a IDD_SPIN_EDIT diálogo seria ser gravado novamente o .rc2 arquivo sistema autônomo um único valor hexadecimal pelo Visual C++.
O exemplo CTRLTEST mostra os prós e contras do uso de um arquivo .rc2 em caso de uma caixa de diálogo que tem um controle personalizado com estilos definidos com constantes em um arquivo de cabeçalho.Ambas as caixas de diálogo IDD_WNDCLASS_EDIT and IDD_SPIN_EDIT têm controles personalizados com estilos definidos symbolically; mas IDD_WNDCLASS é especificada em um arquivo .rc editável, o editor da caixa de diálogo Visual C++, enquanto IDD_SPIN_EDIT é especificada em um arquivo .rc2 que é apenas editável manualmente.
sistema autônomo diferenças entre usar o arquivo .rc e o arquivo .rc2 podem ser resumidas da seguinte maneira.
O IDD_WNDCLASS_EDIT de caixa de diálogo, o script de recurso é definida em Ctrltest.rc.O IDD_SPIN_EDIT de caixa de diálogo, o script de recurso é definida em RES\Ctrltest.rc2.O IDD_WNDCLASS_EDIT de caixa de diálogo, o controle personalizado WNDCLASS é "paredit", as constantes de estilo são definidas no PAREDIT.H e uma constante de estilo do exemplo é PES_NUMBER.IDD_WNDCLASS_EDIT é editável pelo Visual C++, mas não é possível usar #define estilos. IDD_SPIN_EDIT não é editável pelo Visual C++, mas pode usar #define estilos.
A desvantagem é que, se você usar o arquivo .rc2, você pode usar legíveis simbólicos estilos definidos no arquivo de cabeçalho para o controle personalizado, mas você não pode edição o arquivo .rc2 com o editor da caixa de diálogo Visual C++.É mais fácil formatar a caixa de diálogo usando o Visual C++ que escrever manualmente o script de recurso; e escrever script de recurso é sujeita a mais erros.Por Outros lado, os estilos não são auto-documentando quando exibida em hexadecimal na página de propriedades de controle personalizado pelo editor da caixa de diálogo do Visual C++.
Palavras-chave
Este exemplo demonstra as seguintes palavras-chave:
AfxGetInstanceHandle; AfxMessageBox; AfxThrowResourceException; CBitmapButton::AutoLoad; CDC::FillRect; CDC::FrameRect; CDialog::DoModal; CDialog::EndDialog; CDialog::OnInitDialog; CDialog::OnOK; CDialog::OnSetFont; CEdit::criar; CEdit::SetSel; CFrameWnd::criar; CListBox::AddString; CListBox::CompareItem; CListBox::DrawItem; CListBox::GetItemData; CListBox::MeasureItem; CMenu::AppendMenu; CMenu::CreateMenu; CMenu::desanexar; CMenu::DrawItem; CMenu::EnableMenuItem; CMenu::FromHandle; CMenu::GetMenuString; CMenu::MeasureItem; CRect::Width; CStatic::criar; CString::Format; CString::LoadString; CWinApp::InitInstance; CWnd::anexar; CWnd::EnableWindow; CWnd::FromHandle; CWnd::GetDlgCtrlID; CWnd::GetDlgItem; CWnd::GetDlgItemInt; CWnd::GetMenu; CWnd::GetParent; CWnd::GetWindowRect; CWnd::GetWindowText; CWnd::IsWindowEnabled; CWnd::MessageBox; CWnd::OnChar; CWnd::OnCommand; CWnd::OnVScroll; CWnd::PostNcDestroy; CWnd::SendMessage; CWnd::SetDlgItemInt; CWnd::SetFocus; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::SubclassDlgItem; CallWindowProc; GetBValue; GetClassInfo; GetGValue; GetRValue; GetSystemMetrics; HIWORD; IsCharAlpha; IsCharAlphaNumeric; LOWORD; MAKEINTRESOURCE; MAKELONG; MessageBeep; ModifyMenu; RGB; RegisterClass; SetWindowLong
Observação: |
---|
Alguns exemplos, sistema autônomo esta, não foram modificados para refletir sistema autônomo alterações nos assistentes, bibliotecas e compilador Visual C++, mas ainda Demonstre sistema autônomo concluir a tarefa desejada. |