Como inicializar controles filho em um derivado CDialogBar

Traduções deste artigo Traduções deste artigo
ID do artigo: 185672 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Ao criar um CDialogBar simples, como com somente CButtons semelhante à visualização de impressão do MFC, não é necessário derivar de CDialogBar porque o pai do CControlBar recebe as mensagens de notificação de quaisquer controles filho.

No entanto, no caso de um CDialogBar mais complexo, que pode ter uma caixa de combinação drop-down, treeview ou controle ActiveX, pode ser útil derivar CDialogBar para fornecer inicialização para os controles filho.

Porque ClassWizard não oferece suporte para derivar uma classe de CDialogBar, este artigo mostra as etapas necessárias para criar uma classe de CDialog e "converter", em seguida, a classe em CDialogBar.

Mais Informações

Para começar, crie uma classe CDialog com os controles filho que deseja usar. Você pode transformar a classe CDialog em uma classe CDialogBar usando as nove etapas a seguir:

  1. Altere a classe base de CDialog para CDialogBar na declaração da classe. Não se esqueça de alterar também a classe base no BEGIN_MESSAGE_MAP no arquivo .cpp.
  2. Altere o construtor nos arquivos .cpp e .h o. Também fazer a alteração a DoDataExchange(). Abaixo estão três itens para alterar.

    Alterar o seguinte da
          CMyDlgBar (CWnd* pParent = NULL);   // standard constructor
    
          CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)
             : CDialog(CMyDlgBar::IDD, pParent)
          {
             ...
    
          void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
          {
             CDialog::DoDataExchange(pDX);
             ...
    					
    à seguinte:
          CMyDlgBar ();   // standard constructor
    
          CMyDlgBar:: CMyDlgBar ()
          {
             ...
    
          void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
          {
             CDialogBar::DoDataExchange(pDX);
             ...
    					
    a chave para a transformação é a conversão da função de membro OnInitDialog() virtual para o método de mensagem mapeado WM_INITDIALOG alterando o método OnInitDialog e adicionando o manipulador ON_MESSAGE(). Você não pode ter uma substituição do OnInitDialog(). Caso contrário, adicione um antes de prosseguir.
  3. Remover "virtual BOOL OnInitDialog();" do cabeçalho da classe e adicionar "afx_msg LONG OnInitDialog (UINT, LONG);" em seu lugar. Por exemplo:
          class CMyDlgBar : public CDialogBar
          {
             ...
          // Implementation
          protected:
    
             // Generated message map functions
             //{{AFX_MSG(CMyDlgBar)
             virtual BOOL OnInitDialog();                // <-Remove this line.
             //}}AFX_MSG
    
             afx_msg LONG OnInitDialog ( UINT, LONG );   // <-Add this line.
             DECLARE_MESSAGE_MAP()
          };
    						
    agora, na seção de implementação de classe, faça as alterações correspondentes.
  4. Adicionar "ON_MESSAGE (WM_INITDIALOG, OnInitDialog);" ao mapa da mensagem no arquivo de implementação .CPP. Por exemplo:
          BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)
    
             //{{AFX_MSG_MAP(CMyDlgBar)
             ...
             //}}AFX_MSG_MAP
             ON_MESSAGE(WM_INITDIALOG, OnInitDialog )    // <-- Add this line.
          END_MESSAGE_MAP()
    						
    agora, converter OnInitDialog() virtual OnInitDialog() mensagem mapeada.
  5. Fazer a conversão OnInitDialog() da seguinte maneira:
       Change the following:
    
          BOOL CMyDlgBar::OnInitDialog()
          {
             CDialog::OnInitDialog();   // <-- Replace this line:
                ...
    						
    à seguinte:
    LONG CMyDlgBar::OnInitDialog ( UINT wParam, LONG lParam)
             {
                              // <-- with these lines. -->
    
                BOOL bRet = HandleInitDialog(wParam, lParam);
    
                if (!UpdateData(FALSE))
                {
                   TRACE0("Warning: UpdateData failed during dialog init.\n");
                }
                ...
    
                return bRet;
    						
    CDialogBar A classe não tem um OnInitDialog() virtual e, portanto, chamar um não funciona. UpdateData é chamado para subclasse ou inicializar os controles filho.
  6. Certifique-se os estilos de recurso de caixa de diálogo para o seguinte:
    Estilo: filho
    Fronteira: nenhum
    Visível: não selecionado
    Neste ponto, tudo se foi reconectou a fazer a transformação de uma classe CDialog a uma classe CDialogBar funcione corretamente. Agora, criar e usá-lo.
  7. Adicione uma instância de CDialogBar derivado para a classe derivada de CframeWnd (normalmente chamado de CMainFrame). Por exemplo:
          class CMainFrame : public CFrameWnd
          {
              ...
              CMyDlgBar m_myDlgBar;
              ...
          };
    					
  8. Chame o método criação para a variável m_myDlgBar no método CFrameWnd::OnCreate() semelhante à seguinte:
          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
             ...
             if (!m_myDlgBar.Create(this, IDD_DLGBAR1, CBRS_LEFT,
                IDD_DLGBAR1))
             {
                TRACE0("Failed to create dialog bar\n");
                return -1;      // fail to create
             }
             ...
          }
    					
  9. Finalmente, se você desejar oferecer suporte a encaixe dinâmico e redimensionamento do CDialogBar, adicionar as seguintes linhas ao final de CMainFrame::OnCreate():
          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
             ...
             m_myDlgBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
                CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
             m_myDlgBar.EnableDocking(CBRS_ALIGN_ANY);
             DockControlBar(&m_myDlgBar);
    
             return 0;
          }

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
99161Como para derivar classes não listadas na ClassWizard

Propriedades

ID do artigo: 185672 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbhowto kbmfcctrlbar kbuidesign kbwizard KB185672 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 185672

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com