El tutorial introductorio más detallado de MFC [reproducido]

En el proceso de aprendizaje de MFC, encontré el siguiente tutorial relativamente bueno y lo reproduzco aquí para registrar
la dirección original: MFC El tutorial introductorio más detallado

 

De: https://blog.csdn.net/wang18323834864/article/details/78621633/

Visual Studio 2019: https://visualstudio.microsoft.com/zh-hans/

 

Pollo picoteando arroz ----- Catálogo y resumen del tutorial introductorio de programación VS2010/MFC: http://www.jizhuomi.com/software/257.html

      1. Catálogo de tutorial de programación VS2010/MFC

       Parte 1: Entorno de desarrollo VS2010/MFC

       Introducción a la programación de VS2010/MFC Prefacio
       Uno de la introducción a la programación de VS2010/MFC (diagrama del proceso de instalación de VS2010 y MSDN)

       Parte II: marco de aplicación de VS2010/MFC

       Primeros pasos con la programación de VS2010/MFC Parte 2 (Uso del asistente de MFC para generar un marco de aplicación de un solo documento) Primeros
       pasos con la programación de VS2010/MFC Parte 3 (La composición y estructura de los archivos en la ingeniería de aplicaciones de VS2010) Primeros
       pasos con VS2010/MFC Programación Parte 4 (Análisis del marco de trabajo de la aplicación MFC)
       Introducción a VS2010/MFC Programación cinco (Descripción general del mecanismo de asignación de mensajes MFC)

       Parte III: Diálogo

       Primeros pasos con VS2010/MFC Programación Seis (Cuadro de diálogo: Crear plantilla de diálogo y Modificar propiedades de diálogo) Primeros
       pasos con VS2010/MFC Programación Siete (Cuadro de diálogo: Adición de controles a cuadros de diálogo)
       Primeros pasos con VS2010/MFC Programación Ocho (Cuadro de diálogo: Crear clase de cuadro de diálogo y agregar variables de control)
       Entrada de programación VS2010/MFC nueve (cuadro de diálogo: agregar función de procesamiento de mensajes para el control)
       Entrada de programación VS2010/MFC diez (cuadro de diálogo: establecer el orden de tabulación del control del cuadro de diálogo)
       VS2010/MFC entrada de programación El undécimo (cuadro de diálogo: cuadro de diálogo modal y su proceso emergente)
       La duodécima introducción a la programación VS2010/MFC (cuadro de diálogo: la creación y visualización de cuadros de diálogo no modales) La
       decimotercera introducción a la programación VS2010/MFC ( cuadro de diálogo: Introducción a los cuadros de diálogo de la página de propiedades y clases relacionadas) Introducción
       a la programación de VS2010/MFC catorce (cuadro de diálogo: creación y visualización de cuadros de diálogo del asistente) Introducción a la
       programación de VS2010/MFC decimoquinto (cuadro de diálogo: creación y visualización de la página de propiedades generales pantalla)
       VS2010/MFC Introducción a la programación 16 (Cuadro de diálogo: Cuadro de diálogo Mensaje)
       VS2010/MFC Introducción a la programación 17 (Cuadro de diálogo: Cuadro de diálogo Archivo)
       VS2010/MFC Introducción a la programación 18 (Cuadro de diálogo: Cuadro de diálogo Fuente)
       VS2010/MFC Programación Introducción Diecinueve (Cuadro de diálogo: Cuadro de diálogo Color)

       Cuarta parte: Controles comunes

       Introducción a la programación de VS2010/MFC 20 (Controles comunes: cuadro de texto estático)
       Introducción a la programación de VS2010/MFC 21 (Controles comunes: Control de edición de cuadro de edición) Introducción a la
       programación de VS2010/MFC 22 (Controles comunes: botón de control de botón, botón de opción y casilla de verificación)
       VS2010 Introducción a la programación de /MFC 23 (controles de uso común: ejemplos de programación de controles de botón)
       Introducción a la programación de VS2010/MFC 24 (controles de uso común: control de cuadro de lista ListBox) Introducción a la
       programación de VS2010/MFC 1 Veinticinco (controles de uso común: control de cuadro combinado Combo Box)
       Introducción a la programación de VS2010/MFC 26 (controles de uso común: control de barra de desplazamiento Barra de desplazamiento)
       Introducción a la programación de VS2010/MFC 27 (controles de uso común: control de imagen Control de imagen) Introducción a la
       programación de VS2010/MFC 28 (Controles comunes: Control de vista de lista Control de lista )
       VS2010/MFC Introducción a la programación 29 (Controles comunes: Control de vista de lista Control de lista)
       VS2010/MFC Introducción a la programación 30 (Control de usos comunes: control de árbol Control de árbol)
       VS2010/MFC Introducción a la programación 31 (controles de uso común: control de árbol Control de árbol)
       VS2010 /Introducción a la programación MFC 32 (controles de uso común: control de etiquetas Control de pestañas)
       VS2010/ Introducción a la programación MFC Treinta y tres (Controles comunes: Control bajo pestañas)

       Quinta parte: menús, barras de herramientas y barras de estado

       Introducción a la programación de VS2010/MFC Treinta y cuatro (Menú: Explicación detallada de los recursos del menú de VS2010) Introducción a la
       programación de VS2010/MFC Treinta y cinco (Menú: Menú y uso de clase CMenu)
       Introducción a la programación de VS2010/MFC Treinta y seis (Barra de herramientas: Recursos de la barra de herramientas y Clase CToolBar)
       Introducción a la programación VS2010/MFC treinta y siete (barra de herramientas: creación, acoplamiento y uso de la barra de herramientas)
       Introducción a la programación VS2010/MFC treinta y ocho (uso detallado de la barra de estado)

       Parte VI: Documentación, Vistas y Marcos

       Introducción a la programación de VS2010/MFC 39 (Documentos, vistas y marcos: descripción general)
       Introducción a la programación de VS2010/MFC 40 (Documentos, vistas y marcos: relaciones entre objetos)
       Introducción a la programación de VS2010/MFC 41 (Documentos, vistas y marcos: división ventanas)

       Parte VII: Clases comunes de MFC

       Introducción a la programación de VS2010/MFC 42 (Clases de MFC comunes: clase CString)
       Introducción a la programación de VS2010/MFC 43 (Clases de MFC comunes: clases CTime y CTimeSpan)
       Introducción a la programación de VS2010/MFC 44 (Clases de MFC comunes: Timer Timer)
       VS2010/MFC Introducción a la programación 45 (clase común MFC: clase de operación de archivo CFile)
       Introducción a la programación VS2010/MFC 46 (clase común MFC: manejo de excepciones MFC)

       Parte 8: Fuentes y salida de texto

       Introducción a la programación de VS2010/MFC 47 (Fuente y salida de texto: Clase de fuente CFont)
       Introducción a la programación de VS2010/MFC 48 (Fuente y salida de texto: Salida de texto)

       Parte IX: Imágenes gráficas

       Introducción a la programación VS2010/MFC cuarenta y nueve (imagen gráfica: clase CDC y su función de dibujo de pantalla) Introducción a la
       programación VS2010/MFC cincuenta (imagen gráfica: pincel de objeto GDI CPen) Introducción a la
       programación VS2010/MFC cincuenta y uno (imagen gráfica: pincel de objeto GDI cepillo)

       Parte 10: Desarrollo de interfaz de cinta

       Introducción a la programación VS2010/MFC cincuenta y dos (Desarrollo de la interfaz Ribbon: creación de un marco de aplicación estilo Ribbon) Introducción a la
       programación VS2010/MFC cincuenta y tres (Desarrollo de la interfaz Ribbon: adición de controles para la barra Ribbon)
       Introducción a la programación VS2010/MFC cincuenta Cuatro (desarrollo de la interfaz Ribbon: use más controles y agregue funciones de procesamiento de mensajes para los controles)

 

 

Las capturas de pantalla de este artículo se basan en VS2019 

 

 

1. Crear  un nuevo  proyecto MFC

 

  • 1. Seleccione el elemento de menú  Archivo->Nuevo->Proyecto y aparecerá el cuadro de diálogo " Nuevo proyecto ".
  • 2. Seleccione MFC , haga clic en Siguiente y luego ingrese el nombre del proyecto , en este ejemplo, asígnele el nombre "Adición" y establezca la ruta de guardado del proyecto . Haz clic en " Crear ".
  •  3. Seleccione basado en diálogo en la lista desplegable de tipo de aplicación , use la configuración predeterminada para otros y haga clic en " Finalizar ".

Vea en la vista de solución , el archivo de este proyecto es mucho menor que la aplicación de un solo documento, hay tres clases principales en Vista de clase : CAboutDlg , CAdditionApp y CAdditionDlg  .

  1. CAboutDlg es la clase de diálogo "Acerca de" de la aplicación,
  2. CAdditionApp es una clase derivada de CWinApp,
  3. CAdditionDlg  es la clase de diálogo principal y el diálogo principal es la interfaz principal que se muestra después de que se ejecuta la aplicación.

 

abrir vista de recursos

En la vista Vista de recursos, puede ver el árbol de recursos del proyecto Adición, expanda Adición.rc, hay cuatro subelementos a continuación: Diálogo (cuadro de diálogo), Icono (icono), Tabla de cadenas (tabla de cadenas) y Versión ( versión). Luego expanda el elemento Diálogo, hay dos plantillas de diálogo a continuación, y sus ID son: IDD_ABOUTBOX e IDD_ADDITION_DIALOG, la primera es la plantilla del cuadro de diálogo "Acerca de" y la última es la plantilla del cuadro de diálogo principal. ID es el identificador único de un recurso y es esencialmente un número entero sin signo. Generalmente, el valor entero representado por una ID está definido por el sistema y no necesitamos intervenir.

Puede verse que para el cuadro de diálogo principal, el sistema ha completado automáticamente la creación de una nueva plantilla de diálogo en el primer paso de creación de un cuadro de diálogo. Si necesita agregar y crear una nueva plantilla de diálogo, debe hacer clic con el botón derecho en el nodo "Diálogo" de la Vista de recursos, seleccionar "Insertar diálogo" en el menú contextual, se generará una nueva plantilla de diálogo y El ID se asignará automáticamente. Como se muestra en la imagen:

Haga clic con el botón derecho en la plantilla de diálogo Adición y luego seleccione Propiedades en el menú del botón derecho, y la lista de propiedades del cuadro de diálogo se mostrará en el panel derecho. Como se muestra abajo:

ilustrar:

  • 1. ID: ID de diálogo, que identifica de forma única el recurso de diálogo y se puede modificar. Aquí está IDD_ADDITION_DIALOG, no lo modificamos.
  • 2. Título: título del cuadro de diálogo . Aquí el valor predeterminado está vacío, lo modificaremos a "Calculadora adicional".
  • 3. Borde: tipo de borde. Hay cuatro tipos: Ninguno, Delgado, Redimensionado y Cuadro de diálogo. Usamos el marco de diálogo predeterminado.
  • 4. Maximizar: si usar el botón de maximizar. Usamos el valor predeterminado de False.
  • 5. Minimizar: Indica si usar el botón de minimizar. También usamos el valor predeterminado False.
  • 6. Estilo: tipo de cuadro de diálogo. Hay tres tipos: Superpuesto (ventana superpuesta), Emergente (ventana emergente) y Niño (ventana secundaria). Las ventanas emergentes son relativamente comunes. Usamos el tipo de ventana emergente predeterminado.
  • 7. Menú del sistema: si hay un menú del sistema en la esquina superior izquierda de la barra de título, incluidos los elementos del menú, como mover y cerrar. Usamos el valor predeterminado de True.
  • 8. Barra de título: si desea tener una barra de título. Usamos el valor predeterminado de True.
  • 9. Fuente (Tamaño): Tipo de fuente y tamaño de fuente. Si se modifica a una fuente que no es del sistema, Usar sistema cambia automáticamente a Falso. Y si Use System es originalmente False, cámbielo a True, luego Font(Size) se establece automáticamente en la fuente del sistema. Aquí usamos la fuente predeterminada del sistema.

Título de propiedad modificado. En este momento, la interfaz después de ejecutar este programa es la siguiente:

 

1. Agregue un cuadro de texto estático (Static Text) al cuadro de diálogo para mostrar la cadena -- "summand".

Para un cuadro de texto estático titulado "TODO: Colocar controles de diálogo aquí" que se agrega automáticamente, elimínelo aquí y continúe agregando nuevos cuadros de texto estáticos.
Al eliminar un control, puede usar el botón izquierdo del mouse para hacer clic y seleccionarlo, y aparecerá un marco punteado alrededor del control después de la selección, y luego presione la tecla Eliminar para eliminarlo. Abra la plantilla de diálogo IDD_ADDITION_DIALOG creada en la lección anterior en la Vista de recursos del proyecto "Agregar", y el cuadro de texto estático agregado automáticamente se puede eliminar de esta manera.
Antes de agregar un nuevo cuadro de texto estático, compruebe si se muestra la vista Caja de herramientas. De lo contrario, haga clic en Ver-> Caja de herramientas en la barra de menú. La vista Caja de herramientas es como se muestra a continuación:

        Algunos controles de uso común se enumeran en la Caja de herramientas , uno de los cuales es Texto estático , que es el control que queremos agregar. Haga clic y mantenga presionado el botón izquierdo del mouse en el texto estático en la caja de herramientas y arrástrelo a la plantilla de diálogo IDD_ADDITION_DIALOG, aparecerá un marco punteado en la plantilla, buscamos una posición adecuada y soltamos el botón izquierdo del mouse para soltarlo.

       Después de seleccionar el control con el botón izquierdo del mouse, aparecerá un marco punteado a su alrededor, y luego mueva el mouse hacia algunos puntos negros en el marco punteado y se convertirá en una forma de flecha de dos direcciones. En este momento, puede presionar el botón izquierdo del ratón y arrastre para cambiar el tamaño del control. Podemos cambiar el tamaño del control de cuadro de texto estático recién agregado de esta manera para mostrar mejor el título. Por supuesto, toda la plantilla de diálogo también se puede cambiar de tamaño de esta manera.

       A continuación, es hora de modificar el texto del cuadro de texto estático. Haga clic con el botón derecho en el cuadro de texto estático, seleccione "Propiedades" en el menú contextual y se mostrará el panel Propiedades. En el panel, modifique la propiedad Caption a "summand" y modifique el ID a IDC_SUMMAND_STATIC. En este momento, la plantilla es la siguiente:

 

