Red de conocimiento informático - Conocimiento informático - Cómo obtener el puntero de clase de vista y los tres punteros de documento, vista, marco y aplicación

Cómo obtener el puntero de clase de vista y los tres punteros de documento, vista, marco y aplicación

1. Cómo obtener el puntero de clase de vista en la ventana del marco

CMDIFrameWnd *pFrame =

(CMDIFrameWnd*)AfxGetApp()-gt; // Obtiene la ventana secundaria MDI activa.

CMDIChildWnd *pChild =

(CMDIChildWnd *) pFrame-gt; GetActiveFrame();

// o CMDIChildWnd *pChild = pFrame-gt;

// Obtener la ventana secundaria MDI activa. MDIGetActive();

// Obtiene la vista activa conectada a la ventana secundaria MDI activa.

CMyView *pView = (CMyView *) pChild-gt.GetActiveView();

2 Obtener y aplicar punteros de ventana de documento, vista y marco

3 y Puntero de ventana de marco

1) Obtener el puntero del documento en Ver

2) Obtener el puntero de marco principal en la aplicación

3) Obtener el puntero de marco principal en Ver

4) Obtener el puntero Ver (creado)

5) Obtener el puntero del documento actual

6) Obtener los punteros de la barra de estado y de la barra de herramientas

7) Obtener la barra de estado y las variables de la barra de herramientas

8) Obtener el puntero del menú en el host

9) Obtener la clase de aplicación en cualquier clase

10) Obtener la clase de documento del puntero de clase de vista (1)

11) Obtener el puntero de plantilla de documento en la aplicación

12) Obtener el puntero de clase de documento de la plantilla de documento

13) Obtener el puntero de plantilla de documento en la clase de documento

14) Obtener el puntero de clase de vista de la clase de documento (2)

15) Obtener el puntero de una clase de vista a otra Un puntero a una clase de vista

15) Obtener un puntero de una clase de vista a otra clase de vista

15) Obtener un puntero de una clase de vista a otra clase de vista

15) Obtener el puntero de una clase de vista a otra clase de vista

15) Obtener el puntero de una clase de vista

15) Obtener el puntero de la vista clase en cualquier clase

Para los estudiantes que recién comienzan a aprender programación VC, el mayor obstáculo y problema es la adquisición y operación del mecanismo de mensajes y los punteros.

De hecho, estos contenidos son básicamente contenidos obligatorios en cada kit de herramientas de aprendizaje de VC y muchos problemas se pueden resolver a través de MSDN. El siguiente texto se basa principalmente en mi experiencia personal con el uso de punteros en programación. Corríjame si soy inapropiado.

Corríjame. Generalmente, el marco que utilizamos es el marco proporcionado por VC Wizard para generar el asistente de aplicación MFC (exe).

Ya sean varios documentos o documentos únicos, existen problemas con la adquisición y operación del puntero. Lo siguiente se centrará en el marco general

y luego presentará el uso de punteros en subprocesos múltiples. La clase utilizada debe contener el archivo de encabezado de respuesta. Primero

Generalmente obtenga el puntero de instancia de esta clase (compatible con vistas, documentos y cuadros de diálogo. El propósito de usar esto es principalmente

cambiar el puntero a través de las funciones en). esta clase. Enviado a otras clases o funciones para facilitar las operaciones fuera de esta clase y el uso de funciones

en esta clase.

1) Obtener el puntero del documento en la vista CYouSDIDoc *pDoc=GetDocument(); Una vista sólo puede tener un archivo de documento

.

2) Obtener el puntero MainFrame en la aplicación

La variable m_pMainWnd en CWinApp es un puntero a MainFrame

Además: CMainFrame *pMain = (CMainFrame * ) AfxGetMainWnd();

3) Obtener el puntero de MainFrame CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-gt;

4) Obtener el puntero de vista (creado) CMainFrame *pMain=( CmaimFrame *)AfxGetApp()-gt; m_pMainWnd;

CyouView *pView=(CyouView *)pMain-gt(); puntero de documento CDocument * pCurrentDoc = (CFrameWnd *)m_pMainWnd-gt; GetActiveDocument();

6) Obtener la barra de estado y el puntero de la barra de herramientas CStatusBar * pStatusBar = (CStatusBar *)AfxGetMainWnd()-gt; );

6) Obtener la barra de estado y los punteros de la barra de herramientas CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()-gt; GetDescendantWindow(AFX_IDW_STATUS_BAR);

CToolBar * pToolBar =( CtoolBar *); )AfxGetMainWnd()-gt; GetDescendantWindow(AFX_IDW_STATUS_BAR);

7) Obtener la barra de estado y el puntero de la barra de herramientas GetDescendantWindow(AFX_IDW_ TOOLBAR);

7) Si el marco agrega herramientas Bar y las variables de la barra de estado también pueden ser así

(CMainFrame *)GetParent()-gt; m_wndToolBar

(CMainFrame *)GetParent()-gt; >

