Está en la página 1de 12

UNIVERSIDAD NACIONAL DE INGENIERA

FACULTAD DE INGENIERA MECNICA

CURSO MB545 POO

Clase 9

2011
9
MANEJO DE MENUS Introduccin.- El Visual C nos genera aplicaciones visuales con ventanas similares a las 1 Botn de minimizar

9.1

que en forma estndar usa Windows o sea con:

herramientas O sea toda una interfaz grfica con los elementos de la biblioteca MFC.

Botn de maximizar Botn de cerrar Barra Barra de estado Men principal de

9.2

Aplicacin SDI.- Existen dos categoras de documentos/Vista estos son el SDI y el MDI. Creamos un nuevo

Esta primera aplicacin la realizaremos como una aplicacin SDI, los pasos son los siguientes: proyecto cuyo nombre ser menu01 usando la opcin MFC AppWizard(exe)

escogemos la opcin Single Document y presionamos el botn Next.

En

el

paso

uno

elegimos la opcin none

En

el

paso

dos

En

el

paso

tres

elegimos la opcin none y marcamos la opcin activeX Controls, pulsamos el botn Next. En el paso cuatro

marcamos las opciones Docking Toolbar, Initial StatusBar, Printing and Preview y por ultimo marcamos 3D Controls, adems seleccionamos la opcin normal y luego presionamos el botn Next.

En el paso cinco

escogemos el estilo MFC Standard, seleccionamos la opcin Yes, please, y por ultimo seleccionamos AS a Shared DLL. Luego presionamos Finish y luego OK para generar nuestro proyecto.

9.3

Objetivo de la aplicacin y Funciones iniciales.- El objetivo de esta aplicacin es el de

visualizar una pila de figuras, para este caso se escoger rectngulos, es una aplicacin bastante sencilla, puesto que manejaremos solo las opciones de Quitar y Poner, como describiremos a continuacin. Entonces empecemos por aadir las variables que vamos a necesitar, la primera de ella lo hacemos manualmente, hacemos un clic(estando en CMenu01) en el botn derecho del Mouse y escogemos Add Member variable del men que se nos mostr aqu declaramos:


cantidad

Variable Type: int Variable Name:

Acces: Protected

Ahora creamos la funcin escogiendo la opcin Add Member Function, aqu crearemos la 2

funcin ObtenerVariable( ) que ser:

Variable Type: int Function Declaration: ObtenerVariable( ) Acces: Public


