Está en la página 1de 11

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE INGENIERÍA MECÁNICA

CURSO MB545 – POO

Clase 14

2015

1
9 MANEJO DE MENUS

9.1 Introducción.- El Visual C nos genera aplicaciones visuales con ventanas similares a las
que en forma estándar usa Windows o sea con:
 Botón de minimizar
 Botón de maximizar
 Botón de cerrar
 Barra de herramientas
 Barra de estado
 Menú principal
O sea toda una interfaz gráfica con los elementos de la biblioteca MFC.
9.2 Aplicación SDI.- Existen dos categorías de documentos/Vista estos son el SDI y el MDI.
Esta primera aplicación la realizaremos como una aplicación SDI, los pasos son los siguientes:
 Creamos un nuevo proyecto cuyo nombre será menu01 usando la opción MFC AppWizard(exe)
 En el paso uno escogemos la opción Single Document y presionamos el botón Next.
 En el paso dos elegimos la opción none
 En el paso tres elegimos la opción none y marcamos la opción activeX Controls, pulsamos el
botón Next.
 En el paso cuatro marcamos las opciones Docking Toolbar, Initial StatusBar, Printing and
Preview y por ultimo marcamos 3D Controls, además seleccionamos la opción normal y luego
presionamos el botón Next.
 En el paso cinco escogemos el estilo MFC Standard, seleccionamos la opción 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 aplicación y Funciones iniciales.- El objetivo de esta aplicación es el de
visualizar una pila de figuras, para este caso se escogerá rectángulos, es una aplicación bastante
sencilla, puesto que manejaremos solo las opciones de Quitar y Poner, como describiremos a
continuación. Entonces empecemos por añadir las variables que vamos a necesitar, la primera de
ella lo hacemos manualmente, hacemos un clic(estando en CMenu01) en el botón derecho del
Mouse y escogemos Add Member variable del menú que se nos mostró aquí declaramos:
 Variable Type: int
 Variable Name: cantidad
 Acces: Protected
Ahora creamos la función escogiendo la opción Add Member Function, aquí crearemos la
función ObtenerVariable( ) que será:
 Variable Type: int
 Function Declaration: ObtenerVariable( )

2
 Acces: Public