8) Obtener el puntero del menú CMenu en el host *pMenu=m_pMainWnd-gt; GetMenu()

9) Obtener la clase de aplicación en cualquier clase

Usar el Función global de MFC AfxGetApp() para obtenerlo.

10) Obtener el puntero a la clase de vista de la clase de documento

El propósito de obtener el puntero a la clase de vista del documento es generalmente controlar el posicionamiento de múltiples vistas en el mismo documento, mi experiencia es

Específicamente, CEditView en el procesamiento de textos necesita mucho esta función al generar múltiples clases de vista.

La clase CDocument proporciona dos funciones para el posicionamiento de la clase de vista:

GetFirstViewPosition() y GetNextView()

POSICIÓN virtual GetFirstViewPosition() const;

virtual CView* GetNextView(POSITIONamp; rPosition) const;

Nota: Los parámetros entre paréntesis de GetNextView() se utilizan como referencia, por lo que sus valores pueden cambiar después de la ejecución.

GetFirstViewPosition() se utiliza para devolver la posición de la primera vista (no es un puntero a la clase de vista, sino un valor de tipo

POSITION), mientras que GetNextView() tiene dos funciones. : Devuelve un puntero a la siguiente clase de vista y cambia el valor entrante del parámetro de tipo POSICIÓN. Obviamente, solo hay

una clase de vista en el programa de prueba, por lo que solo necesita llamar a estas dos funciones una vez para obtener el puntero de CTestView, de la siguiente manera (debe definir la variable de estructura POSITION para ayudar la operación):

CTestView* pTestView;

POSITION pos=GetFirstViewPosition();

pTestView=GetNextView(pos); De esta forma se puede obtener el puntero pTestView de la clase CTestView. Después de ejecutar algunas oraciones, la variable pos = NULL desaparecerá porque no hay una siguiente clase de vista y, naturalmente, no hay una POSICIÓN que apunte a la siguiente clase de vista. Sin embargo, estas declaraciones son demasiado simples para ser demasiado generales y seguras; como dijimos anteriormente, cuando queremos devolver punteros a clases específicas en múltiples vistas, debemos recorrer todas las clases de vistas hasta encontrar la clase especificada. Para determinar si un puntero de clase apunta a una instancia de una clase, utilice la función miembro IsKindOf(), por ejemplo

pView-gt; Compruebe si pView apunta a la clase CTestView.

Con la base anterior, ya podemos obtener un puntero a cualquier clase de la clase de documento. Por conveniencia, lo convertimos en una función miembro de la clase de documento, con un parámetro que indica la clase de la cual se obtendrá el puntero.

El proceso de implementación es el siguiente:

CView* CTestDoc::GetView(CRuntimeClass* pClass)

{

CView* pView; >POSICIÓN pos =GetFirstViewPosition();

mientras(pos!=NULL){

pView=GetNextView(pos); ; IsKindOf(pClass))

romper

}

if(!pView-gt. IsKindOf(pClass)){

AfxMessageBox(" Connt Localice la vista.\r\n ");

return NULL

}

return pView; }

IsKindOf() de la clase de vista se usó dos veces, porque hay tres posibilidades

para salir del bucle while:

1 pos es NULL, es decir, ya no existe la siguiente clase de vista con la que trabajar;

2.

Tanto 1 como 2 satisfacen los requisitos. Esto se debe a que la función de GetNextView() es cambiar el puntero de la vista actual a la posición de una vista

y al mismo tiempo devolver el puntero de la vista actual, por lo que pos es la posición de la siguiente vista. clase de pView y pos == NULL Es completamente posible cumplir con los requisitos con pView

. Cuando la vista deseada es la última vista, la última

clase de vista es la última

clase de vista a la que se hace referencia. Por tanto, es necesario utilizar dos juicios.

Se debe seguir el siguiente formato al utilizar esta función (tomando como ejemplo la obtención del puntero CTestView):

CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView)) ;

RUNTIME_CLASS.CLASS es una macro que se puede obtener utilizando RUNTIME_CLASS.CLASS.GetView(RUNTIME_CLASS(CTestView)). CLASS es una macro y simplemente puede comprender su función: convertir el nombre de la clase en un puntero

CRuntimeClass. En cuanto a la conversión, también es por razones de seguridad, porque los tipos de puntero de la misma clase base

son compatibles entre sí. Puede que este yeso no sea necesario, pero evita

algunos posibles problemas.

3. Obtener un puntero a otra clase de vista desde una clase de vista. Combinando los puntos 1 y 2, podemos descubrir fácilmente cómo obtener punteros entre clases de vista:

La forma de obtener el puntero a la clase de documento es usar la clase de documento como retransmisión, primero use el punto 1 para obtener el puntero a la clase de documento y luego use el punto 2 para obtener la función de localización de vistas de la clase de documento para obtener un puntero a otra vista Puntero a una clase.

Esto se puede lograr mediante el uso de funciones: clase de documento, clase de documento, función de localización de vistas.

