Red de conocimiento informático - Problemas con los teléfonos móviles - Implementación de ventana dividida en tres frentes y vista múltiple en VC++ 6.0

Implementación de ventana dividida en tres frentes y vista múltiple en VC++ 6.0

1. Cita

Cuando los usuarios necesitan editar diferentes partes del documento al mismo tiempo, a menudo se usan ventanas divididas, estas ventanas pueden ser la misma vista o una sola ventana; es una vista de lista y la otra es una vista de árbol. Los marcos de aplicaciones tienen muchas formas de representar múltiples vistas y dividir ventanas es una de ellas.

La ventana dividida se divide en ventana dividida dinámica y ventana dividida estática. Ambas están implementadas por la clase CsplitterWnd (biblioteca de clases MFC). En estas dos representaciones, se crea relativamente la misma clase de vista. fácil (Cview), pero usar dos o más clases de vista (como: ClistView, CtreeView, etc.) en la misma aplicación es relativamente difícil.

La función de segmentación dinámica se usa principalmente en software de edición de texto. En el desarrollo real, a menudo usamos la función de segmentación estática. Ventana dividida estática significa que los paneles de la ventana dividida ya se crearon cuando se crea la ventana, y el número y el orden de los paneles no cambiarán. Los paneles están separados por una barra separadora y el usuario puede arrastrar la barra separadora. para ajustar El tamaño del panel correspondiente. Las ventanas divididas estáticas admiten hasta 16 filas y 16 columnas de paneles, y diferentes paneles suelen utilizar diferentes clases de vista. Este artículo explica principalmente la ventana de segmentación estática.

2. Ejemplo

Tomando como ejemplo una aplicación SDI de un solo documento, se implementa una ventana de tres frentes en el área del cliente del marco y cada panel utiliza una vista diferente.

Pasos de implementación:

1. Utilice el AppWizard de VC++6.0 para crear una aplicación SDI de un solo documento, con el nombre del proyecto Prueba.

2. Utilice el cuadro de diálogo Nueva clase para agregar una nueva clase de vista:

La clase base de CinfoView es la clase de vista de lista ClistView

La clase base de CLineView es la clase de vista de formulario CFormView

La clase base de CMyEditView es la clase de vista de edición CEditView

Puntos clave: antes de agregar ClineView, debe crear un recurso de plantilla de diálogo con el ID IDD_FORMVIEW,

3. Declare una variable miembro m_wndSplitter1 de la clase CsplitterWnd en la clase de ventana de marco CMainFrame para la primera división.

4. Utilice ClassWizard para agregar la función OnCreateClient a la clase de ventana de marco.

Nota: La función OnCreateClient se llama después de la función OnCreate y antes de que se construya el objeto de vista y se genere la ventana de vista.

5. Llame a CsplitterWnd::CreateStatic en la función OnCreateClient para generar segmentación estática. El prototipo de esta función es el siguiente:

BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle =

WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST);

La función tiene 5 parámetros, los significados son los siguientes:

● pParentWnd: el puntero de la ventana principal de la ventana dividida

● nRows: el número de líneas horizontales ventanas divididas

● nCols: el número de ventanas separadas verticalmente

● dwStyle: el estilo de las ventanas divididas

● nID: el valor de ID de la sub- ventana, el valor predeterminado es AFX_IDW_PANE_FIRST definido por el sistema

p>

Valor de retorno: si la creación es exitosa, devuelve un valor distinto de cero (VERDADERO); de lo contrario, devuelve 0 (FALSO).

m_wndSplitter1.CreateStatic(this, 2,1); // Dividir en 2 filas y 1 columna

6. virtual BOOL CreateView( int fila, int col, CRuntimeClass* pViewClass, TAMAÑO sizeInit, CCreateContext* pContext );

La función tiene 5 parámetros, el significado es el siguiente:

● fila : etiqueta de fila del panel, comenzando desde 0

● col: etiqueta de columna del panel, comenzando desde 0

● pViewClass: puntero a la clase de ejecución de la vista CRuntimeClass, que se puede obtener con la macro RUNTIME_CLASS

● sizeInit: un dato de tipo TAMAÑO (o CSize), que especifica el tamaño inicial del panel

● pContext: generalmente pasado desde la ventana principal, incluida la información de creación de la ventana

● p>

Valor de retorno: si la creación es exitosa, devuelve un valor distinto de cero (VERDADERO); de lo contrario, devuelve 0 (FALSO).

Código completo de la función OnCreateClient:

BOOL CMainFrame::OnCreateClient(LPCreateSTRUCT lpcs, CCreateContext* pContext)