La función ObtenerVariable( ) tendrá el código 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 botón AddFunction,
finalmente pulsamos el botón Ok.
La función DeleteContents debe tener el código que mostraremos a continuación y que UD. debe
ingresar:
void Cmenu01Doc:: DeleteContents( )
{ cantidad = 1;
CDocument:: DeleteContents( ) // Elimina contenido del documento }

A continuación dibujaremos la figura en nuestro documento pues esto es fácil con la función
OnDraw, esta función la encontramos en la solapa ClassView en la opción Cmenu01view, esta
función 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


IDR_MAINFRAME, haciendo doble click sobre este, la cual se encuentra dentro de la carpeta
menú. Podemos
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

3
opciones Deshacer, Cortar, Copiar, Pegar, y luego nos muestra un rectángulo en blanco, es sobre
este cuadrado que haremos doble click y nos mostrara un cuadro de dialogo, en el cual ponemos:
 ID: IDC_poner.
 Caption: “Un rectángulo mas”
 Prompt: “Incrementar”
De igual modo añadimos una opción más donde:
 ID: IDC_sacar
 Caption: “Un rectángulo menos”
 Prompt: “Disminuir”

Ahora creamos el código 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 botón Add Function, finalmente presionamos el botón Ok en
el cuadro de dialogo Add Member Function, y veremos que se ha generado la opción Onponer hacemos
lo mismo para crear la función Onsacar y presionamos el botón edit code e ingresamos:
void Cmenu01Doc :: Onponer( )
{ cantidad++;
UpdateAllViews(NULL);
}
void Cmenu01Doc :: Onsacar( )
{ if (cantidad >0) cantidad --;
UpdateAllViews(NULL);
}
Ejecutamos y comprobamos los resultados.

SEGUNDA PARTE – CREANDO MENUS

9.5 Introducción. - En esta parte del curso vamos a crear un menú llamado también menú de
contexto, que se obtiene pulsando el botón derecho del Mouse, esto nos permite un acceso rápido
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 botón
derecho, del menú que nos presenta seleccionamos la opción Insert Menú.
 Observamos que se ha creado una plantilla de un nuevo menú, es muy importante poner algún
elemento en el menú dado que, si lo utilizamos así, este se borrara automáticamente.
 Debemos ponerle un nombre a nuestro menú ya que el nombre por defecto es IDR_MENU1,
para esto hacemos un click con el botón derecho del Mouse sobre IDR_MENU1 que se
encuentra en ResourceView y elegimos la opción propiertes.
 Nos muestra el cuadro de dialogo Menú Propiertes, en el cual realizamos lo siguiente:
 ID: IDR_MIMENU
 Language: Spanish(Modern).
9.7 Añadiendo elementos al encabezado. - Realizamos lo siguiente:

4
 Sobre el botón que aparece encerrado en la pestaña 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 añadimos otro
encabezado y le ponemos Versión.

9.8 Añadiendo 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 rectángulo mas
 Volvemos a hacer lo mismo que en el paso anterior y ponemos:
 ID: IDR_QUITARRECTANGULO
 Caption: Un rectángulo menos
 Hacemos lo mismo con el otro encabezado de menú versión y al elemento le ponemos ID
IDR_VERSION y de Caption le pondremos acerca de.
9.9 Añadiendo código 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 botón Add Function, lo mismo hacemos para
IDR_QUITERRECTANGULO, finalmente presionamos el botón Edit Code e introducimos el
siguiente código

void Cmenu01Doc :: OnPonerrectangulo( )


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

9.10 Añadiendo código final a la aplicación.- para que funcione la nueva aplicación tenemos
que adicionar lo siguiente:
 Llamamos a ClassWizard, en Class Name seleccionamos Cmenu01App, en Object Ids
seleccionamos IDR_VERSION, en Messages seleccionamos COMAND y luego pulsamos el
botón Add Function, finalmente presionamos el botón Edit Code donde introducimos el
siguiente código:
void Cmenu01App :: OnVersion( )
{ OnAppAbout ( ); }
 Finalmente para llamar al nuevo formulario debemos entrar a ClassView y hacemos doble click
sobre la función InitInstance( ) que se encuentra en Cmenu01App y cambiamos el código como
se muestra a continuación:
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 línea de código
RUNTIME_CLASS(Cmenu01Doc),
RUNTIME_CLASS(CMainFrame),

5
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 aplicación que contendrá el menú
2. Adicionar un recurso menú al proyecto
3. Personalizar el menú para añadir los ítems
4. Adicionar las rutinas que dan funcionalidad a los ítems.
CREANDO LA APLICACIÓN
Crear una aplicación basada en dialogo que permita ingresar los siguientes datos de un
empleado: Código, 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 aplicación como
Appm1.
Solución
Iniciamos con el dialogo agregamos los siguientes objetos y modificamos sus propiedades:
Inserte un recurso menú.
Control Propiedad Nuevo valor
IDD_appm01_DIALOG Caption Empleados
Style Popup
Border Resizing
Center true
System menu true
Minimize box true
Maximize box true
MENU IDR_MENU
Diseñe el menú con las siguientes opciones.
Caption Empleados
ID Caption
IDC_INGRESO &Ingreso
IDC_CONSULTA &Consulta
IDC_LISTAR &Listar
Separador
IDC_SALIR &Salir
A continuación, diríjase a la definición de clase Cappm1Dlg y ubique la sección pública realizando los
cambios indicados:
class Cappm1Dlg : public CDialog
{// Construction
public:

6
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
ubíquese en la ficha Resource View y localice la carpeta Dialog. Luego haga clic derecho con el Mouse
y del menú contextual elija la opción Insert Dialog.

Modifique sus propiedades e ingrese los siguientes controles:

Control Propiedad Nuevo valor


IDD_DIALOG1 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

7
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 recién creado, invoque al ClassWizard y este le mostrara el siguiente
mensaje:

Ahora incluya appm1Dlg.h en appm1DlgIngreso.cpp.


PROGRAMANDO LOS BOTONES
void Cappm1DlgIngreso::OnBnClickedAceptar()

8
{ CString mensaje1,mensaje2,mensaje3;
mensaje1="El codigo ingresado ya existe";
mensaje2="Error";
mensaje3="Ha llegado al limite de elementos";
UpdateData(true);
int n = ((Cappm1Dlg*)GetParent())->m_n;
if(n==50)
MessageBox(mensaje3, mensaje2, 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(mensaje1,mensaje2,MB_ICONINFORMATION);
}

}
void Cappm1DlgIngreso::OnBnClickedCerrar()
{this->EndDialog(0);}

Tambien inicialize m_n=0; en


BOOL Cappm1Dlg::OnInitDialog()
{ CDialog::OnInitDialog();
m_n=0;
…..
A continuación creamos codigo para las funciones de menú creadas:
void Cappm1Dlg::OnIngreso( )
{ Cappm1DlgIngreso Dlg;
Dlg.DoModal();
}
Ahora incluya appm1DlgIngreso.h en appm1Dlg.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

9
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

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++)
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 incluya Appm1Dlg.h en Appm1DlgConsulta.cpp.

10
Ahora añada el evento OnSelChangeCodigos() con el mensaje CBN_SELCHANGE para el objeto
combo box.
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);
}
Para el boton:
void Cappm1DlgConsulta::OnCerrar()
{this->EndDialog(0);
// TODO: Add your control notification handler code here
}
A continuación creamos codigo para las funciones de menú creadas:
void Cappm1Dlg::OnConsulta( )
{ Cappm1DlgConsulta Dlg;
Dlg.DoModal();
}
Ahora incluya appm01DlgConsulta.h en Appm01Dlg.cpp.

Tambien
void Cappm1Dlg::OnCerrar()
{PostQuitMessage(0);
// TODO: Add your command handler code here
}

11

También podría gustarte