A inicializar controlos subordinados num CDialogBar derivado

Traduções de Artigos Traduções de Artigos
Artigo: 185672 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Ao criar CDialogBar simples, tal como com apenas CButtons semelhante à pré do MFC-visualização, não é necessário derivar de CDialogBar porque o ascendente do CControlBar recebe as mensagens de notificação de quaisquer controlos subordinados.

No entanto, no caso de um CDialogBar mais complexa, que pode ter uma caixa de combinação pendente, treeview ou controlo ActiveX, poderá ser útil derivar CDialogBar para fornecer a inicialização de controlos subordinados.

Porque ClassWizard não suporta derivar uma classe a partir do CDialogBar, este artigo mostra os passos necessários para criar uma classe de CDialog e, em seguida, "converter" a classe CDialogBar.

Mais Informação

Para começar, crie uma classe CDialog com os controlos subordinados que pretende utilizar. Pode criar a classe CDialog de uma classe CDialogBar utilizando os seguintes nove passos:

  1. Altere a classe base da CDialog para CDialogBar na declaração da classe. Não se esqueça também alterar a classe base BEGIN_MESSAGE_MAP no ficheiro .cpp.
  2. Altere o construtor tanto o .h ficheiros .cpp. Também efectue a alteração para o DoDataExchange(). Seguem-se três itens para alterar.

    Alterar o seguinte a partir
          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 mensagens mapeado WM_INITDIALOG alterando o método OnInitDialog e adicionando o processador ON_MESSAGE(). Pode não ter uma substituição de OnInitDialog(). Caso contrário, adicione um antes de continuar.
  3. Remover "virtual BOOL OnInitDialog();" do cabeçalho de classe e adicione "afx_msg LONG OnInitDialog (UINT, LONG);" no 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 secção de implementação de classe, efectue as alterações correspondentes.
  4. Adicionar "ON_MESSAGE (WM_INITDIALOG, OnInitDialog);" ao mapa de mensagem no ficheiro 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() mapeados por mensagem.
  5. Efectuar a conversão OnInitDialog() da seguinte forma:
       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, assim chamar um procedimento não funcionar. UpdateData denomina-se a subclasse ou inicializar quaisquer controlos subordinados.
  6. Certifique-se estilos de recurso da caixa de diálogo para o seguinte:
    Estilo: subordinado
    Boarder: nenhum
    Visível: não verificada
    Neste ponto, tudo tem sido ligado para efectuar a transformação de uma classe CDialog a uma classe CDialogBar funcionar correctamente. Agora, criar e utilizá-lo.
  7. Adicione uma instância de CDialogBar derivada para a classe derivada de CframeWnd (normalmente denominado CMainFrame). Por exemplo:
          class CMainFrame : public CFrameWnd
          {
              ...
              CMyDlgBar m_myDlgBar;
              ...
          };
    					
  8. Chamar o método create 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 pretende suportar ancoragem dinâmico e o redimensionamento do CDialogBar, adicionar as seguintes linhas no fim 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 de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
99161Como derivar classes não listadas na ClassWizard

Propriedades

Artigo: 185672 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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