Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

Cómo inicializar controles secundarios en un CDialogBar derivada

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.

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