Red de conocimiento informático - Material del sitio web - Cómo leer el código del programa MFC

Cómo leer el código del programa MFC

Cómo leer el código del programa MFC Antes de leer el siguiente contenido, se recomienda que estudie "Una guía simple para MFC". Ahora es sólo cuestión de entender. ¡También podría hacer una copia de seguridad de sus conocimientos! En los programas MFC, no solemos llamar directamente a la API de Windows, sino que creamos objetos a partir de clases MFC y llamamos a funciones miembro que pertenecen a estos objetos. En otras palabras, MFC encapsula la API de Windows. Dice que le gusta C, y MFC es otra forma de decirlo. Es una biblioteca de funciones escrita en C y luego la llama, pero esta clase no la escribe usted. MFC proporciona cientos de clases, las más importantes son las dos clases CWinApp y CFrameWnd que son esenciales para escribir cualquier aplicación VC. Dos clases son los componentes básicos para escribir aplicaciones grandes y complejas. 1 Características de encapsulación: el marco MFC está compuesto por la biblioteca de clases MFC, y la biblioteca de clases MFC es una biblioteca de clases de C. Estas clases encapsulan la interfaz de programación de aplicaciones WIN32, características OLE (Object Link Embed), funciones de acceso a datos ODBC y DAO. 2 Características de herencia: MFC abstrae las características únicas de muchas clases y diseña algunas clases base como base para implementar otras clases. Las clases más importantes entre estas clases son la clase CObject y la clase CCmdTarget. Los programadores pueden comenzar con la clase Derive propia. clase de la clase MFC para implementar funciones específicas para lograr propósitos de programación. 3 Mapeo virtual y de mensajes: MFC se basa en C y, por supuesto, admite funciones virtuales. Sin embargo, como marco de programación, debe resolver el problema de la eficiencia: si MFC solo admite restricciones dinámicas a través de funciones virtuales, inevitablemente generará una gran cantidad. de tablas de funciones virtuales. Los marcos de programación están demasiado inflados y consumen más memoria. Sin embargo, MFC ha establecido un mecanismo de mapeo de mensajes, que reduce el uso de memoria y mejora en gran medida la eficiencia. El mapeo de mensajes es una tabla que asocia mensajes y funciones miembro. Cuando la ventana del marco de la aplicación recibe un mensaje, MFC buscará el mapeo de mensajes de la ventana. hay un controlador que procesa el mensaje, luego se llama al controlador, que implementa el mapeo de mensajes a funciones miembro a través de macros, y estas funciones no tienen que ser funciones miembro virtuales, por lo que no es necesario generar una función de mapeo de mensajes. Gran tabla de funciones virtuales (tabla V), ahorrando memoria. Mecanismo de mapeo de mensajes MFC: vincula mensajes con funciones de procesamiento de mensajes para formar un mecanismo de correspondencia uno a uno. Declaración de macro de mapa de mensajes: DECLARE_MESSAGE_MAP Definición: BEGIN_MESSAGE_MAP ON_COMMAND ON_CONTROL ON_MESSAGE END_MESSAGE_MAP Componentes principales de MFC: clases, macros y funciones globales. Las clases son el contenido más importante de MFC. Las clases de MFC están organizadas de forma jerárquica. Las clases en MFC se dividen en dos partes, excepto algunas clases auxiliares, la mayoría de las clases MFC se derivan directa o indirectamente de la clase raíz CObject. Las funciones principales de la macro MFC: mapeo de mensajes, servicios de tipo de objeto en tiempo de ejecución, servicios de diagnóstico y manejo de excepciones. Convención MFC: las funciones globales tienen el prefijo "Afx" y las variables globales tienen el prefijo "afx". Relación jerárquica de las clases MFC: clase de proyecto CObject) -CCmdTarget (clase de respuesta de mensaje) -{CWinThread (clase de subproceso) -CWinApp (ventana). clase de aplicación) )CDocument (clase de documento) CWnd (clase de formulario) - [CFrameWnd (clase de marco) CView (clase de vista)]} Clase CObject Dado que la mayoría de las clases en MFC heredan de la clase CObject, la clase CObject describe casi todas algunas características públicas. De las clases MFC, la clase CObject proporciona a los programadores funciones como diagnóstico de objetos, identificación de tipos de tiempo de ejecución y serialización.

