Cómo inicializar controles secundarios en un CDialogBar derivada

Seleccione idioma Seleccione idioma
Id. de artículo: 185672 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Al crear un sencillo CDialogBar, como con sólo CButtons similar a preliminar de MFC, no es necesario derivar de CDialogBar porque el elemento primario de CControlBar recibe los mensajes de notificación de los controles secundarios.

Sin embargo, en el caso de un CDialogBar más compleja, que podría tener un cuadro combinado de lista desplegable, treeview o control ActiveX, puede resultar útil derivar CDialogBar para proporcionar la inicialización para los controles secundarios.

Porque pero no admite derivar una clase CDialogBar, este artículo muestra los pasos necesarios para crear una clase de CDialog y, a continuación, "convertir" la clase a CDialogBar.

Más información

Para empezar, cree una clase CDialog con los controles secundarios que desee utilizar. Puede transformar la clase CDialog en una clase CDialogBar mediante los nueve pasos siguientes:

  1. Cambiar la clase base de CDialog CDialogBar en la declaración de clase. No olvide cambiar también la clase base BEGIN_MESSAGE_MAP en el archivo .cpp.
  2. Cambie el constructor en archivos .cpp y .h el. También realizar el cambio a la DoDataExchange(). A continuación son tres elementos para cambiar.

    Cambiar lo siguiente desde
          CMyDlgBar (CWnd* pParent = NULL);   // standard constructor
    
          CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)
             : CDialog(CMyDlgBar::IDD, pParent)
          {
             ...
    
          void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
          {
             CDialog::DoDataExchange(pDX);
             ...
    					
    al siguiente:
          CMyDlgBar ();   // standard constructor
    
          CMyDlgBar:: CMyDlgBar ()
          {
             ...
    
          void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
          {
             CDialogBar::DoDataExchange(pDX);
             ...
    					
    la clave a la transformación es la conversión de la función de miembro virtual OnInitDialog() al método de mensaje asignado WM_INITDIALOG cambiando el método OnInitDialog y agregando el controlador ON_MESSAGE(). No tiene un reemplazo de OnInitDialog(). Si no es así, agregue uno antes de continuar.
  3. Quitar "virtual BOOL OnInitDialog();" de la cabecera de clase y agregue "afx_msg LONG OnInitDialog (UINT, LONG);" en su lugar. Por ejemplo:
          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()
          };
    						
    ahora, en la sección de implementación de clase, realice los cambios correspondientes.
  4. Agregar "ON_MESSAGE (WM_INITDIALOG, OnInitDialog);" en el mapa de mensajes en el archivo de implementación .cpp. Por ejemplo:
          BEGIN_MESSAGE_MAP(CMyDlgBar, CDialogBar)
    
             //{{AFX_MSG_MAP(CMyDlgBar)
             ...
             //}}AFX_MSG_MAP
             ON_MESSAGE(WM_INITDIALOG, OnInitDialog )    // <-- Add this line.
          END_MESSAGE_MAP()
    						
    ahora, convertir el OnInitDialog() virtual para el OnInitDialog() asignado en el mensaje.
  5. Realizar la conversión de OnInitDialog() como sigue:
       Change the following:
    
          BOOL CMyDlgBar::OnInitDialog()
          {
             CDialog::OnInitDialog();   // <-- Replace this line:
                ...
    						
    al siguiente:
    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;
    						
    el CDialogBar (clase) no tiene un OnInitDialog() virtual y, por lo tanto, llamar a uno no funciona. UpdateData llama a la subclase o inicializar los controles secundarios.
  6. Asegúrese de que los estilos de recurso de cuadro de diálogo al siguiente:
    Estilo: secundario
    Boarder: ninguno
    Visible: desactivado
    En este momento, todo lo que ha vuelto a ha conectar a realizar la transformación de una clase CDialog a una clase CDialogBar funcione correctamente. Ahora, crear y utilizarlo.
  7. Agregue una instancia de la CDialogBar derivada a la clase derivada CframeWnd (que normalmente se denomina CMainFrame). Por ejemplo:
          class CMainFrame : public CFrameWnd
          {
              ...
              CMyDlgBar m_myDlgBar;
              ...
          };
    					
  8. Llame al método create de la variable m_myDlgBar en el método CFrameWnd::OnCreate() similar al siguiente:
          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. Por último, si desea que admiten el acoplamiento dinámicas y cambio de tamaño de la CDialogBar, agregar las líneas siguientes al 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;
          }

Referencias

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
99161Cómo derivar de clases que no figuran en ClassWizard

Propiedades

Id. de artículo: 185672 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palabras clave: 
kbmt kbhowto kbmfcctrlbar kbuidesign kbwizard KB185672 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 185672

Enviar comentarios

 

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