La funcin ObtenerVariable( ) tendr el cdigo siguiente: int Cmenu01Doc:: ObtenerVariable( ) { return cantidad; } Ahora debemos utilizar ClassWizard, presionamos Control + W, para obtener el cuadro de dialogo MFC ClassWizard, seleccionamos la solapa Messages Maps, en el cuadro combinado ClassName buscamos y seleccionamos Cmenu01Doc y los mismos en lista Object IDs, en el cuadro de lista Messages seleccionamos DeleteContents y luego pulsamos el botn AddFunction, finalmente pulsamos el botn Ok. La funcin DeleteContents debe tener el cdigo que mostraremos a continuacin y que UD. debe ingresar: void Cmenu01Doc:: DeleteContents( ) { cantidad = 1; CDocument:: DeleteContents( ) // Elimina contenido del documento } A continuacin dibujaremos la figura en nuestro documento pues esto es fcil con la funcin OnDraw, esta funcin la encontramos en la solapa ClassView en la opcin Cmenu01view, esta funcin la modificaremos como sigue: void Cmenu01View:: OnDraw ( CDC* pDC) { Cmenu01Doc* pDoc = GetDocument( ); ASSERT_VALID(pDoc); CBrush* pOldBrush = pDC -> GetCurrentBrush( ); CBrush brus; brus. CreateSolidBrush(RGB(100,100,0)); pDC ->SelectObject(&brus); for ( int i=0; i<pDoc->ObtenerVariable( ) ; i++ ) { int x = 300-30*i; pDC ->Rectangle(20, x-5,250,x 50); } pDC ->SelectObject(pOldBrush); }

9.4

Manejando

opciones

del

men.-

En

la

solapa

ResourceView

seleccionamos Podemos

IDR_MAINFRAME, haciendo doble click sobre este, la cual se encuentra dentro de la carpeta men. 3

visualizar el men generado por AppWizard el cual tiene opciones como archivo, Editar, Ver, Ayuda, hacemos un click sobre editar y observamos que se este se despliega un sub men con las opciones Deshacer, Cortar, Copiar, Pegar, y luego nos muestra un rectngulo en blanco, es sobre este cuadrado que haremos doble click y nos mostrara un cuadro de dialogo, en el cual ponemos:


rectngulo mas

ID: IDC_poner. Caption: Un

Incrementar De igual modo aadimos una opcin ms donde:

Prompt:


rectngulo menos

ID: IDC_sacar Caption: Un

Prompt: Disminuir

Ahora creamos el cdigo para estas nuevas opciones creadas del men, presionamos control + W seleccionamos la solapa Message Map, debemos escoger Cmenu01Doc en Class Name all debemos ubicar y seleccionar IDC_poner, en el cuadro lista Objects IDs, lo que haremos ser escoger COMMAND en Messages y presionar el botn Add Function, finalmente presionamos el botn Ok en el cuadro de dialogo Add Member Function, y veremos que se ha generado la opcin Onponer hacemos lo mismo para crear la funcin Onsacar y presionamos el botn edit code e ingresamos: void Cmenu01Doc :: Onponer( ) { } void Cmenu01Doc :: Onsacar( ) { } Ejecutamos y comprobamos los resultados. SEGUNDA PARTE CREANDO MENUS if (cantidad >0) cantidad --; UpdateAllViews(NULL); cantidad++; UpdateAllViews(NULL);

9.5

Introduccin.- En esta parte del curso vamos a crear un men llamado tambin men de contexto, que se obtiene pulsando el botn derecho del Mouse, esto nos permite un acceso rpido a los elementos del men. 9.6 Creando el men adicional.- para esto debemos realizar los siguientes pasos: Ubicamos el panel ResourceView, sobre la carpeta Men hacemos un click con el botn derecho, del men que nos presenta seleccionamos la opcin Insert Men. 4

9.7

Observamos que se ha creado una plantilla de un nuevo men, es muy importante poner algn elemento en el men dado que si lo utilizamos as, este se borrara automticamente. Debemos ponerle un nombre a nuestro men ya que el nombre por defecto es IDR_MENU1, para esto hacemos un click con el botn derecho del Mouse sobre IDR_MENU1 que se encuentra en ResourceView y elegimos la opcin propiertes. Nos muestra el cuadro de dialogo Men Propiertes, en el cual realizamos lo siguiente: ID: IDR_MIMENU Language: Spanish(Modern). Aadiendo elementos al encabezado.- Realizamos lo siguiente: Sobre el botn que aparece encerrado en la pestaa resources perteneciente a IDR_MIMENU hacemos doble click, nos aparece el cuadro de dialogo Men Item Propiertes y ponemos el Caption Mi archivo. Pulsamos enter y ya esta nuestro primer encabezado, de igual manera aadimos otro encabezado y le ponemos Versin. Aadiendo elementos al Men.- Realizamos lo siguiente: Hacemos click sobre Mi Archivo, aparece un recuadro, hacemos doble click sobre el recuadro y aparece el cuadro de dialogo Men Item Propiertes, aqu ponemos ID: IDR_PONERRECTANGULO Caption: Un rectngulo mas Volvemos a hacer lo mismo que en el paso anterior y ponemos: ID: IDR_QUITARRECTANGULO Caption: Un rectngulo menos Hacemos lo mismo con el otro encabezado de men versin y al elemento le ponemos ID IDR_VERSION y de Caption le pondremos acerca de. Aadiendo cdigo a los elementos al Men.- Realizamos lo siguiente: Abrimos ClassWizard con Control + W, aqu seleccionamos Cmenu01Doc, en Objects Ids buscamos y seleccionamos IDR_PONERRECTANGULO, en MESSAGES seleccionamos COMMAND y luego pulsamos el botn Add Function, lo mismo hacemos para IDR_QUITERRECTANGULO, finalmente presionamos el botn Edit Code e introducimos el siguiente cdigo

9.8

9.9

void Cmenu01Doc :: OnPonerrectangulo( ) { Onponer ( ); } void Cmenu01Doc :: OnQuitarrectangulo( ) { Onsacar( ); }

9.10

Aadiendo cdigo final a la aplicacin.- para que funcione la nueva aplicacin tenemos que adicionar lo siguiente: Llamamos a ClassWizard, en Class Name seleccionamos Cmenu01App, en Object Ids seleccionamos 5

IDR_VERSION, en Messages seleccionamos COMAND y luego pulsamos el botn Add Function, finalmente presionamos el botn Edit Code donde introducimos el siguiente cdigo: void Cmenu01App :: OnVersion( ) { OnAppAbout ( ); } Finalmente para llamar al nuevo formulario debemos entrar a ClassView y hacemos doble click sobre la funcin InitInstance( ) que se encuentra en Cmenu01App y cambiamos el cdigo como se muestra a continuacin: BOOL Cmenu01App::InitInstance( ) { AfxEnableControlContainer( ); #ifdef_AFXDLL Enable3dControls( ); #else Enable3dControlsStatic( ); #endif SetRegistryKey(_T(Local AppWizard-Generated Applications)); LoadStdProfileSettings( ); CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MIMENU, //Cambiar esta lnea de cdigo RUNTIME_CLASS(Cmenu01Doc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(Cmenu01ViewDoc)); AddDocTemplate(pDocTemplate); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); If( ProcessShellCommand(cmdInfo)) Return FALSE; m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow( ); return TRUE; } MENUS EN VISUAL C ++ Para crear un men hay que seguir los siguientes pasos: 1. Crear la aplicacin que contendr el men 2. Adicionar un recurso men al proyecto 3. Personalizar el men para aadir los tems 4. Adicionar las rutinas que dan funcionalidad a los tems. CREANDO LA APLICACIN Crear una aplicacin basada en dialogo que permita ingresar los siguientes datos de un empleado: Cdigo, nombre y sueldo para un arreglo de 50 elementos, el dialogo debe presentar un men con las opciones: Ingreso Consulta Listar Salir Finalmente debe presentar el sueldo promedio y el total de la planilla sin descuentos. Agregue los siguientes objetos y modifique sus propiedades, guardar la aplicacin como Appm1. Solucin Iniciamos con el dialogo agregamos los siguientes objetos y modificamos sus propiedades: 6

Inserte un recurso men. Control IDD_appm01_DIALOG

Propiedad Nuevo valor Caption Empleados Style Popup Border Resizing Center true System menu true Minimize box true Maximize box true MENU IDR_MENU Disee el men con las siguientes opciones. Caption Empleados ID Caption IDC_INGRESO &Ingreso IDC_CONSULTA &Consulta IDC_LISTAR &Listar Separador IDC_SALIR &Salir A continuacin dirjase a la definicin de clase CAppm1Dlg y ubique la seccin pblica realizando los cambios indicados: class CAppm1Dlg : public CDialog {// Construction public: struct empleado { CString m_Codigo; CString m_Nombres; double m_Sueldo; }; empleado m_empleados[50]; int m_n; CAppm1Dlg(CWnd* pParent = NULL); // standard constructor .. 1.- Dialogo de Ingresar datos Ahora procederemos a crear el dialogo que nos permitir ingresar los datos de los alumnos. Para esto ubquese en la ficha Resource View y localice la carpeta Dialog. Luego haga clic derecho con el Mouse y del men contextual elija la opcin Insert Dialog.

Modifique sus propiedades e ingrese los siguientes controles:

Control IDD_DIALOG1

Propiedad Nuevo valor ID IDD_DIALOGO_INGRESO Caption Ingreso Style Popup Border Dialog Frame Title Bar true System Menu true IDC_STATIC Caption Codigo IDC_STATIC(1) Caption Nombres IDC_STATIC(2) Caption Sueldo IDD_EDIT1 ID IDC_CODIGO Uppercase true Border false Static edge true IDD_EDIT2 ID IDC_NOMBRES Uppercase true Border false Static edge true IDD_EDIT3 ID IDC_SUELDO Uppercase true Border false Static edge true IDD_BUTTON1 ID IDC_ACEPTAR Caption &Aceptar Default Button true Static edge true IDD_BUTTON2 ID IDC_CERRAR Caption &Cerrar Static edge true Ahora, estando en el dialogo recin creado, invoque al ClassWizard y este le mostrara el siguiente mensaje:

Ahora incluya Appm01Dlg.h en Appm01DlgIngreso.cpp. PROGRAMANDO LOS BOTONES void CAppm1DlgIngreso::OnAceptar() {UpdateData(true); int n = ((CAppm1Dlg*)GetParent())->m_n; if(n==50) MessageBox("Ha llegado al limite de elementos", "Error", MB_ICONINFORMATION ); else { bool mExiste = false; for(int j=0;j<=n;j++) if(((CAppm1Dlg*)GetParent())->m_empleados[j].m_Codigo == m_Codigo) mExiste=true; if(!mExiste) { ((CAppm1Dlg*)GetParent())->m_empleados[n].m_Codigo = m_Codigo; ((CAppm1Dlg*)GetParent())->m_empleados[n].m_Nombres = m_Nombres; ((CAppm1Dlg*)GetParent())->m_empleados[n].m_Sueldo = m_Sueldo; ((CAppm1Dlg*)GetParent())->m_n++; m_Codigo=""; m_Nombres=""; m_Sueldo=0; GetDlgItem(IDC_CODIGO)->SetFocus(); UpdateData(false); } else MessageBox("El codigo ingresado ya existe","Error",MB_ICONINFORMATION); } } 9

void CAppm1DlgIngreso::OnCerrar() { this->EndDialog(0);} Tambien inicialize m_n=0; en BOOL CAppm01Dlg::OnInitDialog() { CDialog::OnInitDialog(); m_n=0; .. A continuacin creamos codigo para las funciones de men creadas: void CAppm01Dlg::OnIngreso( ) { CAppm01DlgIngreso Dlg; Dlg.DoModal(); } Ahora incluya Appm01DlgIngreso.h en Appm01Dlg.cpp. 2.- Dialogo de Consulta Inserte un dialogo y modifique las propiedades como se indique: Control Propiedad Nuevo valor IDD_DIALOG1 ID IDD_DIALOGO_CONSULTA Caption Consulta Style Popup Border Dialog Frame Title Bar true System Menu true IDC_STATIC Caption Codigo IDC_STATIC(1) Caption Nombres IDC_STATIC(2) Caption Sueldo IDD_EDIT1 ID IDC_NOMBRES Read-Only True Border false Static edge true IDD_EDIT2 ID IDC_SUELDO Read-Only true Border false Static edge true IDD_COMBO1 ID IDC_CODIGOS Type DropList Sort True Vertical Scroll True OEM Convert True Client edge True IDD_BUTTON1 ID IDC_CERRAR Caption &Cerrar Static edge true

10

Crear una nueva clase como en el caso anterior, llamada CAppm1DlgConsulta.

Ahora cree el codigo para el dialogo. Primero agregue para la ventana el evento OnInitDialog() con el mensaje WM_INITDIALOG y luego agregue el codigo: BOOL CAppm1DlgConsulta::OnInitDialog() { CDialog::OnInitDialog(); for(int i =0;i< ((CAppm1Dlg*) GetParent())->m_n;i++) // TODO: Add extra initialization here m_Codigo.AddString(((CAppm1Dlg*)GetParent())->m_empleados[i].m_Codigo); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } Ahora aada el evento OnSelChangeCodigos() con el mensaje CBN_SELCHANGE para el objeto combo box. Ahora incluya Appm01Dlg.h en Appm01DlgIngreso.cpp. Agregue codigo para el evento creado: void CAppm1DlgConsulta::OnSelchangeCodigos() {CString mCodigo; m_Codigo.GetLBText(m_Codigo.GetCurSel(),mCodigo); for(int i =0;i< ((CAppm1Dlg*) GetParent())->m_n;i++) if(mCodigo==((CAppm1Dlg*)GetParent())->m_empleados[i].m_Codigo) { m_Nombre = ((CAppm1Dlg*)GetParent())->m_empleados[i].m_Nombres; m_Sueldo = ((CAppm1Dlg*)GetParent())->m_empleados[i].m_Sueldo;} // TODO: Add your control notification handler code here UpdateData(false); 11

} Para el boton: void CAppm1DlgConsulta::OnCerrar() {this->EndDialog(0); // TODO: Add your control notification handler code here } A continuacin creamos codigo para las funciones de men creadas: void CAppm01Dlg::OnIngreso( ) { CAppm01DlgConsulta Dlg; Dlg.DoModal(); } Ahora incluya Appm01DlgConsulta.h en Appm01Dlg.cpp. Tambien void CAppm1Dlg::OnCerrar() {PostQuitMessage(0); // TODO: Add your command handler code here }

12