VISUAL C + +
1 VISUAL C++
CONCEPTO: Es un entorno integrado de desarrollo que permite la programación orientada a objetos (POO) conjuntamente con el sistema de desarrollo SDK (SDK-Kit de desarrollo de software) de Windows. Al ser un entono integrado visual C++ incluye, entre, otras, las siguientes herramientas de desarrollo: Editor de texto: Orientado a la codificación C/C++ (Resaltando palabras clave.) Compilador /Enlazador: Que acelera el proceso de construcción de los programas. Depurador: Que permite visualizar y modificar el contenido de las variables y áreas de memoria. Visor de Datos y Dependencias (Browser): Que permite fácilmente controlar dependencias y referencias a funcione, datos, clases, etc. El SDK de Windows es mas que un conjunto de funciones que añade además numerosas definiciones de tipos de datos nuevos para cualquier programador de C/C++ incluye la librería de clases MFC (Microsoft Foundation Classes) que permite crear y gestionar de manera intuitiva componentes típicos de Windows. LA LIBRERÍA DE CLASES MFC: Las MFC (Microsoft Foundation Classes) son un conjunto de clases creados por Microsoft destinadas a hacer más sencilla la programación bajo entorno Windows.Contine funciones para multitud de objetos del mundo Windows (bitmap, ventanas, comboboxes, etc.). PROGRAMACIÓN ORIENTADA A OBJETOS: La POO es una nueva filosofía de programación que se basa en la utilización de objetos. El objetivo de la POO no es sino la meta de cualquier modelo de programación estructurada convencional: “imponer” una serie de normas de desarrollo para que aseguren y faciliten la mantenibilidad y resuabilidad del código. MECANISMOS BÁSICOS DE LA POO: Objetos: un objeto es una entidad que tiene unos atributos particulares (datos) y unas formas de operar sobre ellos (lo métodos o funciones miembro). Es decir un objeto, por una René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
2
parte una serie de operaciones que definen su comportamiento, y una serie de variables manipuladas por esas funciones que definen su estado. Por ejemplo, una ventana de Windows contendrá operaciones como “maximizar”, y variables como “ancho” y “alto” de la ventana. Mensajes: en C++, un mensaje se corresponde con el nombre de uno de los métodos de un objeto. Cuando se pasa un mensaje a un objeto, este responde ejecutando el código de la función asociada. Método: un método (función miembro) se implementa de un objeto y determina como tiene que actuar el objeto cuando se produce el mensaje asociado. En C++ un método se corresponde con la definición de la función miembro del objeto. La estructura más interna de un objeto está oculta, de la manera que la única conexión con el exterior son los mensajes. Clases: una clase es la definición de un tipo de objeto. De esta manera, una clase “Empleado” representará todos los empleados de una empresa, mientras que un objeto de esta clase (también denominado instancia) representaría a uno de esos empleados en particular. PRINCIPALES CARACTERISTICAS DE LA POO: Abstracción: es el mecanismo de diseño en la POO. Nos permite extraer un conjunto de entidades de datos y comportamientos comunes para almacenarlos en clases. Encapsulamiento: Mediante esta técnica conseguiremos que cada clase sea una caja negra, de tal manera que los objetos de esta clase se puedan manipular como unidades básicas. Herencia: es el mecanismo que nos permite crear clases derivadas a partir de clases bases. Es decir, podríamos tener la clase “empleado” (clase base) y la clase “vendedor” derivada de la anterior. Polimorfismo: esta característica nos permite disponer de múltiples implementaciones de un mismo método de clases, dependiendo de la clase en la que se realice. Es decir podemos acceder a una variedad de métodos distintos (con el mismo nombre) mediante el mismo mecanismo de acceso.
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
3
CONCEPTO DE PROYECTO (WORKSPACE): En Visual C++ la construcción de cualquier tipo de programa se inscribe dentro del concepto de proyecto (Workspace). Un proyecto define los pasos a seguir para alcanzar la construcción de un objetivo (un programa, un DLL, etc.) en realidad es un concepto análogo a lo que se conoce como “makefile” en otros entornos típicos de desarrollo de C. En realidad Visual C++ genera para cada proyecto dos ficheros que lo definen, el fichero de Workspace (con extensión wsp) y un makefile (con extensión mak) estándar que permitiría la utilización del mismo proyecto en otro entorno distinto. TIPOS DE PROYECTOS: - Aplicación (.EXE) basada en la MFC (MFC Appwizar). - Librería de enlace dinámico (.DLL) basada en la MFC (MFC Appwizar). - Aplicación (.EXE) estándar para Windows (basada en el SDK). - Librería de enlace dinámico (.DLL) (basada en el SDK). - Aplicación (.EXE) modelo DOS (Console application). - Librería estática (.LIB). GENERADOR DE APLICACIONES: Visual C++, con la potencia de MFC se convierte en un generador de aplicaciones. Para ello utiliza dos herramientas integradas complementarías: - App Wizard: que es el generador de aplicaciones propiamente dicho. Con el podremos generar esqueletos de programa para Windows basados en la MFC. - Class Wizar: herramienta de mantenimiento de los programas generados por la anterior. Permite añadir o eliminar clases, modificar los comportamientos de las mismas, etc. VISOR DE PROYECTOS (WORKSPACE): Es una ventana a través de la que podemos visualizar el contenido de los proyectos, accedemos a la misma desde el menú “Ver “ y la opción “Proyecto”. Esta formada por 3 carpetas que nos permiten visualizarlos desde distintos puntos de vista: René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
-
4
Class View, o visor de Clases, representa el proyecto con las clases que lo componen. Desde aquí podremos añadir datos o funciones fácilmente. Resource View, o visor de Recursos, que permite añadir/modificar/eliminar recursos de la aplicación. File View, o Visor de Ficheros, que representa el proyecto mediante la lista de ficheros fuente que lo componen.
CLASE CDialog: es una clase base que permite visualizar cajas de dialogo. Hay dos tipos de ventanas de diálogo: con modo o modal y sin modo. Una ventana con modo exige que el usuario cierre para poder pasar a la otra ventana. Una ventana sin modo se contrapone a una ventana con modo; esto es, el usuario puede visualizar la caja de dialogo y retorna a la otra tarea sin cancelar o cerrar la caja de dialogo. EJEMPLO N°1: APLICACIÓN CAJA DE DIALOGO – CDIALOG: PASO 1: Creando un Proyecto: 1.Ingrese a Visual C++. 2.Vaya al menú File - New y en la solapa Proyects seleccione MFC AppWIzar (exe). 3.En Proyect Name escriba “Ejemplo N° 1”. En Location indicar el directorio donde se guardara la aplicación. Pulse OK. 4.El Step 1 permite identificar el modelo de ventana de nuestra aplicación: SDI (simple documento), MDI (multiples documentos) o basada en diálogo. Nosotros elegiremos Dialog Based y en What languaje… elegir Español España para determinar el idioma. 5.Pulse Next. Deje por defecto los Step 2, Step 3 y Step 4. 6.Pulsamos Finish y se muestra una lista con las características del armazón de aplicación que el asistente esta por hacer. OK y listo. El asistente nos generó la base de una aplicación que consta de una ventana con dos botones Aceptar y Cancelar, con un texto en el centro y además otra ventana (más pequeña, el Acerca de… René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
5
En la caja de diálogo creada por el asistente marcar con el Mouse el texto “A Hacer: ….” Y lo eliminamos presionando la tecla suprimir. PASO 2: Usando la Ventana Worksapace: Una ventana que tiene 3 solapas: Class View, Resource View y File View. 1.Class View: podremos ver las clases generadas por el asistente. 2.Resource View: Se podrá observar varias carpetas, en las cuales se accede al lugar donde se lleva a cabo el diseño de la aplicación. 3.File View: Presenta el proyecto mediante la lista de ficheros que lo componen. PASO 3: Anadir Controles a la Aplicación: 1.De la barra de herramientas Controls seleccionamos el control Button y lo colocamos el algún lugar del cuadro de diálogo. 2.Modificar las propiedades del control Button, para acceder a sus propiedades hacer clic con el botón derecho del Mouse encima del control Button y se mostrará su menú contextual y elegir Propiertes. 3.Modifique la propiedad Caption y escriba “Púlseme”; en la propiedad ID escriba IDC_BUTTON1 y luego cerrar la ventana o presionar Enter. PASO 4: Unir el Código a los Objetos: 1.Clic con el botón derecho del Mouse sobre el control al cual se quiere crear un manejador y seleccione Class Wizar. 2.En la lista Objets Ids selecione IDC_BUTTON1 y en la lista Messages seleccione Bn_Clicked. Luego pulse Add Fuction y aparecerá un mensaje alertando que esta por crear la función miembro OnButton1; presione OK. Pulse Edit Code para poder escribir el código. Entre las llaves tendremos que escribir nuestro código. 3.Escribamos entonces el código para mostrar nuestro mensaje: void CEjemploN1Dlg::OnButton1() René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + + { MessageBox("Hola MB_ICONINFORMATION); }
6 Mundo","VisualC++6",
PASO 5:Compilación y Ejecución. 1.Presione Ctrl. + F7 para compilar. 2.Presione Ctrl. + F5 para ejecutar. 3.Le mostrara un mensaje si desea guardar el archivo, hacer clic en Si. 4.En la ventana de diálogo que se muestra pulse el botón Pulseme aparecerá la caja de mensaje. 5.Presione Aceptar para cerrar el cuadro de mensaje. Nuevamente presione Aceptar para cerrar la ventana de diálogo principal. Luego cierre la ventana de código. PASO 6: Mostrando Texto en la Caja de Diálogo. 1.En el Toolbox el control Static Text y arrastrelo a la caja de diálogo principal. 2.Las propiedades para este control serán: − En General: ID = IDC_STATIC, Caption = Programación en Visul C++. − En las opciones marcar Visible y Tab Stop. − En Style: marcar la opción Border. − En Extended Style: Marcar la opción Modal Frame. 3.Presione Ctrl. + F5 para ejecutar. PASO 7: Aplicando un Gráfico. 1.Seleccionar Resource View en la ventana Workspace. 2.Clic con el botón derecho del Mouse sobre EjemploN1Resurces. 3.En el menú contextual seleccionar Insert. 4.En la ventana Insert Resources, seleccionar Bitmap y luego Import para elegir la pintura a agregar. 5.La ventana Import Resource muestra la imagen que se va a importar márquelo y presione Import, en la ventana que se muestra Aceptar.
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
7
6.De la caja de herramientas Toolbox escoja el control Picture y luego colóquelo en la ventana principal de diálogo. 7.Establezca sus propiedades para el control Picture, haciendo clic con el botón derecho del Mouse sobre el marco: − ID = IDC_STATIC. − Type = Bitmap. − Image = IDB_BITMAP1. 8.Luego ejecutar presionando Ctrl + F5..
CLASE CEDIT: La clase base CEdit proporciona la funcionalidad para un control edición de Windows. Un control Edit es una pequeña ventana rectangular en la que el usuario puede entrar texto. CLASE CSTRING: Un objeto CString tiene una cadena de caracteres de longitud variable. La clase CString provee muchas
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
8
funciones y operadores para manipular objetos CString utilizando una sintaxis similar empleada en el lenguaje Basic. EJEMPLO N° 2: APLICACIÓN CUADRO DE TEXTO: PASO 1: Creando un Proyecto. 1.Ingrese a Visul C++. 2.Vaya al menú File – New y en la solapa Proyect seleccione MFC App Wizard (exe). 3.En Proyect Name escriba Ejemplo N° 2. En location indicar el directorio donde se guardara la aplicación. Pulse OK. 4.En le siguiente paso seleccione Dialog Based, en la lista What languaje... elegir Español España. 5.Pulse Next. Deje como están por defecto los Step 1, Step 2, Step 3 y Step 4. 6.Pulsamos Finish y se muestra un listado con las características del armazón de aplicación que el asistente esta por hacer, OK y listo. PASO 2: Añadir controles a la aplicación. 1.Agregue desde la caja de controles, un cuadro de edición (Edit Box). 2.Determinar sus propiedades. ID = IDC_EDIT1. PASO 3: Unir el Código a los Objetos. 1.Clic con el botón derecho del Mouse sobre el control Edit y seleccionar Class Wizard. 2.En la lista Object IDs seleccionar IDC_EDIT1, en la lista Messages seleccionar EN_CHANGE, luego clic en el botón Add Function y clic en OK. Presione el botón Edit Code. Escriba el siguiente código: void CejamploN2Dlg::OnChangeEdit1() { CEdit* edTexto; CString strDato; edTexto=(CEdit*) GetDlgItem(IDC_EDIT1); edTexto->GetWindowText (strDato); SetWindowText(strDato); René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
9
} 3.Presione Ctrl. + F5 para ejecutar la aplicación; ubicarse en el cuadro de edición y escribir un texto y se mostrara el texto como título de la ventana de diálogo. PASO 4: Variables Miembro. 1.Agregar al cuadro de diálogo un control Button. 2.Determinar sus propiedades: ID = IDC_BUTTON1. Caption = Regresar. 3.Crearemos una variable miembro para el cuadro de edición; para esto acceder a Class Wizard, seleccionar la solapa Members Variables. 4.En la lista Controls IDs seleccionar IDC_EDIT1, clic en el botón Add Variable. 5.En esta ventana en Member variable name ingrese m_strDato, category Value y variable type CString. Acepte esta ventana. Y acepte la ventana Class Wizard. 6.Seleccione el botón Regresar y acceda a Class Wizard. Seleccione la solapa Message Maps, en la lista Object’s ID seleccione IDC_BUTTON1, en la lista Messages seleccionar BN_CLICKED. Presione Add Function y OK. Presione Edit Code. Escriba el siguiente código: void CEjamploN3Dlg::OnButton1() { UpdateData(TRUE); if (m_strDato.IsEmpty()==FALSE) { MessageBox("Ahora se invertirá:"+m_strDato); m_strDato.MakeReverse(); UpdateData(FALSE); SetWindowText(m_strDato); } } PASO 5: Compilación y Ejecución. 1.Presionar Ctrl. + F7 para compilar. 2.Presionar Ctrl. + F5 par ejecutar. René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
10
3.En la ventan de diálogo que se muestra digite el texto “Visual C++ 6” en el cuadro de texto. 4.Ahora presione el botón Regresar para invertir el texto ingresado. Aparecerá el cuadro de mensaje. Presione OK. 5.La ventana de diálogo mostrará el texto invertido en la caja de texto.
CLASE CBUTTON: La clase CButton proporciona la funcionalidad para los controles Button de Windows. Un control Button es una pequeña ventana rectangular que puede ser activada y desactivada haciendo clic sobre el control. Un control Button puede usarse solos o en grupos y puede aparecer con sin etiqueta de texto. Típicamente se consideran controles Button: botones de pulsación, casillas de verificación y botones de opción. EJEMPLO N° 3: APLICACIÓN BUTTON: PASO 1: Creando un Proyecto. 1.Crear una aplicación MFC basada en dialogo, tal como se hizo en los ejemplos anteriores y póngale como Project Name Ejemplo N° 5. 2.Seleccione File view en la ventana Workspace. Doble clic en el archivo Ejemplo N° 5Dlg.cpp de la carpeta Source file. 3.Dentro del archivo Ejemplo N° 5Dlg.cpp, declare los objetos de la clase base Cbutton, como muestra el código siguiente: René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
11
// Ejemplo N° 3Dlg.cpp : implementation file // #include "stdafx.h" #include "Ejemplo N° 3.h" : : #endif CButton myButton1, myButton2, myButton3, myButton4, myButton5, myButton6, myButton7; //////// // CAboutDlg dialog used for App About 4.Digite el código siguiente dentro de la función OnInitDialog(): BOOL CEjemploN3Dlg::OnInitDialog() { CDialog::OnInitDialog(); : : // TODO: Add extra initialization here //Create un push button. myButton1.Create(_T("Push Button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30),this,1); //Create un radio button. myButton2.Create(_T("Radio Button"), WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, CRect(10,40,200,70),this,2); //Create un DEFPUSHBUTTON. myButton7.Create(_T("DEFPUSHBUTTON"), WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, CRect(150,40,300,70),this,3); //Create un auto 3-state button. myButton3.Create(_T("3-state button"), WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, CRect(10,70,200,100),this,4); //Create un auto check box. myButton4.Create(_T("Auto check box"), WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
12
CRect(10,100,100,130),this,5); //Create un GROUPBOX. myButton5.Create(_T("GROUPBOX"), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, CRect(10,140,100,170),this,6); //Create un LEFTTEXT. myButton6.Create(_T("LEFTTEXT"), WS_CHILD|WS_VISIBLE|BS_LEFTTEXT, CRect(10,180,200,240),this,7); return TRUE; // return TRUE unless you set the focus to a control } PASO 2: Compilar y Ejecutar: 1.Presionar las teclas Ctrl. + F7 para compilar. 2.Presionar las teclas Ctrl.+ F5 para ejecutar.
EJEMPLO N° 4: DESARROLLO DE LA APLICACIÓN VEHÍCULO: PASO 1: Creando un Proyecto: 1.Crar una aplicación basada en diálogo, tal como se hizo en los ejemplos anteriores y póngale como Project Name Ejemplo N° 4. René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
13
2.Diseñe la ventana de diálogo como se muestra a continuación:
PASO 2: Establecer sus propiedades y variables miembro: 1.Seleccione un Group Box de la ventana de controles. Escriba Marcas en la propiedad Caption. Luego coloque 3 Radio Button dentro del Group Box: - Radio Button1: ID = IDC_RADIO1, caption = BMW, tildar Group - Radio Button2: ID = IDC_RADIO2, caption = Audi. - Radio Button3: ID =IDC_RADIO2, caption = Opel. Se tilda Group sólo en el primero para indicar que a partir de ese control en adelante, estarán relacionados los botones de opción hasta encontrar un nuevo control con Group tildado. 2.Agregue otro Group Box a la derecha de Marca con la propiedad caption =Tipos. - Luego coloque tres radio buttons dentro del Group Box. - Radio Button4: ID = IDC_RADIO4, caption = SEDAN, tildar Group y en Style tildar Push Like. - Radio Button5: ID = IDC_RADIO5, caption = Cupe y en Style tildar Push Like.
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
14
- Radio Button6: ID = IDC_RADIO6, caption = Break y en Style tildar Push Like. 3.Por último coloque 2 Check Box a la derecha de Tipo. - El primero: ID = IDC_CHECK1, caption = Con Aire y Group tildado da por finalizado el grupo anterior.. - El segundo: ID = IDC_CHECK2 y en caption = Con CD. PASO 3: Agregar Variables Miembro. 1.Diseñada la ventana y los controles con sus respectivas propiedades especificadas; hay que crear las variables asociadas a los controles que manipularán los datos. - Seleccione el primer radio button del grupo Marca, (BWM) y acceda a Class Wizars. - En class wizars vaya a la solapa Member variables y seleccione IDC_RADIO1. - Presione Add variable; aparecera la ventana Add Member Variable. Alli ingrese m_Marca como member variable, seleccione Value como Category y en variable Type = int. - Hagamos lo mismo para el primer radio button del grupo Tipo (Sedán) y llame a la variable m_Tipo. .2Debemos asignarle a las variables recién creadas un valor inicial, para que así, al iniciar la aplicación, estén seleccionados por defecto los primeros radio buttons de cada grupo. Esto se hace editando el constructor de la clase CEjemploN4Dlg. - En la ventana workspace, seleccione la solapa Class View. - Expanda la rama de la clase CEjemploN4Dlg. - Haga doble clic en la primera función: CEjemploN4Dlg(CWnd*pParent=NULL). - Verá que las variables creadas tienen el valor –1, cámbielo por 0. esto establece como seleccionada la primera opción, BMW en el primer grupo y Sedan en el segundo. CEjemploN4Dlg::CEjemploN4Dlg(CWnd* pParent /*=NULL*/) : CDialog(CEjemploN4Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CEjemploN4Dlg) m_Marca = 0; m_Tipo = 0; René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
15
//}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } 3.Escribir el código del botón Aceptar puede acceder al mismo haciendo doble clic sobre el botón: void CEjemploN4Dlg::OnOK() { // TODO: Add extra validation here CDialog::OnOK(); CWnd*wndAuto; CWnd*wndTipo; CString strMensa; CString strAuto, strTipo, strExtra; CButton*bAire; CButton*bCD; //Convierto los dos Check que originalmente son de //tipo CWnd a tipo CButton para poder hacer uso de //las funciones CButton. bAire=(CButton*)GetDlgItem(IDC_CHECK1); bCD=(CButton*)GetDlgItem(IDC_CHECK2); strExtra= " -"; if (bAire->GetCheck() && bCD->GetCheck()) strExtra="con Aire y CD."; else if (bAire->GetCheck() && !bCD->GetCheck()) strExtra="con Aire."; else if (!bAire->GetCheck() && bCD->GetCheck()) strExtra="con CD."; UpdateData(); wndAuto=GetDlgItem(IDC_RADIO1 + m_Marca); wndTipo=GetDlgItem(IDC_RADIO4 + m_Tipo); wndAuto->GetWindowText(strAuto); wndTipo->GetWindowText(strTipo); strMensa="Su auto es un/a: "+strTipo+" "+strAuto+" "+strExtra; René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
16
MessageBox(strMensa); } PASO 4: Compilar y ejecutar. 1.Presionar las teclas Ctrl. + F7 para compilar y Ctrl. +F5 para ejecutar. 2.En la ventana de dialogo principal seleccionar BMW como Marca luego elegir Sedam como Tipo y seleccione los check box Con Aire y Con CD. Presione Aceptar. 3.La ventana de mensaje muestra las opciones elegidas en la ventana de dialogo principal. CLASE CLISTBOX: La clase CListBox define controles llamados listas. Un control lista es una ventana hija, rectangular, que visualiza una lista de elementos. El usuario puede añadir o suprimir elementos de la lista, los cuales forman una columna desplazable dentro del rectángulo. EJEMPLO N° 5: APLICACIÓN CONTROL LISTA. PASO 1: Crando un Proyecto: 1.Crear una aplicación MFC basada en diálogo, pongale “Ejemplo N° 5” como Proyect Name. 2.Diseñe la ventana como se muestra a continuación:
PASO 2: Propiedades y Variables Miembro: René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
17
1.Lista 1: Como ID = IDC_LIST1, en Style desmarque la opción Sort, pues en este caso no pretendemos que la lista se ordene automáticamente. Presionar Ctrl + W para acceder a Class Wizard vaya a la solapa Member Variables, marque IDC_LIST1 y presione el botón Add Variable aparecera la ventana Add Member Variable, como name escriba m_lstNumeros, como category seleccione Control y variable type Clist Box. 2.Lista 2: Como ID = IDC_LIST2, en Style desmarque la opción Sort, en extended style marque Modal Frame. Acceda a Class Wizard: como name escriba m_lstPares, como category seleccióne Control y variable type Clist Box. 3.Button 1: ID= IDC_BUTTON1 y caption = >>. 4.Button 2: ID = IDC_BUTTON2 y caption = >. 5.Edit 1: ID=IDC_EDIT1. Variable miembro: como name = m_Cant, category = Value y type = int. 6.Button 3: ID = IDC_BUTTON3 y caption = Cargar. 7.Static Text: Caption = Digite la cantidad de números. PASO 3: Introduciendo Código. 1.Primero codificaremos el botón Aceptar; haciendo doble clic creamos la función OnOk, escriba el código siguiente: void CEjemploN5Dlg::OnOK() { // TODO: Add extra validation here if(MessageBox("¿Desea Salir?","Salir", MB_ICONQUESTION + MB_YESNO)==IDYES) CDialog::OnOK(); } 2.Seleccione el botón Cargar, haga doble clic y se creará las función OnButton3(), escriba el código siguiente: void CEjemploN5Dlg::OnButton3() { // TODO: Add your control notification handler code here CString c;//Declara la “c” de tipo string. int i;//Declara la variable “i” de tipo entero. UpdateData(TRUE);//Pasa el contenido del cuadro de edición a la variable miembro. René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
18
m_lstNumeros.ResetContent();//Verifica el contenido de la variable for (i=1;i<=m_Cant;i++) { c.Format("%s%i",c,i);//formatea i como string m_lstNumeros.AddString(c);//lo agrego a la lista c=""; } } 3.Seleccione la lista 1, haga doble clic para crear la función OnSelchangeList1(), escribir su código: void CEjemploN5Dlg::OnSelchangeList1() { // TODO: Add your control notification handler code here CString strTexto; m_lstNumeros.GetText(m_lstNumeros.GetCurSel(), strTexto); MessageBox(strTexto); } Al tener cargada la lista 1, ahora vamos a escribir el código que al seleccionar un elemento de la lista lo muestre en un mensaje. 4.Escribiremos ahora el código para el botón IDC_BUTTON1, doble clic en botón para crear la función OnButton1() y escribir su código: void CEjemploN5Dlg::OnButton1() { // TODO: Add your control notification handler code here int i,n,ce; CString strC; ce=m_lstNumeros.GetCount(); if(ce>0) for(i=0;i
CEO “PERÚ”
VISUAL C + +
19
{ m_lstPares.AddString(strC);//lo
otra }
paso
a
la
}
} 5.Escribir el código para el botón IDC_BUTTO2, hacer doble clic en el botón para crear la función OnButton2(), luego escribir su código: void CEjemploN5Dlg::OnButton2() { // TODO: Add your control notification handler code here int n; CString strC; m_lstNumeros.GetText(m_lstNumeros.GetCurSel(), strC); n=atoi(strC); if(n%2==0) m_lstPares.AddString(strC); } PASO 3: Compilar y ejecutar. 1.Ingrese un valor numérico mayor a 0 en el cuadro de edición , luego presionar el botón Cargar y se cargara la lista IDC_LIST1 con los números naturales menores al contenido del cuadro de edición. 2.Ya tenemos la lista 1 cargada, ahora al seleccionar un elemento de la lista 1 se muestra un mensaje con el elemento seleccionado. Presionar OK en el mensaje mostrado. 3.Ahora haga clic en el botón IDC_BUTTON1 para pasar los elementos pares de la lista 1 a la lista 2. 4.A continuación haga clic en el botón IDC_BUTTON2, si el elemento seleccionado en la lista 1 es par se pasará a la lista 2. EJEMPLO N° 6: LISTOFCOUNTRIES:
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
20
PASO 1:Creando un Proyecto. 1.Crear una aplicación MFC basada en diálogo, póngale como Proyect Name Ejemplo N° 6. 2.Diseñe la ventana de diálogo como se muestra a continuación:
PASO 2: Creando Variables Miembro. 1.ID = IDC_LIST1: Como name = m_ListCountries, category = Control y type = ClistBox. 2.ID = IDC_EDIT1: Como name = m_ListResult, category = Value y type = CString. 3.ID = IDC_EDIT2: Como name = m_Transfer, category = Value y type = CString. 4.ID = IDC_EDIT3: Como name = m_Add, category = Value y type =CString. 5.ID = IDC_EDIT4: Como name = m_Insert3, category = Value y type = CString. 6.ID = IDC_EDIT5: Como name = m_InsertItem, category = Value y type = CString. PASO 3: Adicionando Elementos a una Lista. 1.En la función OnInitDialog() de la ventana de diálogo inicializar la lista como sigue, haciendo doble clic en la ventana de dialogo, para acceder a su código: BOOL CEjemploN6Dlg::OnInitDialog() René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
21
{ CDialog::OnInitDialog(); : : // TODO: Add extra initialization here m_ListCountries.AddString("Afganistan"); m_ListCountries.AddString("Costa Rica"); m_ListCountries.AddString("España"); m_ListCountries.AddString("Angola"); m_ListCountries.AddString("Rusia"); m_ListCountries.AddString("Canada"); m_ListCountries.AddString("Grecia"); m_ListCountries.AddString("Austria"); m_ListCountries.AddString("Brasil"); m_ListCountries.AddString("Argentina"); m_ListCountries.SetCurSel(3); return TRUE; // return TRUE unless you set the focus to a control } PASO 4: Transferir un Elemento hacia un Edit Box después de hacer doble clic en la Lista. 1.Acceder al class wizard. 2.Clic en la solapa Message Maps, en la lista Object IDs seleccionar IDC_LIST1, el al lista Messages seleccionar LBN_DBLCLK, luego doble clic y OK. 3.Clic en el botón Edit Code y escriba el código siguiente: void CEjemploN6Dlg::OnDblclkList1() { // TODO: Add your control notification handler code here m_ListCountries.GetText(m_ListCountries.GetCurSel (),m_ListResult); UpdateData(FALSE); } PASO 5: Transferir el contenido de un Edit Box a un List Box. Hacer doble clic en IDC_BUTTON1, para escribir su código: René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
22
void CEjemploN6Dlg::OnButton1() { // TODO: Add your control notification handler code here m_ListCountries.GetText(m_ListCountries.GetCurSel( ),m_Transfer); UpdateData(FALSE); } PASO 6: Agregar el contenido de un Edit Box a un List Box. Hacer doble clic en el IDC_BUTTON2(), para escribir su código: void CEjemploN6Dlg::OnButton2() { // TODO: Add your control notification handler code here UpdateData(); m_ListCountries.AddString(m_Add); UpdateData(FALSE); } PASO 7: Agregar un elemento en una posición especifica en la lista. Hacer doble clic en el IDC_BUTTON3(), para escribir su código: void CEjemploN6Dlg::OnButton3() { // TODO: Add your control notification handler code here UpdateData(); m_ListCountries.InsertString(m_ListCountries.SetCurS el(3),m_Insert3); UpdateData(FALSE); } PASO 8: Insertar un elemento arriba del elemento seleccionado en la lista. Hacer doble clic en el IDC_BUTTON4(), para escribir su código: void CEjemploN6Dlg::OnButton4() { // TODO: Add your control notification handler code here UpdateData(); René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
23
m_ListCountries.InsertString(m_ListCountries.GetCurSel( ),m_InsertItem); UpdateData(FALSE); } PASO 9: Borrar un elemento especifico de la lista. Hacer doble clic en el IDC_BUTTON5(), para escribir su código: void CEjemploN6Dlg::OnButton5() { // TODO: Add your control notification handler code here m_ListCountries.DeleteString(4); UpdateData(FALSE); } PASO 10: Borrar un elemento seleccionado de la lista. Hacer doble clic en el IDC_BUTTON6(), para escribir su código: void CEjemploN6Dlg::OnButton6() { // TODO: Add your control notification handler code here m_ListCountries.DeleteString(m_ListCountries.Get CurSel()); UpdateData(FALSE); } PASO 11: Limpiar la lista. Hacer doble clic en el IDC_BUTTON7(), para escribir su código: void CEjemploN6Dlg::OnButton7() { // TODO: Add your control notification handler code here m_ListCountries.ResetContent(); } CLASE CRICHEDITVIEW: La clase CRichEditView proporciona el soporte para crear un “rich edit control”. Un “rich edit control” es una vebntana en la cual el usuario puede entrar y editar texto. JEMPLO N° 7: APLICACIÓN RICH TEXT: René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
24
PASO 1: Creando un Proyecto. 1.Ingresar al Visual C++. 2.Vaya al menú File - New y en la solapa Proyect seleccione App Wizard (exe). 3.En proyect name escriba Ejemplo N° 7, en location indicar la dirección donde se guardara la aplicación, luego OK. 4.En el Step 1 del asistente seleccionar la opción Múltiple Documents. 5.Pulse Next. Deje por defecto los Step 1, sep 2, sep 3, sep 4 y sep 5. 6.El el Step 6: determinar lo siguiente: − Base Class = CRichEditView. − Header File = ExoView.h − Implementation File = ExoView.cpp 7.Pulse Finish y Aceptar el soporte OLE que aparece en el cuadro de mensaje. 8.Luego aceptar el listado con las características de nuestras aplicación. 9.En el menú principal del Visual C: − Seleccione el menú Build, elegir Set Active Configuration. − En la ventana que se muestra seleccionar Ejemplo N 7 – Win 32 Release y clic en OK. PASO 2: Agregando Recursos. 1.Modificar el IDR_RICHTYPE: − Seleccione Resource View en la ventana Workspace. − Expanda la carpeta Menu. − Doble clic en IDR_RICHTYPE. En la ventana que se muestra al lado derecho agregar el menú Formato entre los menús Ver y Ventana. Mueva el rectángulo en blanco entre los menús Ver y Ventana luego clic con el botón derecho del mouse y entre a sus propiedades y en la propiedad caption escribir &Formato. − Debajo del menú Formato cree un submenú con caption = &Fuente.
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
25
2.En la ventana Workspace, clic en la solapa ResorceView: − Expandir la carpeta Toolbar. − Doble clic en IDR_MAINFRAME. − Cree los botones siguientes con su identificador correspondiente:
N: ID = ID_CHAR_BOLD K: ID = ID_CHAR_ITALIC S: ID = ID_CHAR_UNDERLINE. T: ID = ID_CHAR_STRIKEOUT. : ID = ID_PARA_LEFT. : ID = ID_PARA_CENTER. : ID = ID_PARA_RIGHT. PASO 3: Agregando Código. 1.En la ventana Workspace, clic en la solapa FileView: − Expandir Ejemplo N° 7 Files. − Expandir Source Files. − Doble clic en ExoView.cpp. 2.Realizar los siguientes cambios : void CEjemploN7View::OnInitialUpdate() { CRichEditView::OnInitialUpdate(); CRichEditCtrl&rCtrl=GetRichEditCtrl(); CHARFORMAT cfm; cfm.cbSize=sizeof(cfm); cfm.dwMask=CFM_SIZE|CFM_ITALIC|CFM_BOLD| CFM_UNDERLINE|CFM_STRIKEOUT|CFM_PROTECTED| CFM_FACE; cfm.dwEffects=0; René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
26
cfm.yHeight=240; strcpy(cfm.szFaceName,"Times New Roman"); rCtrl.SetDefaultCharFormat(cfm); // Set the printing margins (720 twips = 1/2 inch). SetMargins(CRect(720, 720, 720, 720)); } 3.En la ventana workspace: − Expanda la carpeta Header Files. − Doble clic en ExoView.h − Escriba el siguiente código. // Implementation public: : : protected: BOOL bBold; BOOL bItalic; BOOL bUnderline; BOOL bStrikeout; enum JUST {LEFT=0,CENTER,RIGHT} m_Justify; // Generated message map functions 4.En la ventana workspace: − Seleccione la solapa ClassView. − Expanda la clase CEjemploN7View. − Seleccione el constructor CEjemploN7View(). − Escribir el siguiente código: // CEjemploN7View construction/destruction CEjemploN7View::CEjemploN10View() { // TODO: add construction code here m_Justify=LEFT; bBold=FALSE; bItalic=FALSE; bUnderline=FALSE; bStrikeout=FALSE; } René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
27
5.Ingresar a la ventana ClassWizard, presionar Ctrl. + W. − En la lista combinada Class Name elegir CEjemploN7View. − En la lista Object IDs seleccionar ID_CHAR_BOLD. − En la lista Messages seleccionar COMMAND, luego clic en el botón Add Function y OK. − Clic en el botón Edit Code y escribir el siguiente código: void CEjemploN7View::OnCharBold() { // TODO: Add your command handler code here bBold=!bBold; OnCharEffect(CFM_BOLD,CFE_BOLD); } 6.Ingrese a la ventana Class Wizard: − En la lista combinada Class Name elegir CEjemploN7View. − En la lista Object IDs seleccionar ID_CHAR_BOLD. − En la lista Messages seleccionar UPDATE_COMMAND_UI, luego clic en el botón Add Function y OK. − Clic en el botón Edit Code y escribir el código siguiente: void CEjemploN7View::OnUpdateCharBold(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(bBold); } 7.Repetir los puntos 5 y 6 para ID_CHAR_ITALIC: − Escriba el código siguiente para la función COMMAND: void CEjemploN7View::OnCharItalic() { // TODO: Add your command handler code here bItalic=!bItalic; OnCharEffect(CFM_ITALIC,CFE_ITALIC); } − Escriba el código siguiente para la función UPDATE_COMMAND_UI: void CEjemploN7View::OnUpdateCharItalic(CCmdUI* pCmdUI) { René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
}
28
// TODO: Add your command update UI handler code here pCmdUI->SetCheck(bItalic);
8.Repetir los puntos 5 y 6 para ID_CHAR_UNDERLINE: − Escriba el código siguiente para la función COMMAND: void CEjemploN7View::OnCharUnderline() { // TODO: Add your command handler code here bUnderline=!bUnderline; OnCharEffect(CFM_UNDERLINE,CFE_UNDERLINE); } − Escriba el código siguiente para la función UPDATE_COMMAND_UI: void CEjemploN7View::OnUpdateCharUnderline(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(bUnderline); } 9.Repetir los puntos 5 y 6 para ID_CHAR_STRIKEOUT: − Escriba el código siguiente para la función COMMAND: void CEjemploN7View::OnCharStrikeout() { // TODO: Add your command handler code here bStrikeout=!bStrikeout; OnCharEffect(CFM_STRIKEOUT,CFE_STRIKEOUT); } − Escriba el código siguiente para la función UPDATE_COMMAND_UI: void CEjemploN7View::OnUpdateCharStrikeout(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(bStrikeout); } René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
29
10.Repetir los puntos 5 y 6 para ID_PARA_LEFT: − Escriba el código siguiente para la función COMMAND: void CEjemploN7View::OnParaLeft() { // TODO: Add your command handler code here m_Justify=LEFT; OnParaAlign(PFA_LEFT); } − Escriba el código siguiente para la función UPDATE_COMMAND_UI: void CEjemploN7View::OnUpdateParaLeft(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_Justify==LEFT); } 11.Repetir los puntos 5 y 6 para ID_PARA_RIGHT: − Escriba el código siguiente para la función COMMAND: void CEjemploN7View::OnParaRight() { // TODO: Add your command handler code here m_Justify=RIGHT; OnParaAlign(PFA_RIGHT); } − Escriba el código siguiente para la función UPDATE_COMMAND_UI: void CEjemploN7View::OnUpdateParaRight(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_Justify==RIGHT); } 12.Repetir los puntos 5 y 6 para ID_PARA_CENTER: − Escriba el código siguiente para la función COMMAND: René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
30
void CEjemploN7View::OnParaCenter() { // TODO: Add your command handler code here m_Justify=CENTER; OnParaAlign(PFA_CENTER); } − Escriba el código siguiente para la función UPDATE_COMMAND_UI: void CEjemploN7View::OnUpdateParaCenter(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetRadio(m_Justify==CENTER); } PASO 4: Compilar y Ejecutar. EJEMPLO N° 8: APLICACIÓN ARCHIVOS. PASO 1: 1.Crear una aplicación basada en diálogo. 2. Escribir como Project Name Ejemplo N° 8. 3.Diseñar la ventana tal como se muestra a continuación
PASO 2: Propiedades y variables miembro. 1.ID = IDC_EDIT1: Como name = m_strApellido, type = CString. 2.ID = IDC_EDIT2: Como name = m_strNombre, type = CString. René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
31
3.ID = IDC_EDIT3: Como name = m_Edad, type = int. Propiedades en Style tildar Number, en extended style tildar Right aligned text. 4.ID = IDC_BUTTON2: Tildar la propiedad Default Button en Style. 5.ACEPTAR: Quitar el tilde a la propiedad Default Button. PASO 3: Modificar el código del botón Cancel, haciendo doble clic en botón. void CEjemploN8Dlg::OnCancel() { // TODO: Add extra cleanup here }
//CDialog::OnCancel();
PASO 4: Aplicando código. 1.Código del archivo EjemploN8Dlg.h: // CEjemploN8Dlg dialog class CEjemploN8Dlg : public CDialog { private: struct Persona { char Apellido[20]; char Nombre[20]; int edad; }; // Construction 2.Código del botón Guardar Datos: void CEjemploN8Dlg::OnButton2() { // TODO: Add your control notification handler code here struct Persona p; CFile f; int cr; CString nr; René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
32
if(MessageBox("¿Guardar estos datos?","Guardar",MB_YESNO| MB_ICONQUESTION)==IDYES) { UpdateData(TRUE); strcpy(p.Apellido,m_strApellido); strcpy(p.Nombre,m_strNombre); p.edad=m_Edad; f.Open("datos.dat",CFile::modeCreate| CFile::modeNoTruncate| CFile::modeWrite); f.SeekToEnd(); f.Write(&p,sizeof(p)); m_strApellido.Empty(); m_strNombre.Empty(); m_Edad=0; UpdateData(FALSE); AfxMessageBox("Datos guardados con éxito"); CWnd*pApe=(CWnd*)GetDlgItem(IDC_EDIT1); pApe->SetFocus(); cr=f.GetLength()/sizeof(p); nr.Format("Cantidad de registros: %i",cr); SetWindowText(nr); f.Close(); } } 3.Código del botón Ver Datos: void CEjemploN8Dlg::OnButton3() { // TODO: Add your control notification handler code here struct Persona p; CFile f; int pos; f.Open("datos.dat",CFile::modeCreate| CFile::modeNoTruncate|CFile::modeRead); if(pos = f.GetLength()) { René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
33
f.Seek(pos,CFile::begin); f.Read(&p,sizeof(p)); m_strApellido=p.Apellido; m_strNombre=p.Nombre; m_Edad=p.edad; UpdateData(FALSE);
} f.Close(); }
4.Código del botón Limpiar: void CEjemploN8Dlg::OnButton1() { // TODO: Add your control notification handler code here m_strApellido.Empty(); m_strNombre.Empty(); m_Edad=0; UpdateData(FALSE); } PASO 5: Compilar y Ejecutar. CLASE CPEN: La clase CPen permite definir la pluma a utilizar con las funciones de dibujo. Esta herramienta afecta la forma en la que son dibujadas. Las líneas pueden ser sólidas, líneas discontinuas, etc. También puede afectarlos bordes de las figuras cerradas ya sean rectángulos, elipses, etc. CLASE CBRUSH: La clase CBrush permite definir el pincel a utilizar con las funciones de dibujo. Esta herramienta afecta a la forma en la que es pintado el interior de las figuras cerradas. CLASE CDC: La clase CDC define una clase de objetos llamados “contextos de dispositivo”. El objeto CDC contiene funciones miembros para trabajar con un contexto dispositivo, tal como una pantalla o impresora, así como funciones para trabajar con un contexto pantalla asociado con el área del cliente. Para crear un DC, primero se crea un objeto de la clase base CDC y luego René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + + se llama las dispositivos.
34 funciones
miembros
que
usan
contextos
EJEMPLO N° 9: DESARROLLO DE LA APLICACIÓN DIBUJO DE OBJETOS. PASO 1: Creando un Proyecto. 1.Ingrese a Visual C++. 2.Vaya al menú File – New y en la solapa Project seleccione MFC App Wizard (exe). 3.Como Project Name escriba Ejemplo N° 9, en location indicar el directorio donde se guardará la aplicación. Pulse OK. 4.En el Step 1 seleccionar la opción Single Document. 5.Deje por defecto los pasos 2, 3, 4, 5 y 6. 6.Luego clic enel botón Finish, OK y listo. PASO 2: Introduciendo Código. 1.En la ventana Workspace seleccione la solapa Class View. Expanda la clase CEjemploN9View, elija la función OnDraw(CDC*pDC). 2.Digite el código para la función OnDraw(CDC*pDC): void CEjemploN14View::OnDraw(CDC* pDC) { CEjemploN14Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(200,200,"Hola Mundo"); } 3.Ejecutar el programa. PASO 3: Graficar una Línea: 1.Adicionar el código a la función OnDraw(CDC*pDC): //Dibuja una línea Diagonal pDC->LineTo(100,100); pDC->TextOut(60,20,"<-Línea Diagonal"); 2.Ejecutar el programa.
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
35
PASO 4: Graficar una Elipse: 1.Adicionar el código a la función OnDraw(CDC*pDC): //Dibuja una Elipse pDC->Ellipse(200,10,300,70); pDC->TextOut(310,20,"<-Elipse"); 2.Ejecutar el programa. PASO 5: Dibujar uan Cuerda: 1.Adicionar el código a la función OnDraw(CDC*pDC): //Dibuja una cuerda pDC->Chord(10,100,100,200,20,125,120,175); pDC->TextOut(70,130,"<-Cuerda"); 2.Ejecutar el programa. PASO 6: Dibuja un Sector Circular: 1.Adicionar el código a la función OnDraw(CDC*pDC): //Dibuja un sector circular pDC->Pie(200,100,300,200,200,150,250,100); pDC->TextOut(300,130,"<-Sector"); 2.Ejecutar el programa. PASO 7: Dibujo de un Rectángulo: 1.Adicionar el código a la función OnDraw(CDC*pDC): //Dibuja un recangulo pDC->Rectangle(10,250,100,300); pDC->TextOut(110,280,"<-Rectangulo"); 2.Ejecutar el programa. PASO 8: Usando la clase CPen para modificar el filete a los dibujos: 1.Adicionar el código a la función OnDraw(CDC*pDC), antes del código que dibuja las figuras: //Modifica la forma de los dibujos CPen*n_pincel=new CPen; n_pincel->CreatePen(PS_SOLID,6,RGB(255,0,0)); pDC->SelectObject(n_pincel); 2.Ejecutar el programa.
René J. Hercilla Valdivia.
CEO “PERÚ”
VISUAL C + +
36
PASO 9: Usando la clase CBrush para modificar el interior (relleno) de los dibujos: 1.Adicionar el código a la función OnDraw(CDC*pDC), antes del código que dibuja las figuras: //Modifica el interior de los dibujos CBrush*n_brocha=new CBrush; n_brocha>CreateHatchBrush(HS_CROSS,RGB(255,0,0)); pDC->SelectObject(n_brocha); 2.Ejecutar el programa.
René J. Hercilla Valdivia.
CEO “PERÚ”