2. Agregue un cuadro de edición (Control de edición) al cuadro de diálogo para ingresar el sumando.

El proceso de agregar un cuadro de edición es similar al de un cuadro de texto estático. Seleccione el control Control de edición en el cuadro de herramientas y arrástrelo a la plantilla de diálogo, alinéelo horizontalmente con el cuadro de texto estático anterior (por estética) y luego ajústelo. su tamaño para ajustarse al cuadro de texto agregado Entrada de número.
Haga clic derecho en el cuadro de edición, aún seleccione "Propiedades" en el menú contextual para mostrar el panel de Propiedades (Properties) y modifique su ID a IDC_SUMMAND_EDIT. En este momento, la plantilla es la siguiente:

3. Agregue un cuadro de texto estático titulado "Addend" de acuerdo con el método en 1, que se usa para mostrar la cadena -- "Addend". Y cambie su ID a IDC_ADDEND_STATIC.
4. Siga el método en 2 para agregar un cuadro de edición con ID IDC_ADDEND_EDIT para ingresar el sumando.
5. Siga el método en 1 para agregar un cuadro de texto estático titulado "y" para mostrar el texto -- "y". Y modifique su ID a IDC_SUM_STATIC.
6. Agregue un cuadro de edición con el ID IDC_SUM_EDIT de acuerdo con el método en 2 para mostrar la suma final.
7. Se agrega un control de botón similar (Botón) a la plantilla de diálogo, que se usa para activar el cálculo de suma después de hacer clic. Cambie su título a "Cálculo" y su ID a IDC_ADD_BUTTON.

Hasta ahora, la plantilla del cuadro de diálogo es como se muestra en la figura:

8. Elimine el botón  Aceptar  . Abra  el panel Propiedades para el  botón Cancelar, cambie el Título a "Salir" y alinéelo horizontalmente con el botón Calcular.
9. De acuerdo con el diseño del control, ajuste correctamente el tamaño de toda la plantilla de diálogo para que tenga un tamaño adecuado en relación con el diseño del control y tenga una interfaz atractiva.
De esta forma, los controles que necesitamos usar en este ejemplo se agregan en la plantilla de diálogo. El efecto final es el siguiente:

Ejecute la captura de pantalla:

 

 

Crear clase de diálogo

Dado que el programa Addition es un programa basado en diálogos, el programa crea automáticamente una plantilla de diálogo IDD_ADDITION_DIALOG y genera automáticamente una clase de diálogo CAdditionDlg, que se deriva de la clase CDialogEx. Cualquiera que haya usado VC++ 6.0 puede recordar que las clases de diálogo que definimos se derivan todas de la clase CDialog, pero en VS2010, las clases de diálogo generales se heredan de la clase CDialogEx.

Si es una plantilla de diálogo recién agregada, ¿cómo crear una clase de diálogo para ella?

  • 1. Haga clic con el botón derecho en el nodo "Diálogo" de Vista de recursos y luego seleccione "Insertar diálogo" en el menú del botón derecho para crear una nueva plantilla de diálogo, y la ID usa el IDD_DIALOG1 predeterminado.
  • 2. La plantilla de diálogo recién creada se mostrará en el área central, luego seleccione esta plantilla de diálogo, haga clic con el botón derecho y seleccione Agregar clase en el menú contextual.

3. Después de seleccionar "Agregar clase", aparecerá un cuadro de diálogo. Simplemente escriba un nombre de clase personalizado en el cuadro de edición debajo de "Nombre de clase" en el cuadro de diálogo, como CMyDialog.
4. Finalmente, haga clic en "Finalizar" para completar.

Finalmente, puede ver la clase de diálogo recién generada CMyDialog en Class View, y el archivo de encabezado MyDialog.h correspondiente y el archivo fuente MyDialog.cpp se generan en el Explorador de soluciones. La clase CMyDialog también se deriva de la clase CDialogEx.
Tenga en cuenta que los nombres de clases generales comienzan con C, por ejemplo, CTestDlg.

 

 

Agregar variables a los controles en el cuadro de diálogo

        En los pasos anteriores  , se agregan varios controles al cuadro de diálogo , incluidos tres cuadros de texto estáticos, tres cuadros de edición y un control de botón. El botón Cancelar generado por el programa permanece como un botón de salida, mientras que el botón Aceptar se elimina.

       El cuadro de texto estático es solo para explicar el significado de los datos en el siguiente cuadro de edición, ya sea el sumando, el sumando o la suma, por lo que no cambiarán y no agregaremos variables para ellos. Los controles de botón se utilizan para las operaciones y aquí no se les agregan variables. Los datos en el cuadro de edición pueden cambiar con frecuencia, es necesario asociar una variable para cada uno de ellos.

 

Primero agregue una variable para el cuadro de edición IDC_SUMMAND_EDIT para el sumando.

  • 1. Haga clic con el botón derecho en el cuadro de edición y seleccione "Agregar variable" en el menú contextual. Aparecerá un cuadro de diálogo de asistente para agregar variables miembro.
  • 2. Queremos agregarle una variable de valor en lugar de una variable de control, así que seleccione Valor en el cuadro combinado debajo de "Categoría" en el cuadro de diálogo.
  • 3. El cuadro combinado debajo de "Tipo de variable" selecciona "CString" de forma predeterminada en este momento. CString es una clase de cadena y, obviamente, no puede realizar operaciones de suma. Podemos elegir double, float, int, etc. Aquí elegimos doble, es decir, el cuadro de edición está asociado a una variable de tipo doble.
  • 4. Escriba el nombre de la variable personalizada en "Nombre de la variable". Pollo picoteando arroz lo llamó m_editSummand.

5. Haga clic en "Finalizar" para completar.

Tenga en cuenta que el nombre de la variable miembro de una clase generalmente comienza con m_ para identificarla como una variable miembro.

Haciendo referencia a este método, agregue una variable doble m_editAddend al cuadro de edición de sumas IDD_ADDEND_EDIT y agregue una variable doble m_editSum al cuadro de edición IDD_SUM_EDIT.

 

Intercambio de datos y validación de clases de diálogo

       En la interfaz de ejecución del programa, el usuario a menudo cambia las propiedades del control, por ejemplo, ingresa una cadena de caracteres en el cuadro de edición, cambia el elemento seleccionado del cuadro combinado o cambia el estado seleccionado de la casilla de verificación. Después de cambiar la propiedad del control, MFC modificará el valor de la variable asociada del control en consecuencia. Este cambio síncrono se realiza a través de la función miembro DoDataExchange() generada automáticamente por MFC para la clase de diálogo, que también se denomina mecanismo de intercambio e inspección de datos del cuadro de diálogo.

       Después de agregar variables para los tres cuadros de edición, hay tres instrucciones de llamada DDX_Text más en el cuerpo de función de la función DoDataExchange() de CAdditionDlg en AdditionDlg.cpp. El siguiente es el código del cuerpo de la función y los comentarios agregados por pollo picoteando arroz.

       Tome el programa Adición como ejemplo para hablar brevemente sobre el mecanismo de intercambio de datos. Si ingresamos el sumando en la interfaz de ejecución del programa, el valor de entrada se puede guardar en la variable m_editSummand a través de la función DoDataExchange() de CAddition, de lo contrario, si el valor de la variable m_editSummand se modifica durante la ejecución del programa, se puede guardado a través de DoDataExchange() de CAddition La función también puede mostrar el nuevo valor de variable en el cuadro de edición del sumando.

       Pero en este mecanismo de intercambio de datos, DoDataExchange() no se llama automáticamente, pero necesitamos llamar a la función CDialogEx::UpdateData() en el programa, y ​​luego la función UpdateData() llamará automáticamente a DoDataExchange().

       El prototipo de la función CDialogEx::UpdateData() es: BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

       Parámetros: bSaveAndValidate se utiliza para indicar la dirección de transmisión de datos, VERDADERO significa del control a la variable , FALSO significa de la variable al control . El valor predeterminado es VERDADERO, que se pasa del control a la variable.

       Valor de retorno: El valor de retorno de la función CDialogEx::UpdateData() indica si la operación es exitosa, si es exitosa devuelve VERDADERO, de lo contrario devuelve FALSO.

       En la próxima lección, demostraremos cómo usar la función CDialogEx::UpdateData().

       Chicken Pecking Rice Esta sección trata principalmente sobre la creación de nuevas clases de diálogo y la adición de variables de control.Las funciones de procesamiento de mensajes de los controles se presentarán en detalle en la próxima lección.

 

 

Agregue una función de procesamiento de mensajes para el control.

 La creación de clases de diálogo y la adición de variables de control ya se han mencionado anteriormente.El contenido principal de esta lección es cómo agregar funciones de procesamiento de mensajes para los controles.

 

       MFC define muchos mensajes para cuadros de diálogo y controles , etc. Cuando operamos sobre ellos, los mensajes se activan y estos mensajes son finalmente procesados ​​por las funciones de procesamiento de mensajes. Por ejemplo, cuando hacemos clic en un botón, se generará un mensaje BN_CLICKED, y cuando se modifica el contenido del cuadro de edición, se generará un mensaje EN_CHANGE. En general, para lograr el efecto de una determinada operación, solo necesitamos implementar la función de procesamiento de mensajes de un determinado mensaje.

 

1. Agregar función de procesamiento de mensajes

       Pollo picoteando arroz Aún tome el programa anterior de la calculadora de adición como ejemplo para ilustrar cómo agregar una función de procesamiento de mensajes para el control del botón "Cálculo". Hay 4 formas de agregar:

       

  • 1. Use Class Wizard para agregar la función de procesamiento de mensajes

       Los amigos que han usado VC++  6.0 deben estar familiarizados con Class Wizard. A menudo se usa para agregar clases , funciones de procesamiento de mensajes, etc. Se puede decir que es una función muy básica. Pero desde VS2002, ya no puede ver el Asistente de clase.La mayoría de las funciones están integradas en las propiedades de los cuadros de diálogo y controles, etc., lo cual es muy conveniente de usar. En VS2010 , el Class Wizard perdido hace mucho tiempo está de vuelta. Sin embargo, Chicken Pecking Rice está acostumbrado a usar las funciones en propiedades.Para aquellos que transfieren directamente de VC ++ 6.0 a VS2010, pueden sentir que están más acostumbrados a usar Class Wizard.

       Debe recordar que el ID del botón "Calcular" es IDC_ADD_BUTTON. En la figura anterior  , debajo de la etiqueta de comando , hay este ID en la lista de ID de objeto . Como queremos implementar la función de procesamiento de mensajes después de hacer clic en el botón,  seleccione el mensaje BN_CLICKED en Agregar controladorla lista de mensajes para agregar la función de procesamiento de mensajes BN_CLICKED OnClickedAddButton. Por supuesto, también puede cambiar el nombre, pero generalmente puede usar el predeterminado.

 

  • 2. Agregue una función de procesamiento de mensajes a través de "Agregar controlador de eventos..."

       Haga clic con el botón derecho en el botón "Cálculo" y luego seleccione el elemento de menú "Agregar controlador de eventos..." en el menú contextual y aparecerá el cuadro de diálogo "Asistente para el controlador de eventos", como se muestra en la siguiente figura. :

Se puede ver que el mensaje BN_CLICKED está seleccionado por defecto en el "Tipo de mensaje", y el nombre de la función y la clase se dan automáticamente, simplemente haga clic en "Aceptar".

 

  •   3. Agregue una función de procesamiento de mensajes en la vista de propiedades del botón

       Como se mencionó anteriormente, desde VS2002 , la función de procesamiento de mensajes se ha agregado principalmente desde la vista de propiedades. Hacemos clic derecho en el botón "calcular", seleccionamos "Propiedades" en el menú contextual y la vista de propiedades del botón se mostrará en el panel derecho.

Podemos hacer clic en el botón " Evento de control " ( similar a un rayo )        en la vista de atributos como se muestra en la figura anterior , y todos los mensajes del botón "Cálculo" se enumeran a continuación. Lo que queremos procesar es el mensaje BN_CLICKED. Haga clic en el elemento de la lista en blanco a la derecha y aparecerá un botón con una flecha hacia abajo. Haga clic en este botón nuevamente y aparecerá la opción "<Add> OnBnClickedAddButton". Finalmente, seleccione esta opción y la función de procesamiento BN_CLICKED se agregará automáticamente.

 

  •  4. Haga doble clic en el botón para agregar una función de procesamiento de mensajes

       El método más directo y sencillo es hacer doble clic en el botón "Calcular" y MFC agregará automáticamente la función de procesamiento OnBnClickedAddButton() para el mensaje BN_CLICKED en la clase CAdditionDlg.

 

 