Asimismo, se puede implementar como una función:

(Supongamos que desea obtener un puntero a otra clase de vista desde CTestAView)

CView* CTestAView::GetView(CRuntimeClass* pClass)

{

CTestDoc* pDoc=(CTestDoc*)GetDocument();

CView* pView

POSICIÓN pos=pDoc-; gt; GetFirstViewPosition();

mientras(pos!=NULL){

pView=pDoc-gt; -gt;IsKindOf(pClass))

romper;

}

if(!pView-gt;IsKindOf(pClass)) {

AfxMessageBox("Connt Localice la vista.");

return NULL;

}

return pView; /p>

En comparación con GetView() en 2, esta función tiene una primera oración adicional para obtener el puntero de clase de documento, y está antes de que

GetFirstViewPosition() y GetNextView() tengan los punteros de clase de documento. se han agregado para indicar que son funciones miembro de la clase Documento

. Utilice esta función cuando desee obtener el puntero de CTestBView desde CTestAView, como

Lo siguiente: CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView)); >11) También se pueden agregar varias plantillas de documentos a un solo documento, pero MDI generalmente se usa para el desarrollo

Plantillas de documentos múltiples, el método es muy similar al método anterior para obtener vistas,

Puedes usar CWinApp.GetFirstDocTemplate para obtener la vista,

También puedes usar CWinApp.GetFirstDocTemplate para obtener la vista,

También puedes usar CWinApp.GetFirstDocTemplate para obtener la vista: GetFirstDocTemplatePostion para registrar la aplicación. La posición de la primera plantilla de documento

utilice este valor para llamar a la función CWinApp::GetNextDocTemplate para obtener un puntero al primer

CDocTemplate. objeto. POSICIÓN GetFirstDocTemplate( ) const;

CDocTemplate *GetNextDocTemplate( POSICIÓN amp; pos ) const

La segunda función devuelve la plantilla de documento identificada por pos. POSICIÓN es un valor definido por MFC que se utiliza para la iteración o la recuperación de puntero de objeto

. A través de estas dos funciones, la aplicación puede recorrer en iteración toda la lista de plantillas de documentos. Si la plantilla de documento

recuperada es la última en la lista de plantillas, el parámetro pos se establecerá en NULL.

) Una plantilla de documento puede tener varios documentos, y cada plantilla de documento retiene y mantiene una lista de punteros a todos los archivos de documentos

correspondientes.

Utilice la función CDocTemplate::GetFirstDocPosition para obtener la posición del primer

documento en la colección de documentos asociada con la plantilla de documento y pase el valor POSITION como argumento a CDocTemplate: :GetNextDoc para iterar repetidamente a través de la lista de documentos asociados con la

plantilla y la lista de documentos asociados con la

plantilla. El prototipo de la función es:

POSICIÓN viaual GetFirstDocPosition( ) const = 0;

CDocumento visual *GetNextDoc(POSICIÓN amp; rPos) const = 0; la lista está vacía, rPos se establecerá en NULL.

13) En un documento, puede llamar a CDocument::GetDocTemplate para obtener un puntero a la plantilla del documento.

El prototipo de la función es el siguiente: CDocTemplate * GetDocTemplate ( ) const;

Si el documento no pertenece a la gestión de plantillas de documentos, el valor de retorno es NULL.

14) Un documento puede tener múltiples vistas. Cada documento guarda y mantiene una lista de todas las vistas relacionadas.

CDocument::AddView adjunta la vista al documento, agrega la vista a la lista de vistas asociadas con el documento

y apunta el puntero del documento de la vista al documento. MFC llama automáticamente a esta función cuando un objeto de vista recién creado se adjunta a un documento mediante el comando Archivo/Nuevo, Archivo/Abrir, Windows/Nuevo o

Ventana/Dividir. Y el marco asocia documentos con vistas. a través de la estructura del documento/vista. Por supuesto, el programador también puede llamar a esta función si es necesario.

POSICIÓN virtual GetFirstViewPosition( ) const;

Virtual CView * GetNextView( POSITION & rPosition) cosnt

La aplicación puede llamar a CDocument::GetFirstViewPosition para devolver el valor. Same Llama a la posición de la primera vista en la lista de vistas asociada con el documento y llama a CDocument::GetNextView para devolver la vista en la posición especificada y establecer el valor de

rPositon para la siguiente vista en la lista. Valor de POSICIÓN. Si la vista encontrada es la última

vista de la lista, rPosition se establecerá en NULL.

15) Obtener un puntero a otra clase de vista desde una clase de vista

Esta aplicación es muy común en aplicaciones multivista y se puede realizar usándola en el programa principal o en el programa principal. framework.variable

Símbolo de cantidad u obtener la clase de documento como un puntero a la clase de vista. Un enfoque más común es utilizar la clase de documento como punto de referencia para recorrer las vistas de la clase de documento

para localizar y obtener otra clase de vista. El artículo 10 de este artículo proporciona esta funcionalidad.