La clase CCmdTarget se deriva directamente de la clase CObject y es responsable de enviar mensajes a objetos que pueden responder a estos mensajes. Es la clase base para todas las clases MFC que pueden realizar mapeo de mensajes. La clase CWinApp tiene uno y sólo un objeto de la clase derivada de CWinApp en cualquier aplicación MFC, que representa el subproceso principal que se ejecuta en el programa y también representa la aplicación misma. La clase CWinApp reemplaza la función principal WinMain() en la aplicación SDK. El trabajo realizado por la función WinMain() de las aplicaciones SDK tradicionales. Ahora depende de tres funciones miembro de InitApplication(), InitInstance() y Run() de la clase CWinApp. La clase CWnd se deriva directamente de la clase CCmdTarget y las instancias de esta clase y sus clases derivadas son ventanas. La clase CWnd representa el objeto GUI más básico en MFC. Es una clase MFC con las funciones más completas y la mayoría de funciones miembro. La clase CFrameWnd es una clase derivada de la clase CWnd y se utiliza principalmente para administrar una ventana. Reemplaza la posición de la función de ventana WndProc() en la aplicación SDK. El objeto de la clase CFrameWnd es una ventana de marco, que incluye bordes, barra de título, menú, botón de maximizar, botón de minimizar y una vista activa. La clase CDocument sirve como clase base de la clase de documento de usuario en la aplicación. Representa un archivo almacenado o abierto por el usuario. La clase CView es una clase muy básica en MFC. Sirve como clase base para otras clases de vista de MFC y clases derivadas de vistas de usuario.

Transición de la programación API a la programación MFC: WinMain(){Inicializar WNDCLASS Registrar estructura de formulario Crear clase de aplicación de ventana CWinApp Mostrar bucle de mensajes de ventana}WndProc(){switch(…){case:…}-Clase de ventana de marco CFrameWnd} Correspondencia entre MFC Objeto y objeto de Windows: Describe el identificador de Windows Ventana de objeto MFC HWND CWnd contexto del dispositivo HDC Menú CDC HMENU CMenu pen HPEN CPen pincel HBRUSH Fuente CBrush HFONT CFont mapa de bits HBITMAP CBitmap socket SOCKET CSocket 3. Cree manualmente una aplicación MFC: Nota: Para crear un programa MFC , cree un proyecto Win32 vacío y seleccione "Usar MFC en un archivo DLL compartido en las propiedades del proyecto, y luego cree nuestro archivo de ejemplo: agregue el archivo de encabezado "hello.h" Escriba el siguiente código: class CMyApp: public CWinApp{ público: virtual BOOL InitInstance(); // función virtual}; clase CMainWindow: public CFrameWnd{public: CMainWindow(); protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP(); // Declarar mapeo de mensajes}; el archivo fuente "hello.cpp": #include afxwin.h #include "hello.h"CMyApp myApp; BOOL CMyApp: InitInstance(){m_pMainWnd=new CMainWindow() return; TRUE;}BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)ON_WM_PAINT()END_MESSA GE_MAP()//Asignación de mensajes CMainWindow: CMainWindow()//Inicialización del constructor {Create(NULL, "Mi primera aplicación MFC" //Crear un formulario} void CMainWindow); : OnPaint(){CPaintDC dc(this); CRect rect; GetClientRect(amp; rect); dc.DrawText("Hola MFC", - 1, amp; rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);} CWinApp es una clase de aplicación En una aplicación MFC, se debe derivar una clase de esta clase. Esta clase derivada es la entrada a la aplicación MFC. El objeto de esta clase derivada debe estar definido y solo hay un objeto que representa toda la aplicación. Función miembro: InitInstance() Función: inicializa la instancia de la aplicación y la instancia de la ventana, función virtual CWinApp: InitInstance debe reescribirse en clases derivadas. En la función InitInstance, escriba código de inicialización, como: crear una ventana y mostrar una ventana. La función de la clase CFrameWnd es proporcionar una ventana para la aplicación e implementar funciones de procesamiento de mensajes. Función miembro: Función Create(): crea un formulario y asígnalo al objeto CFrameWnd.

BOOL Crear (tipo de ventana, título de ventana, estilo de visualización, área de visualización, identificador de ventana de caracteres, menú, estilo de visualización extendido, objeto de contexto)*** tiene 8 parámetros, se deben proporcionar los dos primeros y los últimos 6 pueden ser predeterminados.

