Red de conocimiento informático - Material del sitio web - Cómo crear múltiples vistas en un solo documento mfc

Cómo crear múltiples vistas en un solo documento mfc

Los pasos básicos son los siguientes:

1. Primero cree una aplicación de documento único MFC.

2. Agregue 4 clases MFC TopLView, BottomLView, TopRView y BottomRView, y la clase base es CView.

3. Agregue una clase MFC CControlForm, la clase base es CFormView y el ID del cuadro de diálogo es el predeterminado.

4. Cree una clase dividida, como MySplitter, y la clase base es CSplitterWnd (no existe tal clase en las opciones de clase base predeterminadas, puede agregarla usted mismo).

5. En el archivo de encabezado de la clase de marco Cmainframe, agregue dos variables MySplitter (porque se requieren dos operaciones de división a continuación).

6. Reescriba la función OnCreateClient de la clase de marco Cmainframe de la siguiente manera:

// La primera segmentación estática CreateStatic, una fila y dos columnas

if ( ! m_wndSplitter.CreateStatic(this, 1, 2))

return FALSE;

// Segunda segmentación estática (divide la segunda columna después de la primera segmentación por 2*2) y todo Se crean subvistas (función CreateView).

if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) ||

!m_wndSplitter2.CreateStatic(amp; m_wndSplitter, 2, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 1))|| !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(TopLView), CSize(350, 240), pContext) || > !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) || , 240), pContext) ||

!m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(BottomRView), CSize(350, 240), pContext))

{

m_wndSplitter.DestroyWindow();

return FALSE;

}

// return CFrameWnd::OnCreateClient(lpcs, pContext); Comente la función de respuesta original

Nota: recuerde agregar los archivos de encabezado de las cinco clases de vista anteriores en Mainfrm.h:

#include "CControlForm.h"

#include "TopLView.h"

#include "TopRView.h"

#include "BottomLView.h"

#include "BottomRView. h"

6. La vista dividida se completa y los resultados son los siguientes:

Entre ellos, la vista más a la izquierda es del tipo FormView y la operación es similar a un cuadro de diálogo. cuadro (puede ver sus recursos correspondientes en el cuadro de diálogo Recurso-Diálogo; las cuatro operaciones a la derecha son similares a la vista normal);

Contenido complementario:

a. Las barras divisorias entre las subvistas creadas en este momento se pueden arrastrar para cambiar el tamaño de la vista. Si desea arreglar la barra divisoria, debe sobrecargar la función de respuesta del mouse de la clase MySplitter. Puedes controlar si la barra divisoria se puede arrastrar a través de una variable Bool:

if (Isvisable) //Isvisable se ha inicializado a FALSE en el constructor

{

CSplitterWnd::OnLButtonDown(nFlags, point);

}

b. También puede cambiar el estilo de la barra divisoria sobrecargando la función OnDrawSplitter de la clase MySplitter.

El siguiente es el código de función:

{

#define LP RGB(128, 128, 128)

#define RB RGB(192, 192, 192 )

//Si pDC es NULL, solo el área de la ventana dividida no es válida

if (pDC == NULL)

{

RedrawWindow (rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);

return;

}

ASSERT_VALID(pDC);

CRect rc = rect ;

switch(nType)

{

case splitBorder:

//Volver a dibujar el borde de la ventana dividida

pDC-gt;Draw3dRect(rc,LP,LP);

rc.InflateRect(-1,-1);

Draw3dRect(rc,RB); , RB );

retorno;

caso splitBox:

pDC-gt; rc.InflateRect(-1,-1);

pDC-gt; Draw3dRect(rc, LP, LP);

rc.InflateRect(-1,-1); /p >

pDC-gt; FillSolidRect(rc, RGB(128, 128, 128));

pDC-gt; > return ;

case splitBar:

//Volver a dibujar la barra dividida

pDC-gt;

rc.InflateRect(-1,-1);

pDC-gt; p>

predeterminado:

ASSERT(FALSE);

}

//Rellena la parte media

pDC-gt ; Draw3dRect (rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));