Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clase 14
Clase 14
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);
}
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.
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.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;
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:
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);}
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
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
}
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