El núcleo de la aplicación MFC es el objeto de aplicación basado en la clase CWinApp. CWinApp proporciona un bucle de mensajes para recuperar mensajes y enviarlos a la ventana de la aplicación. Cuando escribimos una aplicación MFC, debemos incluir afxwin.h, una aplicación MFC. Puede haber uno y solo un objeto de aplicación, y el objeto debe declararse válido en el ámbito global (es decir, el objeto global) para que se cree una instancia en la memoria cuando se inicia el programa. Se nombra nuestra clase de aplicación Hello MFC. CMyApp, cuya instancia se crea en hello.cpp con la siguiente declaración: CMyApp myApp; La declaración de clase de CMyApp es la siguiente en hello.h: class CMyApp: public CWinApp{public: virtual BOOL InitInstance();}; Cualquier miembro de datos simplemente anula una función heredada de la clase CWinApp. Se llama relativamente temprano en la vida útil de la aplicación, después de que la aplicación comienza a ejecutarse y antes de que se cree la ventana, a menos que InitIstance cree una ventana. ventana, razón por la cual incluso la aplicación MFC más pequeña debe derivar una clase de CWinApp y anular CWinApp: InitIstance La función InitInstance: CWinApp: InitInstance es una función virtual cuya operación predeterminada solo contiene una declaración: return TRUE es el mejor lugar; para realizar el trabajo de inicialización que debe realizarse cada vez que se inicia el programa. En hello.cpp, InitInstance de CMyApp crea una ventana de saludo creando una instancia de la clase CMainWindow de hello. La declaración: m_pMainWnd=new CMainWindow construye un puntero de objeto CMainWindow y lo copia. su dirección al miembro de datos m_pMainWnd del objeto de la aplicación. Después de crear la ventana, InitInstance llamará a las funciones ShowWindow y UpdateWindow a través del puntero CMainWindow para mostrarla: m_pMainWnd-ShowWindow(m_nCmdShow); son las funciones miembro de CWnd utilizadas por todos los objetos de ventana, incluidos los objetos de la clase CFrameWnd. CMainWindow se deriva de CFrameWnd. Para llamar a una función API de Windows normal desde un programa MFC, debe agregar un operador global antes del nombre de la función: por ejemplo. : UpdateWindow(); al generar un objeto de ventana y llamar a su función Crear, una aplicación MFC puede crear una ventana. En CMyApp:InitInstance, hello crea un objeto CMainWindow, CMainWindow El constructor genera la ventana que se ve en la pantalla: Create(NULL, "Mi primera aplicación MFC"); CPaintDC dc(this); la clase CPaintDC de MFC se deriva de la clase CDC de MFC, y la clase CDC se encapsula con el entorno de dispositivos de Windows y docenas de funciones miembro que atraen a pantallas, impresoras y otros dispositivos. ¿Procesa mensajes en MFC? En el SDK utilizamos el bucle de mensajes y las funciones de procedimiento de ventana para procesar mensajes. En MFC utilizamos el mecanismo de asignación de mensajes.

Todo lo que necesita hacer para agregar a una clase. 1. Declarar el mapa de mensajes agregando la declaración DECLARE_MESSAGE_MAP a la declaración de clase. 2. Realice el mapeo de mensajes colocando una macro que identifique el mensaje. La clase correspondiente se colocará entre llamadas. a BEGIN_MESSAGE_MAP y END_MESSAGE_MAP 3. Agregar funciones miembro para procesar mensajes 1. Construir un objeto de la clase derivada de CWinApp 2. Llamada al sistema WinMain() 3. WinMain llama a InitInstance, crea un objeto de clase derivada CFrameWnd en esta función, llama a la función Crear. para crear una ventana y llamar a la función ShowWindow Mostrar ventana. 4. Luego, el mecanismo interno llama a Ejecutar para aceptar el mensaje del usuario y dirigir el mensaje a la función de procesamiento predeterminada. Al recibir el mensaje WM_QUIT, Run llama internamente a ExitInstance para salir del programa. MFC utiliza el mecanismo de mapa de mensajes para reemplazar la estructura de cambio de caso en el lenguaje C/C para procesar mensajes. Mapeo de mensajes: un mecanismo en MFC que conecta funciones de procesamiento de mensajes con los mensajes específicos que procesa. Utiliza macros para asignar mensajes a funciones miembro, y estas funciones no tienen que ser funciones miembro virtuales. Esto elimina la necesidad de generar una tabla de funciones virtuales grande (tabla V) para la función de asignación de mensajes, lo que ahorra memoria. El mecanismo de asignación de mensajes de MFC incluye un conjunto de macros de asignación de mensajes. Una macro de mapa de mensajes asocia un mensaje de Windows con su función de procesamiento de mensajes. El marco de la aplicación MFC proporciona funcionalidad de asignación de mensajes. Utilice las macros BEGIN_MESSAGE_MAP() y END_MESSAGE_MAP() en el archivo fuente de implementación de la clase para definir el mapa de mensajes. Utilice la macro DECLARE_MESSAGE_MAP() al final de la definición de clase para declarar el uso de un mapa de mensajes.