Você está offline; aguardando reconexão

Como inicializar controles filho em um derivado CDialogBar

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.

185672
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         //<AngularNoBind>{{</AngularNoBind>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)         //<AngularNoBind>{{</AngularNoBind>AFX_MSG_MAP(CMyDlgBar)         ...         //<AngularNoBind>}}</AngularNoBind>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
dy>