Agregar funcionalidad personalizada en la función del controlador de mensajes

       Después de usar cualquier método para agregar la función de procesamiento de mensajes, solo podemos obtener un cuerpo de función vacío de la función OnBnClickedAddButton() Para realizar la función que queremos, necesitamos agregar un código de función personalizado en el cuerpo de la función.

       En el programa de calculadora de suma, la función que queremos que logre el botón "Cálculo" es obtener los valores del sumando y el sumando, y luego calcular su suma y mostrarla en el cuadro de edición de la suma. Luego, el cuerpo de la función de OnBnClickedAddButton() debe modificarse como:


  
  
   
   
  1. void CAAdditionDlg::OnClickedAddButton ()
  2. {
  3. // TODO: agregue el código del controlador de notificaciones de control aquí
  4. // Guarda los datos de cada control en la variable correspondiente
  5. Actualizar datos (VERDADERO);
  6. // Asignar la suma del sumando y el sumando a m_editSum
  7. m_editSum = m_editSumand + m_editAddend;
  8. // Actualizar el control correspondiente según el valor de cada variable. y el cuadro de edición mostrará el valor de m_editSum
  9. Actualizar datos (FALSO);
  10. }

        Se han agregado comentarios al código anterior, que debería ser fácil de entender para todos. La descripción de la función UpdateData() se introdujo en la lección anterior. Si la olvida, puede volver a la lección anterior para obtener más información. A continuación ejecutamos la aplicación. En la interfaz de resultados en ejecución, ingrese el sumando 1.1 y el sumando 2.2, luego haga clic en "Calcular":

Análisis simple del proceso en ejecución: ingrese el sumando y el sumando, haga clic en el botón "Calcular" para generar un mensaje de clic y luego llame a la función OnBnClickedAddButton(). Después de ingresar esta función, el valor del sumando 5.1 y el valor del sumando 2.3 se guardan en las variables m_editSummand y m_editAddend respectivamente mediante la función UpdateData (TRUE), y luego el sumando y el sumando se calculan mediante la declaración m_editSum = m_editSummand + m_editAddend; La suma es 7.4 y asigna 7.4 a m_editSum. Finalmente, llame a UpdateData (FALSO) para actualizar los valores de visualización de los tres cuadros de edición de acuerdo con los valores del sumando, sumando y suma, y ​​se obtiene el resultado en la figura anterior.

       En este punto, básicamente se completa una aplicación de calculadora de suma con funciones de suma simples.

 

 

Cómo ajustar el orden de tabulación de los controles en el cuadro de diálogo.

Después de agregar una función de procesamiento de mensajes para el botón "Calcular" en la lección anterior , la calculadora de suma ya puede realizar operaciones de suma de punto flotante. Pero todavía queda un pequeño problema, es decir, el orden de tabulación del control del cuadro de diálogo.

       Ejecute el programa de calculadora de sumas, no realice ninguna operación después de que se muestre el cuadro de diálogo, simplemente presione Entrar y podrá ver que el cuadro de diálogo ha salido. Esto se debe a que el botón "Salir" es un control con un orden de tabulación de 1, que es el primer control que acepta la entrada del usuario. Pero de acuerdo con nuestros hábitos de entrada, debe ser el cuadro de edición de sumando el que acepte primero la entrada del usuario, luego el cuadro de edición de sumando, luego el botón "Calcular" y finalmente el botón "Salir".

       Primero mire el orden de tabulación de cada control de manera intuitiva : abra la " vista de recursos " y luego busque el cuadro de diálogo IDD_ADDITION_DIALOG en el recurso, haga doble clic en la ID y su vista de plantilla aparecerá en el área central del cliente. Seleccione "Formato" -> "Orden de tabulación" en el menú principal, o presione la tecla de método abreviado Ctrl+D, y el número de orden de tabulación de cada control se mostrará en la plantilla del cuadro de diálogo. Como se muestra abajo:

       En la figura anterior, hay un número en la esquina superior izquierda de cada control, que es su orden de respuesta de tabulación. Cuando se acaba de abrir el cuadro de diálogo, el foco de entrada está en el botón "Salir" con el orden de tabulación de 1. Si presiona la tecla Tabulador sin ninguna operación, el foco de entrada se transferirá al cuadro de texto estático "resumir" con el orden de tabulación de 2. Pero debido a que el cuadro de texto estático no acepta ninguna entrada, el foco de entrada continúa desplazándose automáticamente al cuadro de edición de sumando con el orden de tabulación de 3, y luego presione la tecla Tabulador y el foco de entrada cambiará al texto estático "agregar" con el orden de tabulación de 4 en el cuadro, también debido a que es un cuadro de texto estático, el enfoque de entrada seguirá siendo transferido al cuadro de edición de anexión, y los siguientes controles son los mismos.

       Creemos que esta orden no es razonable, entonces, ¿cómo modificarla? Es muy simple, comience desde el control que cree que el orden de tabulación debe ser 1 y haga clic a su vez. Con la finalización del clic, el orden de respuesta de tabulación de cada control también se establece de acuerdo con nuestras ideas.

       Por ejemplo, en este ejemplo, podemos hacer clic en el cuadro de edición de sumando, el cuadro de texto estático "sumando", el cuadro de edición de sumando, el cuadro de texto estático "agregado" y el cuadro de edición, el cuadro de texto estático "y", el botón " Calcular" y " botón Salir". Después de configurar, como se muestra a continuación:

Finalmente, presione la tecla ESC para confirmar la configuración y salir del estado de configuración del orden de tabulación de la plantilla de diálogo.

       Ahora volvemos a ejecutar el programa, podemos ver que después de abrir el cuadro de diálogo, el foco de entrada inicial está en el cuadro de edición de sumando, y luego presionamos la tecla Tab y el foco de entrada se mueve al cuadro de edición de sumando. se transferirán circularmente en el orden de "y cuadro de edición--botón 'calcular'--botón 'salir'--cuadro de edición sumando-cuadro de edición agregado--y cuadro de edición...". Esto logra nuestro propósito.

 

 

Diálogos modales y no modales, y cómo aparecen los diálogos modales.

 

1.   Cuadro de diálogo modal y cuadro de diálogo no modal

       Los diálogos de Windows se dividen en dos categorías: diálogos modales y diálogos no modales .

  1.  Un cuadro de diálogo modal es un cuadro de diálogo de este tipo: cuando aparece, otras ventanas de la aplicación ya no aceptarán la entrada del usuario, y solo el cuadro de diálogo responde a la entrada del usuario, y otras ventanas pueden continuar comunicándose con el usuario después de la correspondiente se realiza la operación en él y sale.
  2.  Cuadro de diálogo no modal: después de que aparece el cuadro de diálogo no modal, otras ventanas del programa aún pueden responder a la entrada del usuario. Los cuadros de diálogo no modales se utilizan generalmente para mostrar información de solicitud, etc.

       Todo el mundo conoce muy bien el sistema de Windows y creo que deberían haberse encontrado estos dos cuadros de diálogo. El cuadro de diálogo de calculadora de adición anterior es en realidad un cuadro de diálogo modal.

 

2. Cómo aparece el cuadro de diálogo modal

       Después de todo, la mayoría de los programas de calculadora de sumas son generados automáticamente por MFC, y es posible que no tenga muy claro cómo aparece el cuadro de diálogo. Pollo picoteando arroz Permítanme hablar brevemente sobre dónde aparece, y luego reconstruir un nuevo cuadro de diálogo y abrirlo, para que todos puedan usar el cuadro de diálogo modal de manera más flexible después de la práctica.

       Si abre el archivo Addition.cpp, puede ver que la clase CAdditionApp tiene una función InitInstance ().   Esta función se mencionó en el análisis del marco de la aplicación MFC , pero está en la clase App de la aplicación de un solo documento y el cuerpo de la función no es lo mismo Pero todos inicializan la instancia de la clase App.

       En la segunda mitad de la función InitInstance(),  hay un fragmento de código que define el objeto de diálogo y abre el cuadro de diálogo Se proporciona y comenta el siguiente código:


  
  
   
   
  1. CAdiciónDlg dlg; // Definir el objeto dlg de la clase de diálogo CAdditionDlg
  2. m_pMainWnd = &dlg; // Establecer dlg como la ventana principal
  3. INT_PTR nRespuesta = dlg. DoModal (); // Abre el cuadro de diálogo dlg y asigna el valor de retorno de la función DoModal (el ID del botón en el que se hizo clic al salir) a nResponse
  4. si (nRespuesta == IDOK) // Determinar si el valor de retorno es un botón OK (su ID es IDOK, que fue eliminado por Chicken Peck Rice)
  5. {
  6. // TODO: Cuándo colocar el procesamiento aquí
  7. // "OK" para cerrar el código de diálogo
  8. }
  9. demás si (nRespuesta == IDCANCEL) // Determinar si el valor devuelto es un botón Cancelar (su ID es IDCANCEL, y el arroz con pollo picoteado cambió su Título a "salir")
  10. {
  11. // TODO: Cuándo colocar el procesamiento aquí
  12. // código para "cancelar" para cerrar el diálogo
  13. }
  14. demás si (nRespuesta == -1 )
  15. {
  16. RASTREO (traceAppMsg, 0 , "Advertencia: la creación del diálogo falló, la aplicación terminará inesperadamente.\n" );
  17. RASTREO (traceAppMsg, 0 , "Advertencia: no puede #definir _AFX_NO_MFC_CONTROLS_IN_DIALOGS si está usando controles MFC en los diálogos.\n" );
  18. }

Una de las funciones clave del cuadro de diálogo emergente es la función DoModal() de la clase del cuadro de diálogo. El prototipo de la función CDialog::DoModal() es:

       virtual INT_PTR DoModal();   

       Valor devuelto: un valor entero que especifica el valor del parámetro nResult pasado a CDialog::EndDialog (esta función se usa para cerrar el cuadro de diálogo). Devuelve -1 si la función no puede crear el diálogo o IDABORT si ocurre otro error.

       Después de llamarlo, aparecerá un cuadro de diálogo y el valor de retorno es el ID del botón en el que se hizo clic al salir del cuadro de diálogo. Por ejemplo, si hacemos clic en el botón "Salir", el valor de retorno de DoModal es IDCANCEL.

 

 3. Agregue un nuevo cuadro de diálogo y ábralo

Agrega un cuadro de diálogo al programa de calculadora de adición que le pregunta al usuario si desea realizar un cálculo antes de calcularlo. Puede echar un vistazo completo al proceso de agregar y abrir el cuadro de diálogo.

       1. Haga clic derecho en "Diálogo" en Vista de recursos y seleccione "Insertar diálogo", cree una nueva plantilla de diálogo, modifique su ID a IDD_TIP_DIALOG, cambie el Título a "Solicitud" y luego consulte "Agregar controles al cuadro de diálogo" como se mencionó anterior, agregue un cuadro de texto estático (texto estático) a la plantilla de diálogo y cambie el Título a "¿Está seguro de que desea realizar el cálculo de suma?", y luego modifique el Título del botón Aceptar a "Aceptar", y el Título del botón Cancelar a "Cancelar", y finalmente ajuste la posición de cada control y el tamaño del cuadro de diálogo. La plantilla de diálogo final es la siguiente:

VS2010/MFC Programación Introducción Once (cuadro de diálogo: cuadro de diálogo modal y su proceso emergente)

2. De acuerdo con el método de creación de una clase de diálogo en "Creación de una clase de diálogo y adición de una variable de control", haga clic con el botón derecho en la plantilla de diálogo y seleccione "Agregar clase..." para abrir un cuadro de diálogo para agregar una clase y establezca "Nombre de clase en       " En el Explorador de soluciones, puede ver que se generan el archivo de encabezado TipDlg.h y el archivo de origen TipDlg.cpp de la clase CTipDlg.

       3. Queremos que aparezca este cuadro de diálogo de solicitud después de hacer clic en el botón "Calcular", luego debemos acceder a la clase de diálogo de solicitud en la función de procesamiento de mensajes OnBnClickedAddButton() del botón "Calcular", por lo que para acceder a CTipDlg class, en AdditionDlg.cpp Incluya el archivo de encabezado de CTipDlg: #include "CTipDlg.h".

       4. Modifique el cuerpo de la función de OnBnClickedAddButton(). Antes de todos los códigos, construya el objeto tipDlg de la clase CTipDlg y use la declaración tipDlg.DoModal(); para abrir un cuadro de diálogo y finalmente determinar si el valor de retorno de la función DoModal() es IDOK o IDCANCEL Si continuar con el cálculo. La función OnBnClickedAddButton() se modifica de la siguiente manera:


  
  
   
   
  1. void CAAdditionDlg::OnClickedAddButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. INT_PTR nRes; // Se usa para guardar el valor de retorno de la función DoModal
  5. CTipDlg tipDlg; // Construir una instancia de la clase de diálogo CTipDlg
  6. nRes = tipDlg. DoModal (); // cuadro de diálogo emergente
  7. si (IDCANCEL == nRes) // Determinar si el valor de retorno es IDCANCEL después de salir del cuadro de diálogo, si es así, regresar, de lo contrario continuar con la ejecución
  8. volver ;
  9. // Guarda los datos de cada control en la variable correspondiente
  10. Actualizar datos (VERDADERO);
  11. // Asignar la suma del sumando y el sumando a m_editSum
  12. m_editSum = m_editSumand + m_editAddend;
  13. // Actualizar el control correspondiente según el valor de cada variable. y el cuadro de edición mostrará el valor de m_editSum
  14. Actualizar datos (FALSO);
  15. }

       5. Prueba. Después de compilar y ejecutar el programa, ingrese el sumando y el sumando en el cuadro de diálogo, haga clic en "Calcular", aparece un cuadro de diálogo emergente que le pregunta si desea realizar el cálculo, si elige "Aceptar", el cuadro de diálogo emergente sale y muestra en el cuadro de diálogo principal La suma del sumando y el sumando, y si se selecciona "Cancelar", el cuadro de diálogo de solicitud también se cerrará, pero la suma que se muestra en el cuadro de diálogo principal permanece sin cambios, es decir, no se realiza ningún cálculo de suma. realizado.

 

 