{

/ / TODO: Agrega tu código especializado aquí y/o llama a la clase base

CRect rect;

GetClientRect(rect);

//Genera la primera estática Dividir

m_wndSplitter1.CreateStatic(this, //Puntero de la ventana principal

2, //Número de filas para dividir

1 // Dividir el número); de columnas

//Generar una vista para el primer panel

m_wndSplitter1.CreateView(0,0, // El número de fila y columna del panel

RUNTIME_CLASS(CTestView),//Ver clase

CSize(rect.Width(),rect.Height()-rect.Height()/5),//Tamaño de inicialización

pContext);//Parámetros de creación de la ventana principal

//Generar una vista para el segundo panel

m_wndSplitter1.CreateView(1,0,

RUNTIME_CLASS (CMyEditView),

CSize(rect.Width(),rect.Height()/5),

pContext);

devuelve VERDADERO;/ / Ya no llamar a la función OnCreateClient de la clase base

//return CFrameWnd::OnCreateClient(lpcs, pContext);

}

Hay tres puntos a tenga en cuenta aquí:

① Se debe crear una ventana de visualización para cada panel dividido estático, y no se puede perder ninguna;

② El archivo de encabezado de la clase correspondiente debe incluirse en MainFrm Archivo .cpp Comience a incluir los siguientes archivos de encabezado:

#include "TestView.h"

#include "MyEditView.h"

③Después de generar la segmentación estática , no puede llamar a la función OnCreateClient de la clase base predeterminada.

7. Declare una variable miembro m_wndSplitter2 de la clase CsplitterWnd en la clase de ventana de visualización CTestView para la segunda división.

8. Utilice ClassWizard para agregar la función OnCreate a la clase de ventana de vista CTestView y llame a la función CreateStatic y CreateView en esta función, similar a la llamada en la función CMainFrame::OnCreateClient

El código es el siguiente:

int CTestView::OnCreate(LPCreateSTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) = = -1)

return -1;

// TODO: Añade tu código de creación especializado aquí

CRect rect;

GetClientRect (rect);

//Obtener el puntero de información de creación de la ventana

CCreateContext *pContext = (CCreateContext*) lpCreateStruct-lpCreateParams;

//Generar segmentación estática secundaria

m_wndSplitter2.CreateStatic(this,1, 2);

//Generar una vista para el primer panel

m_wndSplitter2.CreateView(0, 0,//La fila del panel, Número de secuencia de columna

RUNTIME_CLASS(CLineView),//Ver clase

CSize(rect.Width()/4,rect.Height( )),//Tamaño de inicialización

pContext);//Parámetros de creación de la ventana principal

//Generar una vista para el segundo panel

m_wndSplitter2. CreateView(0,1,

RUNTIME_CLASS(CInfoView),

CSize(1,1),

pContext);

retorno 0;

}

Nota: La ventana principal de la segunda división es el primer panel de la primera división y su clase de vista es CTestView

9. Utilice ClassWizard para configurar la clase de la ventana de visualización CTestView Agregue la función OnSize y llame a la subfunción

SwitchView() en esta función. El código de la subfunción es el siguiente:

void CTestView::SwitchView()

{

CRect rect;

GetClientRect(rect);

int cx = rect. Ancho();

int cy = rect. Alto();

m_wndSplitter2.MoveWindow(-2,-2,cx,cy+3);

m_wndSplitter2.SetColumnInfo(0, cx/4,0);

p>

m_wndSplitter2.SetColumnInfo(1, cx-cx/4, 0);

m_wndSplitter2.RecalcLayout() ;

}

Esta función secundaria se utiliza principalmente para establecer la información de cada columna después de la segmentación secundaria. Se implementa a través de la función CSplitterWnd::SetColumnInfo. El prototipo es: void. SetColumnInfo( int col, int cxIdeal, int cxMin );

Consta de 3 parámetros, el significado es el siguiente:

● col: Identificador de columna de la ventana dividida

● c

xIdeal: el ancho real de la columna, en píxeles

● cxMin: el ancho mínimo de la columna, en píxeles

Los resultados de ejecución de este ejemplo son los siguientes:

Tres, Resumen

La forma de las ventanas divididas y la clase de vista utilizada para cada panel se pueden determinar de acuerdo con las necesidades reales para satisfacer las diferentes aplicaciones del programa. Este ejemplo utiliza segmentación de tres vías. La clase de vista utiliza la clase de vista de lista CListView, la clase de vista de formulario CFormView y la clase de vista de edición CEditView. Pasó la depuración en VC++6.0.

El método de división de tres frentes no es el único. El ejemplo de este artículo es un método que resumí en el desarrollo real. Los lectores pueden sacar inferencias de este ejemplo y comprender la esencia de combinar ventanas divididas y múltiples. -vistas.