Cree y muestre cuadros de diálogo no modales.

 

Resumen: los pasos principales son, después de crear un nuevo cuadro de diálogo, asociar una clase y luego usar un puntero para apuntar a la clase; luego usar el puntero para crear y mostrar el cuadro de diálogo y finalmente destruir el puntero en la función virtual para liberar recursos.

       Después de que se muestra el cuadro de diálogo no modal, otras ventanas del programa aún pueden ejecutarse normalmente, responder a la entrada del usuario y cambiar entre ellas . Cambie el cuadro de diálogo modal Sugerencia creado en la lección anterior a un cuadro de diálogo no modal, deje que todos vean el efecto.

       De hecho, no hay diferencia entre el diálogo modal y el diálogo no modal en la creación de recursos de diálogo y la generación de clases de diálogo, por lo que no es necesario modificar el recurso de diálogo IDD_TIP_DIALOG ni la clase CTipDlg creada en la lección anterior.

       Lo que debe modificarse es la creación y visualización de la instancia de la clase de diálogo, es decir, el código de visualización del diálogo agregado en el cuerpo de la función CAdditionDlg::OnBnClickedAddButton(). Estos son los pasos específicos:

  • 1. Incluya el archivo de encabezado CTipDlg en AdditionDlg.h y defina la variable de miembro de puntero de tipo CTipDlg. El método de operación detallado es eliminar el #include "CTipDlg.h" agregado previamente en AdditionDlg.cpp, y agregar #include "CTipDlg.h" en AdditionDlg.h, porque necesitamos definir el tipo de CTipDlg en la variable de puntero AdditionDlg.h , por lo que su archivo de encabezado debe incluirse primero; luego agregue la variable miembro privada CTipDlg *m_pTipDlg; a la clase CAdditionDlg en AdditionDlg.h.
  • 2. Inicialice la variable miembro m_pTipDlg en el constructor de la clase CAdditionDlg . Si hay demasiadas funciones en el archivo cpp, podemos encontrar la clase CAdditionDlg en la mitad superior de la vista de clases y luego encontrar su constructor en la mitad inferior de la vista. Haga doble clic y el área del cliente central puede cambiar a la implementación del constructor. Es un buen hábito agregar m_pTipDlg = NULL; en el cuerpo del constructor Chicken pecking rice mencionado en la asignación de punteros y la aritmética de punteros de la serie de introducción a la programación en C++ que se inicializa antes de usar cualquier variable de puntero, lo que puede evitar el acceso accidental. dirección de memoria importante y destruir los datos en esta dirección.
  • 3. Comente o elimine el código de visualización de diálogo modal agregado en la lección anterior y agregue el código de visualización y creación de diálogo no modal. En VC++, "//" se usa para comentar una sola línea de código, y "/*" se puede agregar al principio del código que se va a comentar, y "*/" al final del código comentado. La función CAdditionDlg::OnBnClickedAddButton() modificada es la siguiente:

  
  
   
   
  1. void CAAdditionDlg::OnClickedAddButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. /*INT_PTR nRes; // Se utiliza para guardar el valor de retorno de la función DoModal
  5. CTipDlg tipDlg; // Construir una instancia de la clase de diálogo CTipDlg
  6. nRes = tipDlg.DoModal(); // cuadro de diálogo emergente
  7. if (IDCANCEL == nRes) // Determinar si el valor devuelto es IDCANCEL después de salir del cuadro de diálogo, si lo es, volver, de lo contrario continuar con la ejecución
  8. devolver;*/
  9. // Si el valor de la variable de puntero m_pTipDlg es NULL, el cuadro de diálogo aún no se ha creado y debe crearse dinámicamente
  10. si ( NULO == m_pTipDlg)
  11. {
  12. // Crear una instancia de diálogo no modal
  13. m_pTipDlg = nuevo CTipDlg ();
  14. m_pTipDlg-> Crear (IDD_TIP_DIALOG, esto );
  15. }
  16. // mostrar un diálogo no modal
  17. m_pTipDlg-> Mostrar Ventana (SW_SHOW);
  18. // Guarda los datos de cada control en la variable correspondiente
  19. Actualizar datos (VERDADERO);
  20. // Asignar la suma del sumando y el sumando a m_editSum
  21. m_editSum = m_editSumand + m_editAddend;
  22. // Actualizar el control correspondiente según el valor de cada variable. y el cuadro de edición mostrará el valor de m_editSum
  23. Actualizar datos (FALSO);
  24. }

  De esta forma, se agrega y modifica el código para crear y mostrar el cuadro de diálogo no modal. Ejecutémoslo para ver el efecto.

      Ingrese el sumando y el sumando en el cuadro de diálogo de la calculadora de suma, y ​​luego haga clic en el botón "Calcular", el cuadro de diálogo emergente seguirá apareciendo como en la sección anterior, pero no lo cierre todavía, puede arrastrar el cuadro de diálogo de la calculadora de suma cuadro detrás de él Pruebe el cuadro, encontramos que el cuadro de diálogo de la calculadora de adición se puede arrastrar, y el resultado del cálculo se ha mostrado en el cuadro de edición "y", lo que indica que el cuadro de diálogo de solicitud no se ha cerrado después de que se muestra, y OnBnClickedAddButton() continuará ejecutándose hacia abajo, no solo eso, cada cuadro de edición de la calculadora de suma también puede responder a la entrada.

Este es solo un ejemplo simple. Los cuadros de diálogo sin modelo tienen muchos usos y los usará en el desarrollo de software en el futuro.

 

 

Cuadro de diálogo Páginas de propiedades

 

Clasificación de los cuadros de diálogo de la página de propiedades

El cuadro de diálogo de la página de propiedades debe ser familiar para todos. En el sistema XP, haga clic derecho en el escritorio y haga clic en Propiedades, y la ventana emergente es el cuadro de diálogo de la página de propiedades, que cambia cada página a través de pestañas. Además, el cuadro de diálogo del asistente que usamos al crear un proyecto MFC también es un cuadro de diálogo de página de propiedades, que cambia de página haciendo clic en botones como "Siguiente".
El cuadro de diálogo de la página de propiedades incluye el cuadro de diálogo de la página de propiedades generales y el cuadro de diálogo del asistente. Integra múltiples cuadros de diálogo en uno y cambia de página a través de pestañas o botones.
Clases relacionadas con el cuadro de diálogo de la página de propiedades

Cuando usamos el cuadro de diálogo de la página de propiedades, se usan dos clases principales: la clase CPropertyPage y la clase CPropertySheet.

 

 1. clase CPropertyPage

       La clase CPropertyPage se hereda de la clase CDialog y se usa para procesar una sola página de propiedades, así que cree una subclase que herede de CPropertyPage para cada página de propiedades. Puede encontrar descripciones detalladas de la clase CPropertyPage y sus miembros en MSDN de VS2010 . El siguiente pollo picoteando arroz explicará algunas de las principales funciones de los miembros de la clase CPropertyPage enumeradas en MSDN.


  
  
   
   
  1. ( 1 ) Constructor
  2.         Aquí hay tres constructores de la clase CProperty. El prototipo de función es:
  3.         CPáginaPropiedad( );
  4.         CPropertyPage explícita (
  5.                 Plantilla nID UINT ,
  6.                 UINT nIDCaption = 0 ,
  7.                 DWORD dwTamaño = tamaño de (PROPSHEETPAGE)
  8.         );
  9.          CPropertyPage explícita (
  10.                 LPCTSTR lpszTemplateName,
  11.                 UINT nIDCaption = 0 ,
  12.                 DWORD dwTamaño = tamaño de (PROPSHEETPAGE)
  13.         );
  14.        El primero es un constructor sin ningún parámetro.
  15.        En el segundo constructor, el parámetro nIDTemplate es el ID de recurso de diálogo de la página de propiedades,
  16. El parámetro nIDCaption es el ID del recurso de cadena utilizado para el título de la pestaña del cuadro de diálogo de la página de propiedades,
  17. Si se establece en 0 , el título de la pestaña usa el título del recurso de diálogo de la página de propiedades.
  18.        En el tercer constructor, el parámetro lpszTemplateName es la cadena de nombre del recurso de diálogo de la página de propiedades,
  19. no puede ser NULO . El parámetro nIDCaption es el mismo que el anterior.
  20. ( 2 ) Función CancelarParaCerrar()
  21.        Use la función CancelToClose() después de que se haya realizado una operación irrecuperable en la página de propiedades del cuadro de diálogo de la página de propiedades modal
  22. Cambie el botón "Aceptar" a un botón "Cerrar" y deshabilite el botón "Cancelar". El prototipo de función es:
  23.         void CancelarParaCerrar( );
  24. ( 3 ) Función SetModified()
  25.        Llame a esta función para activar o desactivar el botón "Aplicar", el prototipo de función es:
  26.         void EstablecerModificado( BOOL bCambiado = VERDADERO );
  27. ( 4 ) Funciones sobrecargables
  28.        La clase CPropertyPage proporciona algunas funciones de procesamiento de mensajes para responder a varios mensajes del cuadro de diálogo de la página de propiedades.
  29. Podemos personalizar el procesamiento de las operaciones del cuadro de diálogo de la página de propiedades sobrecargando estas funciones de procesamiento de mensajes.
  30. Los controladores de mensajes sobrecargables incluyen:
  31.        OnApply: maneja el mensaje de que se hace clic en el botón "Aplicar" de la página de propiedades
  32.        OnCancel: maneja el mensaje de que se hace clic en el botón "Cancelar" de la página de propiedades
  33.        OnKillActive: maneja el mensaje de que el estado activo actual de la página de propiedades ha cambiado, a menudo se usa para la validación de datos
  34.        OnOK: maneja el mensaje de que se hace clic en el botón "Aceptar", el botón "Aplicar" o el botón "Cerrar" de la página de propiedades
  35.        OnQueryCancel: maneje el mensaje enviado antes de hacer clic en el botón "Cancelar" de la página de propiedades
  36.        OnReset: maneja el mensaje de que se hace clic en el botón "Restablecer" de la página de propiedades
  37.        OnSetActive: maneja el mensaje de que la página de propiedades se cambia a la página activa actual
  38.        OnWizardBack: maneja el mensaje de que se hace clic en el botón "Atrás" de la página de propiedades, solo es válido en el cuadro de diálogo del asistente
  39.        OnWizardFinish: maneja el mensaje de que se hace clic en el botón "Finalizar" de la página de propiedades, solo es válido en el cuadro de diálogo del asistente
  40.        OnWizardNext: maneja el mensaje de que se hace clic en el botón "Siguiente" de la página de propiedades, solo es válido en el cuadro de diálogo del asistente

 

2. Clase CPropertySheet

       La clase CPropertySheet hereda de la clase CWnd, que es una clase de hoja de propiedades responsable de cargar, abrir o eliminar páginas de propiedades y cambiar las páginas de propiedades en el cuadro de diálogo de la página de propiedades. Es similar a un cuadro de diálogo y también tiene dos tipos: modal y no modal. El siguiente pollo picoteando arroz explicará algunas funciones de los miembros de la clase CPropertySheet.


  
  
   
   
  1. ( 1 ) Constructor
  2.        Los tres constructores de la clase CPropertySheet todavía se enumeran aquí:
  3.        CHojaDePropiedades ( );
  4.         CPropertySheet explícito (
  5.                UINT nIDCaption,
  6.                CWnd* pParentWnd = NULL ,
  7.                UINT iSelectPage = 0 
  8.        ) ;
  9.        CPropertySheet explícito (
  10.                LPCTSTR pszCaption,
  11.                CWnd* pParentWnd = NULL ,
  12.                UINT iSelectPage = 0 
  13.        ) ;
  14.        Parámetro nIDCaption: ID de la cadena de recursos para el título.
  15.        Parámetro pParentWnd: la ventana principal del cuadro de diálogo de la página de propiedades, si se establece en NULL , la ventana principal es la ventana principal de la aplicación.
  16.        Parámetro iSelectPage: en el estado inicial, el índice de la página de propiedades activa, que por defecto es la primera página de propiedades añadida a la hoja de propiedades.
  17.        Parámetro pszCaption: cadena de título.
  18. ( 2 Función GetActiveIndex ()
  19.        Obtenga el índice de la página de propiedades actualmente activa. El prototipo de función es:
  20.        int GetActiveIndex () const ;
  21.        Valor devuelto: el índice de la página de propiedades actualmente activa.
  22. ( 3 Función GetActivePage ()
  23.        Obtiene el objeto de página de propiedades actualmente activo. El prototipo de función es:
  24.        CPropertyPage* GetActivePage ( ) const ;
  25.        Valor de retorno: puntero al objeto de página de propiedades actualmente activo.
  26. ( 4 Función ObtenerPágina ()
  27.        Obtenga un objeto de página de propiedades. El prototipo de función es:
  28.        CPropertyPage* GetPage ( int nPage) const ;
  29.        Parámetros nPage: el índice de la página de propiedades de destino.
  30.        Valor de retorno: un puntero al objeto de la página de propiedades de destino.
  31. ( 5 Función GetPageCount ()
  32.        Obtener el número de páginas de propiedades. El prototipo de función es:
  33.         int GetPageCount () const ;
  34.        Valor devuelto: el número de páginas de propiedades.
  35. ( 6 Función GetPageIndex ()
  36.        Obtiene el índice de una página de propiedades en el cuadro de diálogo de la página de propiedades. El prototipo de función es:
  37.        int GetPageIndex (CPropertyPage* pPage) ;
  38.        Parámetro pPage: el puntero del objeto de la página de propiedades para obtener el índice.
  39.        Valor devuelto: el índice del objeto de la página de propiedades en el cuadro de diálogo de la página de propiedades.
  40. ( 7 Función SetActivePage ()
  41.        Establece una página de propiedades como la página de propiedades activa. El prototipo de función es:   
  42.         BOOL Establecer página activa (
  43.                  int nPágina 
  44.        ) ;
  45.         BOOL Establecer página activa (
  46.                  CPropertyPage* pPage 
  47.        ) ;
  48.        Parámetros nPage: el índice que se establecerá como la página de propiedades activa.
  49.        Parámetros pPage: el puntero del objeto que se establecerá como la página de propiedades activa.
  50. ( 8 Función SetWizardButtons ()
  51.        Para habilitar o deshabilitar los botones Atrás, Siguiente o Finalizar en un diálogo de asistente, se debe llamar a esta función antes de llamar a DoModal.
  52. El prototipo de función es:
  53.         vacío SetWizardButtons (
  54.                 DWORD dwFlags 
  55.        ) ;
  56.        Parámetro dwFlags: establezca los atributos de apariencia y función del botón del asistente. Puede ser una combinación de los siguientes valores:
  57.        PSWIZB_BACK Habilita el botón "Atrás" o deshabilita el botón "Atrás" si este valor no está incluido.
  58.        PSWIZB_NEXT Habilita el botón "Siguiente" o deshabilita el botón "Siguiente" si este valor no está incluido.
  59.        PSWIZB_FINISH Habilita el botón "Finalizar".
  60.        PSWIZB_DISABLEDFINISH Muestra un botón "Finalizar" deshabilitado.
  61. ( 9 Función SetWizardMode ()
  62.        Establece el cuadro de diálogo de la página de propiedades como un cuadro de diálogo de asistente, y esta función debe llamarse antes de llamar a DoModal. El prototipo de función es:
  63.         void Establecer Modo Asistente ( ) ;
  64. ( 10 Establecer título () función
  65.        Establece el título del cuadro de diálogo de propiedades. El prototipo de función es:
  66.         void Establecer Título (
  67.                LPCTSTR lpszTexto,
  68.                UINT nEstilo = 0 
  69.        ) ;
  70.        Parámetro lpszText: cadena de título.
  71.        Parámetro nStyle: especifica el estilo del título de la tabla de atributos. debiera ser 0 o PSH_PROPTITULO。
  72. Si se establece en PSH_PROPTITLE, la palabra "Propiedades" aparecerá después del título especificado.
  73. Por ejemplo, Establecer título ( "Simple" , PSH_PROPTITLE) hará que el título de la hoja de propiedades sea "Propiedades simples".
  74. ( 11 ) Agregar página () función
  75.        Se agregó una nueva página de propiedades para el cuadro de diálogo de propiedades. El prototipo de función es:
  76.         anular página adicional (
  77.                CPropertyPage *pPage 
  78.        ) ;
  79.        Parámetro pPage: el puntero del objeto de la nueva página de propiedades que se agregará.
  80. ( 12 Botón de presión () función
  81.        Simula presionar un botón específico. El prototipo de función es:   
  82.         botón vacío (
  83.                int nBotón 
  84.        ) ;
  85.        Parámetro nButton: El botón a simular que se presiona, puede tener uno de los siguientes valores:
  86.        PSBTN_BACK Seleccione el botón "Atrás". 
  87.        PSBTN_NEXT Seleccione el botón "Siguiente".
  88.        PSBTN_FINISH Seleccione el botón "Finalizar".
  89.        PSBTN_OK Seleccione el botón "Aceptar".
  90.        PSBTN_APPLYNOW Seleccione el botón Aplicar.
  91.        PSBTN_CANCEL Seleccione el botón "Cancelar".
  92.        PSBTN_HELP Seleccione el botón Ayuda.
  93. ( 13 Eliminar página () función
  94.        Eliminar una página de propiedades. El prototipo de función es:
  95.        anular Eliminar página (
  96.                CPropertyPage *pPage 
  97.        ) ;
  98.         anular Eliminar página (
  99.                int nPágina 
  100.        ) ;
  101.        Parámetro pPage: el puntero de objeto de la página de propiedades que se va a eliminar.
  102.        Parámetros nPage: el índice de la página de propiedades que se va a eliminar.

       El cuadro de diálogo de propiedades y los dos tipos relacionados de pollo picoteando arroz se presentan aquí primero, principalmente para preparar el uso del cuadro de diálogo de la página de propiedades más adelante.

 

 

Crear cuadro de diálogo del asistente

 

       Todavía basado en el ejemplo anterior de "calculadora de suma", agregando un cuadro de diálogo de asistente, podemos usarlo para explicar cómo usar la calculadora de suma y guiar al usuario paso a paso, que también es un uso relativamente común.

       Al usar la calculadora de suma, se puede dividir aproximadamente en tres pasos: ingrese el sumando, ingrese el sumando y haga clic en el botón "calcular".

       Pollo picoteando arroz detallará los pasos de creación del cuadro de diálogo del asistente:

 

1. Crear un recurso de diálogo de página de propiedades

       De acuerdo con el método descrito en Crear una plantilla de diálogo y modificar las propiedades del diálogo, haga clic con el botón derecho en el nodo Diálogo de "Vista de recursos" y luego seleccione "Insertar diálogo" en el menú contextual para crear la primera plantilla de diálogo, el ID del cuadro de diálogo

       Elimine los botones "Aceptar" y "Cancelar", y luego agregue un cuadro de texto estático de acuerdo con el método descrito en Agregar controles al cuadro de diálogo , y modifique la propiedad Caption del cuadro de texto estático a "Ingrese primero el sumando doble". .

       Proceda a agregar los recursos de diálogo segundo y tercero, siguiendo los pasos anteriores. El ID de la segunda plantilla de diálogo se establece en IDD_ADDEND_PAGE, y la propiedad Caption se cambia a "Addend Page", y también se agrega un cuadro de texto estático, y el Caption se establece en "Por favor, continúe ingresando un complemento de tipo doble", y otras propiedades son las mismas que en el primer cuadro de diálogo. El ID de la tercera plantilla de diálogo se establece en IDD_ADD_PAGE, la propiedad Título se cambia a "Página de cálculo", la propiedad Título del cuadro de texto estático agregado se cambia a "Finalmente, presione el botón "Calcular"", y otras propiedades son los mismos que el primer cuadro de diálogo.

 

2. Crear una clase de página de propiedades

       De acuerdo con el método para crear una clase de diálogo y agregar variables de control , haga clic con el botón derecho en la primera plantilla de diálogo, seleccione "Agregar clase" en el menú del botón derecho y aparecerá el cuadro de diálogo del asistente de clase, ingrese la clase en el Cuadro de edición "Nombre de clase" El nombre "CSummandPage" es diferente al anterior, porque la clase de página de propiedades debe heredar de la clase CPropertyPage, por lo que para modificar la opción "Clase base" a continuación, seleccione "CPropertyPage" en la lista desplegable.

       Dado que es la primera página de propiedades, debe tener un botón "Siguiente", ¿dónde agregarlo? Como se mencionó en la lección anterior sobre la función sobrecargable de la clase CPropertyPage , la función OnSetActive se usa para procesar el mensaje de que la página de propiedades se cambia a la página activa actual, por lo que podemos realizar configuraciones relacionadas en la función OnSetActive.

       Entonces, ¿cómo sobrecargar la función OnSetActive? Podemos encontrar el nodo "CSummandPage" en "Vista de clase", hacer clic derecho para abrir el menú contextual, seleccionar "Propiedades" y luego la lista de propiedades del cuadro de diálogo se mostrará en el panel derecho de VS2010. Hay una información de sugerencia en la barra de herramientas de la lista de propiedades como el botón "Anulaciones", presiónelo, las funciones sobrecargadas se enumeran en la lista inferior, busque "OnSetActive", haga clic en el elemento de la lista en blanco a la derecha y aparecerá una flecha hacia abajo. aparecerá, luego haga clic en la flecha y "<Agregar>" aparecerá debajo de la opción OnSetActive", selecciónela y automáticamente agregará la función OnSetActive en la clase CSummandPage.

   Solo necesitamos agregar códigos relevantes en el cuerpo de la función OnSetActive para lograr el efecto de agregar el botón "Siguiente". El nuevo cuerpo de la función es el siguiente:


  
  
   
   
  1. BOOL CSummandPage::OnSetActive ()
  2. {
  3. // TODO: Agregue su código especializado aquí y/o llame a la clase base
  4. // Obtener la ventana principal, es decir, la hoja de propiedades Clase CPropertySheet
  5. CPropertySheet* psheet = (CPropertySheet*) ObtenerPadre ();
  6. // Establecer la hoja de propiedades para que solo tenga el botón "Siguiente"
  7. hoja-> Configurar botones del asistente (PSWIZB_NEXT);
  8. volver CPropertyPage:: OnSetActive ();
  9. }

       Agregue también las clases de página de propiedades CAddendPage y CAddPage para los cuadros de diálogo segundo y tercero, respectivamente. Pero la página de propiedades del segundo cuadro de diálogo no necesita anular la función OnSetActive. El tercer cuadro de diálogo es el último cuadro de diálogo, por lo que el botón "Siguiente" no es necesario, pero debe reemplazarse con el botón "Finalizar", por lo que también es necesario sobrecargar la función OnSetActive para configurar el botón "Finalizar". El OnSetActive sobrecargado es el siguiente:


  
  
   
   
  1. BOOL CAddPage::OnSetActive ()
  2. {
  3. // TODO: Agregue su código especializado aquí y/o llame a la clase base
  4. // Obtener la ventana principal, es decir, la hoja de propiedades Clase CPropertySheet
  5. CPropertySheet* psheet = (CPropertySheet*) ObtenerPadre ();
  6. // Establecer la tabla de atributos para que solo tenga el botón "Listo"
  7. hoja-> EstablecerFinalizarTexto (_T( "Listo" ));
  8. volver CPropertyPage:: OnSetActive ();
  9. }

       En el segmento de código anterior, se agrega una _T antes de la cadena "Completar", esto se debe a que se usó el conjunto de caracteres Unicode predeterminado cuando se creó el proyecto, y si no se agrega _T antes de "Completar", es una cadena ASCII. _T es en realidad una macro.Cuando el conjunto de caracteres del proyecto se selecciona como Unicode, la cadena se convierte en una cadena Unicode, y cuando se selecciona Muli-Byte, se convierte en una cadena ASCII. Podemos hacer clic con el botón derecho en el nodo raíz Adición del Explorador de soluciones, seleccionar "Propiedades" en el menú del botón derecho y aparecerá el cuadro de diálogo de propiedades del proyecto.El conjunto de caracteres en la lista del lado derecho de Propiedades de configuración-> General mostrará el juego de caracteres seleccionado.

       Luego haga clic en el botón "Finalizar" en la tercera página de propiedades.Si queremos realizar algún procesamiento, sobrecargaremos la función OnWizardFinish, el método es el mismo que la función OnSetActive. La función OnWizardFinish sobrecargada es la siguiente:


  
  
   
   
  1. BOOL CAddPage::OnWizardFinish ()
  2. {
  3. // TODO: Agregue su código especializado aquí y/o llame a la clase base
  4. // Indicar que el asistente está completo
  5. cuadro de mensaje (_T( "¡Se ha leído la guía de instrucciones!" ));
  6. volver CPropertyPage:: OnWizardFinish ();
  7. }

 

3. Crear una clase de hoja de propiedades

       Después de crear los recursos de la página de propiedades y las clases de la página de propiedades, no se puede generar el cuadro de diálogo del asistente. También necesitamos una clase de hoja de propiedades para acomodar estas páginas de propiedades.

       Haga clic con el botón derecho en el nodo raíz "Adición" en la vista del Explorador de soluciones, seleccione Agregar->Clase en el menú contextual y aparecerá el cuadro de diálogo "Agregar clase", luego seleccione "Clase MFC" en el área central. y haga clic en el botón "Agregar", aparece el cuadro de diálogo del asistente de otra clase, establezca el nombre de la clase en CAddSheet, seleccione "CPropertySheet" como la clase base y haga clic en el botón "Finalizar", para que se construya la clase de hoja de propiedades.

       A continuación, incluya los archivos de encabezado para las tres clases de hoja de propiedades en el AddSheet.h recién generado:

       #include "SummandPage.h"
       #include "AddendPage.h"
       #include "AddPage.h"

       Luego agregue variables privadas en AddSheet.h:

       CSummandPage m_summandPage;C
       CAAddendPage m_addendPage;
       CAddPage m_addPage;

       Luego modifique los dos constructores de CAddSheet en el archivo AddSheet.cpp como:


  
  
   
   
  1. CAddSheet :: CAddSheet ( UINT nIDCaption, CWnd* pParentWnd, UINT iSeleccionar página)
  2. :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  3. {
  4. // Añadir tres páginas de propiedades a la hoja de propiedades
  5. AddPage(&m_summandPage);
  6. AgregarPágina(&m_addendPage);
  7. AñadirPágina(&m_añadirPágina);
  8. }
  9. CAddSheet :: CAddSheet (LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSeleccionar página)
  10. :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  11. {
  12. // Añadir tres páginas de propiedades a la hoja de propiedades
  13. AddPage(&m_summandPage);
  14. AgregarPágina(&m_addendPage);
  15. AñadirPágina(&m_añadirPágina);
  16. }

 

4. Mostrar cuadro de diálogo del asistente

        Agregamos un botón al cuadro de diálogo de la calculadora de adición, haga clic en él para abrir el cuadro de diálogo del asistente. El ID de este botón se establece en IDC_INSTRUCT_BUTTON y la propiedad Caption se establece en "Instrucciones".

        De acuerdo con el método descrito en Adición de una función de procesamiento de mensajes para un control , agregue una función de procesamiento de mensajes de clic OnBnClickedInstructButton en la clase CAdditionDlg para el botón IDC_INSTRUCT_BUTTON. Luego incluya el archivo de encabezado de CAddSheet en el archivo AdditionDlg.cpp: #include "AddSheet.h". Finalmente modifique la función OnBnClickedInstructButton de la siguiente manera:


  
  
   
   
  1. void CAdditionDlg::OnBnClickedInstructButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. // crear objeto de tabla de atributos
  5. hoja CAddSheet (_T( "" )) ;
  6. // Establecer el diálogo de propiedades como un diálogo de asistente
  7. hoja. Establecer Modo Asistente ();
  8. // Abre el cuadro de diálogo del asistente modal
  9. hoja. DoModal ();
  10. }

En este punto, el cuadro de diálogo del asistente está completamente creado y se puede mostrar haciendo clic en el botón "Instrucciones" en el cuadro de diálogo de la calculadora de adición. Veamos el efecto:

       La imagen de arriba es solo el efecto de la página agregada, haga clic en el botón "Siguiente" para continuar mostrando las siguientes dos páginas.

       ¿Son los cuadros de diálogo del asistente menos complejos de lo que se pensaba anteriormente? Puedes usar tu imaginación para hacer modificaciones más complejas y lograr funciones más perfectas. Los amigos siguen siendo bienvenidos al blog de pollo picoteando arroz para intercambiar y aprender.

 

 

Creación y visualización de cuadros de diálogo de página de propiedades

 

Los cuadros de diálogo de página de propiedades incluyen cuadros de diálogo de asistente y cuadros de diálogo de página de propiedades generales. La sección anterior describía cómo crear y mostrar cuadros de diálogo de asistente . Esta sección continuará introduciendo la creación y visualización de cuadros de diálogo de página de propiedades generales.

       De hecho, el proceso de creación y visualización de los cuadros de diálogo de la página de propiedades generales es muy similar al de los cuadros de diálogo del asistente. Chicken Peck Rice modifica ligeramente el cuadro de diálogo del asistente en la sección anterior para convertirlo en un cuadro de diálogo de página de propiedades generales.

       Los pasos de creación del cuadro de diálogo de la página de propiedades generales:

       1. Crear un recurso de diálogo de página de propiedades

       El método de creación del recurso de diálogo de la página de propiedades es el mismo que el del diálogo del asistente, y el recurso de diálogo de la lección anterior no necesita ninguna modificación.

       2. Crear una clase de página de propiedades

       La creación de la clase de página de propiedades es básicamente la misma que la clase de página de propiedades del cuadro de diálogo del asistente, excepto que los botones como "Siguiente" y "Finalizar" no son necesarios en el cuadro de diálogo de la página de propiedades general, por lo que OnSetActive y OnWizardFinish de la clase de página de propiedades de la lección anterior Las funciones sobrecargadas se pueden eliminar. Es decir, la función OnSetActive en la clase CSummandPage, la función OnSetActive y la función OnWizardFinish en la clase CAddPage se pueden eliminar o comentar. Otras partes no necesitan ninguna modificación.

       3. Crear una clase de hoja de propiedades

       El proceso de creación de la clase de hoja de propiedades es el mismo que el de la clase de hoja de propiedades del cuadro de diálogo del asistente, por lo que no es necesario modificar la clase CAddSheet de la lección anterior.

       4. Mostrar el cuadro de diálogo Páginas de propiedades generales

       La visualización del cuadro de diálogo del asistente en la lección anterior se implementa en la función OnBnClickedInstructButton.La declaración sheet.SetWizardMode(); tiene como objetivo establecer la hoja de propiedades como el modo de diálogo del asistente, por lo que no es necesario llamar a la función miembro SetWizardMode cuando mostrando el cuadro de diálogo de la página de propiedades generales. Además, podemos establecer el título del cuadro de diálogo de la página de propiedades como "Instrucciones" y pasar esta cadena como un parámetro del constructor al construir el objeto de la hoja de propiedades . La función OnBnClickedInstructButton se modifica de la siguiente manera:


  
  
   
   
  1. void CAdditionDlg::OnBnClickedInstructButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. // crear objeto de tabla de atributos
  5. hoja CAddSheet (_T( "Instrucciones" )) ;
  6. // Abrir el cuadro de diálogo de la página de propiedades generales modales
  7. hoja. DoModal ();
  8. }

De esta manera, la creación y visualización del cuadro de diálogo de la página de propiedades generales ha finalizado. Ejecutemos el programa y hagamos clic en el botón "Instrucciones" en el cuadro de diálogo resultante para ver el efecto:

Introducción a la programación VS2010/MFC Quince (Cuadro de diálogo: Creación y visualización del cuadro de diálogo Página de propiedades generales)

    En resumen, la diferencia entre la creación y visualización del cuadro de diálogo de la página de propiedades generales y el cuadro de diálogo del asistente incluye: si necesita funciones sobrecargadas como OnSetActive y OnWizardFinish, y si debe llamar a la función SetWizardMode de la clase de hoja de propiedades para establecer como el modo de cuadro de diálogo del asistente.

 

 

diálogo de mensaje

 

En las secciones anteriores, el pollo picoteando arroz habló sobre el cuadro de diálogo de la página de propiedades , y podemos crear fácilmente nuestro propio cuadro de diálogo de la página de propiedades de acuerdo con el contenido. Esta sección explica el tipo de cuadro de diálogo más utilizado y más simple en el sistema Windows: el cuadro de diálogo de mensaje.

       A menudo vemos cuadros de diálogo de mensajes en el proceso de uso del sistema Windows, indicándonos que hay una excepción o haciendo preguntas. Debido a que los cuadros de diálogo de mensajes se usan a menudo en el desarrollo de software, MFC proporciona dos funciones que pueden generar directamente un cuadro de diálogo de mensaje de un estilo específico, sin la necesidad de que creemos recursos de diálogo y generemos cuadros de diálogo cada vez que usamos la clase, etc. Estas dos funciones son la función miembro MessageBox() de la clase CWnd y la función global AfxMessageBox().

 

1.   Uso de la función CWnd::MessageBox() y la función AfxMessageBox()

       El siguiente pollo picoteando arroz explicará el uso de las dos funciones respectivamente.

       1. Función CWnd::MessageBox()

       El prototipo de función de CWnd::MessageBox() es el siguiente:     


  
  
   
   
  1.   int cuadro de mensaje (
  2.            LPCTSTR lpszTexto,
  3.            LPCTSTR lpszCaption = NULO ,
  4.             UINT nTipo = MB_OK
  5.        );
  6.        Descripción de parámetros:
  7.        lpszText: la cadena de mensaje que se mostrará.
  8.        lpszCaption: la cadena de título del cuadro de diálogo del mensaje. El valor predeterminado es NULO . el valor es Cuando NULL se utiliza el título predeterminado.
  9.        nType: el estilo y las propiedades del cuadro de diálogo del mensaje. El valor predeterminado es el estilo MB_OK, es decir, solo el botón "Aceptar".
  10.        El valor de nType puede ser uno de los valores de las dos tablas siguientes o cualquier combinación de un valor para cada uno.
  11. Es decir, puede especificar un tipo de cuadro de diálogo, un icono de diálogo o ambos.

El valor de nType puede ser uno de los valores de las dos tablas siguientes o cualquier combinación de un valor para cada uno. Es decir, puede especificar un tipo de cuadro de diálogo, un icono de diálogo o ambos. La siguiente tabla es  la tabla de tipo de cuadro de diálogo

n Escriba el valor Descripción de parámetros
MB_ABORTRETRY Tiene los botones "Cancelar", "Reintentar" e "Ignorar"
MB_OK Tiene un botón "OK"
MB_OKCANCELAR Tiene botones "Aceptar" y "Cancelar"
MB_RETRYCANCEL Tiene botones "Reintentar" y "Cancelar"
MB_YESNO Tiene botones "Sí" y "No"
MB_YESNOCANCEL Tiene botones "Sí", "No" y "Cancelar"

La siguiente tabla es   la tabla de iconos del cuadro de diálogo

n Escriba el valor muestra el icono
MB_ICONEXCLAMTION
MB_ICONWARNING
Introducción a la programación VS2010/MFC Dieciséis (Cuadro de diálogo: Cuadro de diálogo Mensaje)
MB_ICONASTERISK
MB_ICONINFORMATION
Introducción a la programación VS2010/MFC Dieciséis (Cuadro de diálogo: Cuadro de diálogo Mensaje)
MB_ICONQUESTION Introducción a la programación VS2010/MFC Dieciséis (Cuadro de diálogo: Cuadro de diálogo Mensaje)
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
Introducción a la programación VS2010/MFC Dieciséis (Cuadro de diálogo: Cuadro de diálogo Mensaje)

       Si desea establecer el valor de nType para que sea una combinación de tipo e ícono, puede tomar el valor de esta manera: MB_OKCANCEL | MB_ICONQUESTION. Bitwise OR está bien.

 

       2. Función AfxMessageBox()

       El prototipo de función de AfxMessageBox() es:


  
  
   
   
  1.        int AfxMessageBox (
  2.            LPCTSTR lpszTexto,
  3.            UINT nTipo = MB_OK,
  4.            UINT nIDAyuda = 0
  5.        ) ;
  6.        Descripción de parámetros:
  7.        lpszText: Igual que CWnd:: Función MessageBox ()
  8.        nTipo:CWnd:: Función MessageBox ()
  9.        nIDHelp: el ID de contexto de la ayuda para este mensaje. El valor predeterminado es 0 , tomar Cuando 0 significa usar el contexto de ayuda predeterminado de la aplicación.

 

2.  El valor de retorno de CWnd::MessageBox() y AfxMessageBox()

      Después de llamar a las dos funciones anteriores, podemos abrir un cuadro de diálogo de mensaje modal. Una vez que se cierra el cuadro de diálogo del mensaje, también podemos obtener sus valores de retorno. El valor de retorno de ambos es el ID del botón en el que el usuario hizo clic en el cuadro de diálogo del mensaje, que puede tener los siguientes valores:

      IDABORT: Haga clic en el botón Terminar.
      IDCANCEL: Haga clic en el botón Cancelar.
      IDIGNORE: Haga clic en el botón Ignorar.
      IDNO: Haga clic en el botón "No".
      IDOK: Haga clic en el botón Aceptar.
      IDREINTENTAR: haz clic en el botón Reintentar.
      IDYES: Haga clic en el botón "Sí".

 

3.  Ejemplos de aplicación

     Todavía tomemos el programa de calculadora de suma anterior como ejemplo.

       ¿Recuerdas que modificamos la función CAdditionDlg::OnBnClickedAddButton() durante el cuadro de diálogo modal y su proceso emergente Después de hacer clic en el botón "Calcular", apareció primero un cuadro de diálogo modal, preguntando al usuario si está seguro de realice el cálculo de suma y juzgue si el usuario ha seleccionado "Aceptar" o "Cancelar" a través del valor de retorno de la función DoModal del cuadro de diálogo modal. Obviamente, estas funciones se realizan por completo en el cuadro de diálogo del mensaje, y Chicken Peck Rice usa el cuadro de diálogo del mensaje para reemplazar el cuadro de diálogo modal original.

       En la creación y visualización del cuadro de diálogo no modal , Jipemi comentó el código relevante del cuadro de diálogo modal y agregó el código de creación y visualización del cuadro de diálogo no modal. Antes de agregar el cuadro de diálogo de mensaje, agregamos el código no -cuadro de diálogo modal El código del cuadro también se comenta o elimina para garantizar que el cuadro de diálogo modal original o el cuadro de diálogo no modal ya no se genera en esta función.

       La función CAdditionDlg::OnBnClickedAddButton() modificada es la siguiente:


  
  
   
   
  1. void CAdditionDlg::OnBnClickedAddButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. INT_PTR nRes;
  5. // mostrar diálogo de mensaje
  6. nRes = cuadro de mensaje (_T( "¿Estás seguro de que quieres agregar?" ), _T( "Calculadora de sumas" ), MB_OKCANCEL | MB_ICONQUESTION);
  7. // Determinar el valor de retorno del cuadro de diálogo del mensaje. Si es IDCANCEL, regrese, de lo contrario continúe ejecutando hacia abajo
  8. si (IDCANCEL == nRes)
  9. volver ;
  10. // Guarda los datos de cada control en la variable correspondiente
  11. Actualizar datos (VERDADERO);
  12. // Asignar la suma del sumando y el sumando a m_editSum
  13. m_editSum = m_editSumand + m_editAddend;
  14. // Actualizar el control correspondiente según el valor de cada variable. y el cuadro de edición mostrará el valor de m_editSum
  15. Actualizar datos (FALSO);
  16. // Establecer el diálogo de propiedades como un diálogo de asistente
  17. //hoja.EstablecerModoAsistente();
  18. }

Compile y ejecute, y haga clic en el botón "Calcular" en el cuadro de diálogo de resultados en ejecución para que aparezca el siguiente cuadro de diálogo de mensaje:

También puede reemplazar la función MessageBox con la función AfxMessageBox() y modificar los parámetros en consecuencia y ejecutarla para ver el efecto.

 

 

diálogo de archivo

 

      Clasificación de los diálogos de archivos

      El cuadro de diálogo de archivo se divide en el cuadro de diálogo de abrir archivo y el cuadro de diálogo de guardar archivo Creo que a menudo verá estos dos cuadros de diálogo de archivo en el sistema Windows. Por ejemplo, muchos programas de edición como el Bloc de notas tienen una opción "Abrir". Después de seleccionar "Abrir", aparecerá un cuadro de diálogo que nos permitirá elegir la ruta para abrir el archivo. Este cuadro de diálogo es el cuadro de diálogo para abrir el archivo; excepto por la opción "Abrir" Generalmente, también habrá una opción "Guardar como". Después de seleccionar "Guardar como", a menudo aparecerá un cuadro de diálogo, elijamos la ruta para guardar, este es el diálogo para guardar el archivo. caja.

       Como se ilustra arriba, el cuadro de diálogo Abrir archivo se usa para seleccionar la ruta del archivo que se abrirá, y el cuadro de diálogo Guardar archivo se usa para seleccionar la ruta del archivo que se guardará.

 

       Clase de diálogo de archivo CFileDialog

      MFC utiliza la clase de diálogo de archivo CFileDialog para encapsular la operación del diálogo de archivo. El prototipo constructor de la clase CFileDialog es el siguiente:


  
  
   
   
  1. CFileDialog explícito (
  2.    BOOL bOpenFileDialog,
  3.    LPCTSTR lpszDefExt = NULL ,
  4.    LPCTSTR lpszFileName = NULL ,
  5.    DWORD dwFlags = FEAR_HIDEREADONLY | FEAR_OVERWRITEPROMPT,
  6.    LPCTSTR lpszFilter = NULL ,
  7.    CWnd* pParentWnd = NULL ,
  8.    DWORD dwSize = 0 ,
  9.    BOOL bVistaStyle = TRUE
  10. ) ;

       Descripción de parámetros:

       bOpenFileDialog: especifica el tipo de diálogo de archivo que se va a crear. Establézcalo en TRUE para crear un diálogo de archivo abierto; de lo contrario, se creará un diálogo de archivo guardado.

       lpszDefExt: la extensión de archivo predeterminada. Si el usuario no ingresa una extensión en el cuadro de edición del nombre del archivo, la extensión especificada por lpszDefExt se agregará automáticamente al nombre del archivo. El valor predeterminado es NULL.

       lpszFileName: el nombre de archivo inicial que se muestra en el cuadro de edición de nombre de archivo. Si es NULL, no se muestra ningún nombre de archivo inicial.

       dwFlags: el atributo del cuadro de diálogo del archivo, que puede ser un valor o una combinación de varios valores. En cuanto a la definición de los valores de los atributos, puede encontrar la estructura OPENFILENAME en MSDN, y la descripción del elemento Flags contiene todos los valores de los atributos. El valor predeterminado es la combinación de OFN_HIDEREADONLY y OFN_OVERWRITEPROMPT. OFN_HIDEREADONLY significa ocultar la casilla de verificación "Solo lectura" en el cuadro de diálogo del archivo. OFN_OVERWRITEPROMPT significa que si el archivo que seleccionó existe en el cuadro de diálogo Guardar archivo, aparecerá un cuadro de diálogo de mensaje pidiéndole que confirme para sobrescribir este archivo.

       lpszFilter: filtro de archivos, que es una secuencia de cadenas compuesta por varios pares de cadenas. Si se especifica un filtro de archivos, solo los archivos que cumplan con los criterios de filtro se mostrarán en la lista de archivos para seleccionarlos en el cuadro de diálogo de archivos. Déjame mostrarte un ejemplo dado en VS2010 MSDN:

       static TCHAR BASED_CODE szFilter[] = _T("Archivos de gráficos (*.xlc)|*.xlc|Archivos de hojas de trabajo (*.xls)|*.xls|Archivos de datos (*.xlc;*.xls)|*.xlc; *.xls|Todos los archivos (*.*)|*.*||");

       Después de configurar el filtro de esta manera, habrá cuatro opciones en el cuadro combinado de extensión del cuadro de diálogo del archivo: Archivos de gráficos (*.xlc), Archivos de hojas de trabajo (*.xls), Archivos de datos (*.xlc;*.xls ) y Todos los archivos (*.*), puede ver que la extensión de cada archivo es un par de cadenas. Por ejemplo, la cadena de filtro de Chart Files es un par de Chart Files (*.xlc) y *.xlc.

       pParentWnd: el puntero a la ventana principal del cuadro de diálogo del archivo.

       dwSize: el tamaño de la estructura OPENFILENAME. Diferentes sistemas operativos corresponden a diferentes valores de dwSize. MFC usa este parámetro para determinar el tipo apropiado de diálogo de archivo (por ejemplo, si se crea un diálogo de archivo de Windows 2000 o un diálogo de archivo de XP). El valor predeterminado es 0, lo que significa que MFC decidirá qué cuadro de diálogo de archivo usar de acuerdo con la versión del sistema operativo en el que se ejecuta el programa.

       bVistaStyle: especifique el estilo del cuadro de diálogo del archivo, configúrelo en TRUE para usar el cuadro de diálogo del archivo de estilo Vista; de lo contrario, use la versión anterior del cuadro de diálogo del archivo. Este parámetro solo se aplica al compilar en Windows Vista.

       El cuadro de diálogo de archivo también es un cuadro de diálogo modal, por lo que se debe llamar a la función miembro DoModal() de la clase CFileDialog cuando se abre. Después de hacer clic en "Abrir" en el cuadro de diálogo Abrir archivo o hacer clic en "Guardar" en el cuadro de diálogo Guardar archivo, podemos usar la función miembro GetPathName() de la clase CFileDialog para obtener la ruta del archivo seleccionado.

       A continuación se enumeran varias funciones miembro de la clase CFileDialog, podemos usarlas para obtener varias opciones en el cuadro de diálogo del archivo.

GetFileExt(): Obtiene la extensión del archivo seleccionado.
GetFileName(): Obtiene el nombre del archivo seleccionado, incluida la extensión.
GetFileTitle(): Obtiene el título del archivo seleccionado, es decir, no se incluye el sufijo.
GetFolderPath(): Obtiene el directorio del archivo seleccionado.
GetNextPathName(): Obtenga el nombre completo de la ruta del siguiente archivo seleccionado.
GetPathName(): Obtenga el nombre completo de la ruta del archivo seleccionado.
GetReadOnlyPref(): Obtenga si "abrir en modo de solo lectura".
GetStartPosition(): Obtiene la posición del primer elemento en la lista de nombres de archivos.

 

       instancia de diálogo de archivo

      De acuerdo con el contenido mencionado anteriormente, Chicken Peck Rice le dará un ejemplo de un cuadro de diálogo de archivo.

       1. Cree un proyecto de aplicación MFC basado en cuadros de diálogo y establezca el nombre en "Ejemplo17".

       2. Modifique la plantilla del cuadro de diálogo principal IDD_EXAMPLE17_DIALOG, elimine el cuadro de texto estático "TODO: Coloque aquí los controles de diálogo" generado automáticamente, agregue dos cuadros de edición, los ID son IDC_OPEN_EDIT e IDC_SAVE_EDIT, y agregue dos botones, los ID se establecen en Para IDC_OPEN_BUTTON e IDC_SAVE_BUTTON, el Título se establece en "Abrir" y "Guardar" respectivamente. El botón IDC_OPEN_BUTTON se utiliza para mostrar el cuadro de diálogo de archivo abierto y el cuadro de edición IDC_OPEN_EDIT muestra la ruta del archivo seleccionado en el cuadro de diálogo de archivo abierto. El botón IDC_SAVE_BUTTON se utiliza para mostrar el cuadro de diálogo Guardar archivo y el cuadro de edición IDC_SAVE_BUTTON muestra la ruta del archivo seleccionado en el cuadro de diálogo Guardar archivo.

       3. Agregue las funciones de procesamiento de mensajes de clic CExample17Dlg::OnBnClickedOpenButton() y CExample17Dlg::OnBnClickedSaveButton() para los botones IDC_OPEN_BUTTON e IDC_SAVE_BUTTON respectivamente.

       4. Modifique las dos funciones de procesamiento de mensajes de la siguiente manera:


  
  
   
   
  1. void CEexample17Dlg::OnBnClickedOpenButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. // establecer filtro
  5. TCHAR szFilter[] = _T( "Archivos de texto (*.txt)|*.txt|Todos los archivos (*.*)|*.*||" );
  6. // construir diálogo de archivo abierto
  7. CFileDialog fileDlg (TRUE, _T( "txt" ), NULL , 0 , szFilter, this ) ;
  8. CString strFilePath;
  9. // mostrar diálogo de archivo abierto
  10. if (IDOK == fileDlg. DoModal ())
  11. {
  12. // Si se hace clic en el botón "Abrir" en el cuadro de diálogo del archivo, la ruta del archivo seleccionado se mostrará en el cuadro de edición
  13. strFilePath = fileDlg. ObtenerNombreDeRuta ();
  14. SetDlgItemText (IDC_OPEN_EDIT, strFilePath);
  15. }
  16. }
  17. void CEexample17Dlg::OnBnClickedSaveButton ()
  18. {
  19. // TODO: Agregue su código de controlador de notificación de control aquí
  20. // establecer filtro
  21. TCHAR szFilter[] = _T( "Archivos de texto (*.txt)|*.txt|Archivos de Word (*.doc)|*.doc|todos los archivos (*.*)|*.*||" ) ;
  22. // Construir el diálogo de guardar archivo
  23. CFileDialog fileDlg (FALSO, _T( "doc" ), _T( "mi" ), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this ) ;
  24. CString strFilePath;
  25. // mostrar el cuadro de diálogo guardar archivo
  26. if (IDOK == fileDlg. DoModal ())
  27. {
  28. // Si se hace clic en el botón "Guardar" en el cuadro de diálogo del archivo, la ruta del archivo seleccionado se mostrará en el cuadro de edición
  29. strFilePath = fileDlg. ObtenerNombreDeRuta ();
  30. SetDlgItemText (IDC_SAVE_EDIT, strFilePath);
  31. }
  32. }

Al mostrar el contenido del cuadro de edición de arriba, Jipeimi usa la función SetDlgItemText de la API de Windows. Por supuesto, también puede asociar variables con el cuadro de edición        primero y luego usar la función CDialogEx
::UpdateData(), pero el pollo picoteando arroz es más acostumbrado a usar la función SetDlgItemText, que se siente más flexible.

       5. Ejecute el programa, haga clic en el botón "Abrir" en el cuadro de diálogo de resultados y el cuadro de diálogo para abrir el archivo se mostrará de la siguiente manera:

Después de hacer clic en el botón "Guardar", se muestra el cuadro de diálogo Guardar archivo:

Después de seleccionar la ruta del archivo tanto en el cuadro de diálogo Abrir archivo como en el cuadro de diálogo Guardar archivo, el cuadro de diálogo principal es el siguiente:

    En este punto, el cuadro de diálogo del archivo está terminado, ¿sigue siendo muy simple? Si olvida el significado de los parámetros del constructor de la clase de diálogo de archivo, puede volver al pollo picoteando arroz o buscarlo en MSDN.

 

 

cuadro de diálogo de fuente

 

       La función del cuadro de diálogo de fuente es seleccionar una fuente. También vemos a menudo. MFC utiliza la clase CFontDialog para encapsular todas las operaciones del cuadro de diálogo de fuentes. El cuadro de diálogo de fuentes también es un cuadro de diálogo modal .

       Constructor de la clase CFontDialog

       Primero comprendamos la clase CFontDialog. Su prototipo de constructor común es el siguiente:


  
  
   
   
  1. CFontDiálogo (
  2.    LPLOGFONT lplfInicial = NULO ,
  3.    DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
  4.    CDC* pdcImpresora = NULO ,
  5.    CWnd* pParentWnd = NULO
  6. );
  7.        Descripción de parámetros:
  8.        lplfInitial: Un puntero a los datos de la estructura LOGFONT, a través del cual se pueden configurar algunas características de la fuente.
  9.        dwFlags: especifica uno o más atributos de la fuente seleccionada, los detalles se pueden encontrar en MSDN.
  10.        pdcPrinter: un puntero a un contexto de dispositivo de impresión.
  11.        pParentWnd: un puntero a la ventana principal del cuadro de diálogo de fuente.

       El primer parámetro del constructor anterior es el puntero LOGFONT y la estructura LOGFONT contiene la mayoría de las características de la fuente, incluidos el alto, el ancho, la dirección, el nombre, etc. de la fuente. Aquí está la definición de esta estructura:


  
  
   
   
  1. tipo definitivamente estructura etiquetaLOGFONT {
  2.     LARGO lfHeight;
  3.     LARGO lfWidth;
  4.     Escape LARGO;
  5.     Orientación LARGA;
  6.     LARGO lfWeight;
  7.     BYTE cursiva;
  8.     BYTE lfSubrayado;
  9.     BYTE lfStrikeOut;
  10.     BYTE lfCharSet;
  11.     BYTE lfOutPrecisión;
  12.     BYTE lfClipPrecisión;
  13.     BYTE siCalidad;
  14.     BYTE lfPitchAndFamily;
  15.     TCHAR lfFaceName[LF_FACESIZE];
  16. } FUENTE DE LOG;

 

       Obtener la fuente seleccionada en el cuadro de diálogo de fuente

       Después de seleccionar una fuente en el cuadro de diálogo de fuentes, ¿cómo obtener la fuente seleccionada? Podemos obtener indirectamente el objeto CFont de la fuente seleccionada a través de la variable miembro m_cf de la clase CFontDialog. m_cf es una variable de tipo CHOOSEFONT, y la estructura CHOOSEFONT se define de la siguiente manera:


  
  
   
   
  1. estructura typedef {
  2.     DWORD lTamañoEstructura;
  3.     HWND hwndOwner;
  4.     HDC hDC;
  5.     LPLOGFONT lpLogFont;
  6.     INT iPointSize;
  7.     Banderas DWORD;
  8.     COLORREF rgbColores;
  9.     LPARAM lDatosCliente;
  10.     LPCFHOOKPROC lpfnHook;
  11.     LPCTSTR lpTemplateName;
  12.     HINSTANCIA hInstancia;
  13.     LPTSTR estilo lpsz;
  14.     PALABRA nTipo de fuente;
  15.     INT nTamañoMín;
  16.     INT nTamañoMáx.;
  17. } ELIGEFONT, *LPCHOOSEFONT;

       Hay un miembro lpLogFont en la estructura CHOOSEFON, que es un puntero a la variable de la estructura LOGFONT.Como se mencionó anteriormente, LOGFONT contiene características de fuente.Por ejemplo, podemos conocer el nombre de la fuente a través de LFFaceName de LOGFONT.

       Lo que finalmente queremos obtener es el objeto CFont de la fuente seleccionada ¿Cómo obtener el objeto CFont correspondiente con el LOGFONT de la fuente? Esto se puede lograr usando la función miembro CreateFontIndirect de la clase CFont. El prototipo de la función es el siguiente:

       BOOL CreateFontIndirect(const LOGFONT* lpLogFont );

       El parámetro es un tipo de puntero LOGFONT, podemos pasar el miembro lpLogFont de la variable miembro de clase CFontDialog m_cf, y luego podemos obtener el objeto CFont de la fuente seleccionada.

 

       Ejemplo de aplicación del cuadro de diálogo de fuente

       Pollo picoteando arroz será un ejemplo de un cuadro de diálogo de fuente para todos. Primero introduzca las funciones que se realizarán en este ejemplo, genere un cuadro de diálogo y coloque un botón de "selección de fuente" y un cuadro de edición en el cuadro de diálogo. Haga clic en el botón "Selección de fuente" para abrir el cuadro de diálogo de fuente. El cuadro de edición se usa para mostrar el nombre de la fuente seleccionada y la cadena del nombre de la fuente se muestra en la fuente seleccionada, por ejemplo, si se selecciona Arial, la cadena "宋体" se muestra en Arial en el cuadro de edición.

       Estos son los pasos para crear esta instancia:

       1. Cree un proyecto MFC basado en cuadros de diálogo denominado "Example18".

       2. En la plantilla del cuadro de diálogo principal generado automáticamente IDD_EXAMPLE18_DIALOG, elimine el cuadro de texto estático "POR HACER: Colocar controles de diálogo aquí". el cuadro de diálogo de fuente para seleccionar la fuente y, a continuación, agregue un cuadro de edición con el ID establecido en IDC_FONT_EDIT para mostrar la cadena de nombre de fuente en la fuente seleccionada.

       3. Agregue una variable miembro privada a la clase CExample18Dlg en Example18Dlg.h: CFont m_font;, que se utiliza para guardar la fuente seleccionada en el cuadro de edición.

       4. Agregue la función de procesamiento de mensajes de clic CExample18Dlg::OnBnClickedFontButton() para el botón IDC_FONT_BUTTON.

       5. Modifique la función de procesamiento de mensajes CExample18Dlg::OnBnClickedFontButton() de la siguiente manera:


  
  
   
   
  1. void CEexample18Dlg::OnBnClickedFontButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. CString strFontName; // nombre de la fuente
  5. FONDO DE INICIO DE SESIÓN si; // variable LOGFONT
  6. // Borrar todos los bytes de lf a cero
  7. conjunto de miembros (&lf, 0 , tamaño de (LOGFONT));
  8. // Establecer el nombre de la fuente del elemento en lf a "Arial"
  9. _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T( "Arial" ));
  10. // Construya el cuadro de diálogo de fuente, el nombre de fuente de selección inicial es "Song Ti"
  11. CFontDialog fontDlg (&lf) ;
  12. if (IDOK == fontDlg. DoModal ()) // mostrar diálogo de fuente
  13. {
  14. // Si m_font se ha asociado con un objeto de recurso de fuente, suéltelo
  15. si (m_fuente.m_hObjeto)
  16. {
  17. m_fuente. EliminarObjeto ();
  18. }
  19. // Crea una nueva fuente usando el LOGFONT de la fuente seleccionada
  20. m_fuente. CreateFontIndirect (fontDlg.m_cf.lpLogFont);
  21. // Obtener el puntero CWnd del cuadro de edición IDC_FONT_EDIT y establecer su fuente
  22. ObtenerDlgItem (IDC_FONT_EDIT)-> Establecer fuente (&m_fuente);
  23. // Si el usuario selecciona el botón Aceptar del cuadro de diálogo de fuente, obtenga el nombre de la fuente seleccionada y muéstrelo en el cuadro de edición
  24. strFontName = fontDlg.m_cf.lpLogFont->lfFaceName;
  25. SetDlgItemText (IDC_FONT_EDIT, strFontName);
  26. }
  27. }

       6. Finalmente, compile y ejecute el programa. Muestre el cuadro de diálogo de resultados, haga clic en el botón "Selección de fuente" y aparecerá el cuadro de diálogo de fuente, la selección predeterminada es "Song Ti", elegimos la fuente "Huawen Caiyun" y hacemos clic en "Aceptar", el cuadro de edición aparecerá mostrarse de la siguiente manera:

       Hasta ahora, hemos aprendido a usar el cuadro de diálogo de fuente, que es muy útil para controlar la fuente que se muestra en el desarrollo de la interfaz en el futuro. Si tiene alguna pregunta, deje un mensaje en Chicken Peck Rice.

 

 

cuadro de diálogo de color

 

       Todo el mundo está familiarizado con el cuadro de diálogo de color, podemos abrirlo para seleccionar el color deseado, en resumen, su función es seleccionar el color. La clase CColorDialog proporcionada en MFC encapsula todas las operaciones del cuadro de diálogo de color, a través del cual podemos mostrar el cuadro de diálogo de color y obtener el color seleccionado en el cuadro de diálogo de color. Al igual que el cuadro de diálogo de fuente, el cuadro de diálogo de color también es un cuadro de diálogo modal .

       Constructor de la clase CColorDialog

CColorDialog(
   COLORREF clrInit = 0,
   DWORD dwFlags = 0,
   CWnd* pParentWnd = NULL
);

       Descripción de parámetros:

       clrInit: el valor de color del color seleccionado por defecto, el tipo es COLORREF, que en realidad es un tipo largo sin firmar. Si no se establece su valor, el valor predeterminado es RGB (0,0,0), que es negro.

       Nota: RGB(r,g,b) es una macro que puede calcular valores de color. Los tres valores entre paréntesis son los valores de los componentes rojo, verde y azul respectivamente.

       dwFlags: valores de atributo para personalizar la funcionalidad y la apariencia del cuadro de diálogo de color. Los detalles se pueden encontrar en MSDN.

       pParentWnd: el puntero a la ventana principal del cuadro de diálogo de color.

       Obtener el valor de color seleccionado en el cuadro de diálogo de color

       Nuestro objetivo final al usar el cuadro de diálogo de color es obtener el valor de color seleccionado en el cuadro de diálogo de color. Por esta razón, la función miembro GetColor() de la clase CColorDialog puede cumplir muy bien con nuestros requisitos. El prototipo de la función GetColor() es:

       COLORREF ObtenerColor( ) const;

       Devuelve el valor COLORREF del color seleccionado.

       ¿Qué pasa si queremos obtener el valor de cada componente de R, G y B? Según el valor de color COLORREF obtenido por GetColor, se puede obtener utilizando las tres macros GetRValue, GetGValue y GetBValue. La sintaxis de GetRValue es:

       BYTE ObtenerValor(DWORD rgb);

       El parámetro rgb es el valor de color COLORREF y el valor devuelto es el valor del componente R. Las otras dos macros tienen una forma similar. Por ejemplo, si el COLORREF devuelto por la función GetColor() es 10000, entonces el valor del componente R es GetRValue(10000).

       Ejemplo de aplicación de cuadro de diálogo de color

       Aquí hay un pequeño ejemplo de un cuadro de diálogo de color para usted. Las funciones a realizar en este ejemplo se presentan brevemente: se genera un cuadro de diálogo y se colocan en el cuadro de diálogo un botón de "selección de color", cuatro cuadros de texto estáticos y cuatro cuadros de edición. Los cuatro cuadros de texto estáticos muestran Color:, R:, G: y B: respectivamente, y cada cuadro de texto estático va seguido de un cuadro de edición, que se utiliza para mostrar el valor de color seleccionado en el cuadro de diálogo de color y el componente rojo. del valor de color seleccionado, componente verde y componente azul.

       Estos son los pasos para crear una instancia:

       1. Cree un proyecto MFC basado en cuadros de diálogo denominado "Example19".

       2. En la plantilla del cuadro de diálogo principal generado automáticamente IDD_EXAMPLE19_DIALOG, elimine el cuadro de texto estático "POR HACER: Colocar controles de diálogo aquí". el cuadro de diálogo de color para seleccionar un color. Agregue cuatro cuadros de texto estáticos más, los ID son IDC_COLOR_STATIC, IDC_R_STATIC, IDC_G_STATIC, IDC_B_STATIC, el título se establece en "Color:", "R:", "G:", "B:", y luego, después de cada cuadro de texto estático, agregue un Los ID de los cuatro cuadros de edición son IDC_COLOR_EDIT, IDC_R_EDIT, IDC_G_EDIT e IDC_B_EDIT, que se utilizan para mostrar el valor de color seleccionado en el cuadro de diálogo de color y el componente rojo, el componente verde y el componente azul del valor de color seleccionado .

       3. Agregue una función de procesamiento de mensajes de clic CExample19Dlg::OnBnClickedColorButton() para el botón IDC_COLOR_BUTTON.

       4. Modifique la función de procesamiento de mensajes CExample19Dlg::OnBnClickedColorButton() de la siguiente manera:


  
  
   
   
  1. void CEexample19Dlg::OnBnClickedColorButton ()
  2. {
  3. // TODO: Agregue su código de controlador de notificación de control aquí
  4. COLORREF color = RGB ( 255 , 0 , 0 ); // El color inicial del diálogo de color es rojo
  5. CColorDialog colorDlg (color) ; // Construya el cuadro de diálogo de color y pase el valor de color inicial
  6. if (IDOK == selección de color. DoModal ()) // Mostrar el cuadro de diálogo de color y determinar si se hace clic en "Aceptar"
  7. {
  8. color = colorDlg. ObtenerColor (); // Obtener el valor de color seleccionado en el cuadro de diálogo de color
  9. SetDlgItemInt (IDC_COLOR_EDIT, color); // Mostrar el valor de color seleccionado en el cuadro de edición de Color
  10. SetDlgItemInt (IDC_R_EDIT, GetRValue (color)); // Mostrar el valor del componente R del color seleccionado en el cuadro de edición R
  11. SetDlgItemInt (IDC_G_EDIT, GetGValue (color)); // Mostrar el valor del componente G del color seleccionado en el cuadro de edición G
  12. SetDlgItemInt (IDC_B_EDIT, GetBValue (color)); // Mostrar el valor del componente B del color seleccionado en el cuadro de edición B
  13. }
  14. }

       5. Finalmente, compile y ejecute el programa, haga clic en el botón "selección de color" en el cuadro de diálogo de resultados y aparecerá el cuadro de diálogo de color. En el estado inicial, el cuadro de selección está en rojo y elegimos otro color.En este momento, el cuadro de diálogo de color es el siguiente:

Haga clic en "Aceptar" y los cuatro cuadros de edición en el cuadro de diálogo principal muestran respectivamente el valor de color seleccionado, el componente R, el componente G y el componente B:

 

 

 

Supongo que te gusta

Origin blog.csdn.net/XCJandLL/article/details/126109922
Recomendado
Clasificación