Menu contextual

23/04/2004 - 19:41 por salva | Informe spam
Hola a todos,

En la clase vista cree la funcion
CProyectoView::OnContextMenu() para manejar el menu
contextual, junto con otras funciones para manejar los
menus de la aplicacion. El menu contextual abre un
conjunto de menus que son los mismos que los menus de la
aplicacion anteriores.
Con todas las funciones en la clase vista funcionaba bien
pero tuve que cambiar las funciones de los menus a la
clase CMainFrame.
Ahora si pulso en el menu de la aplicacion me funciona
correctamente. El menu contextual sigue apareciendo
correctamente pero al seleccionar uno de los menus que
muestra, ya no se ejecuta la funcion del menu que se paso
a CMainFrame.

Espero que alguien sepa el porque,
gracias

.

Preguntas similare

Leer las respuestas

#1 Cholo Lennon
23/04/2004 - 20:35 | Informe spam
No se entiende bien el problema. El menú contextual que tratas de mostrar es
espécifico a la vista o es general? (es decir para que se muestre al pulsar
el botón derecho en cualquier parte, ya sea vista o area cliente del marco).
¿Podrías mostrar código sobre como manejas el mensaje WM_CONTEXTMENU en tu
clase marco y los que tenías en tu clase vista? También debería ver algunos
manejadores que tenías en tu vista y los que tienes ahora en tu marco.


Saludos
Cholo Lennon
Salta, ARG
Respuesta Responder a este mensaje
#2 salva
25/04/2004 - 13:45 | Informe spam
En mi clase vista estaban las funciones OnContextMenu() y
las que manejaban los menus, una es OnCrearMenu1() que
muestra un dialogo y se ejecuta cuando se selecciona el
menu ID_CREARMENU1.

void CProyectoView::OnContextMenu(CWnd* pWnd, CPoint point)
{
...
menu.LoadMenu(IDR_MENU1);
...
}

void CProyectoView::OnCrearMenu1()
{
CCrearDialogo1 dlg;
if (dlg.DoModal() == IDOK)
{
...
}
}

El menu IDR_MENU1 es un menu flotante que muestra algunos
submenus que son los mismos que los menus anteriores, uno
de ellos es ID_CREARMENU1.

Hasta aqui todo funcionaba correctamente, al pulsar el
menu aparecia el dialogo. Al pulsar con el boton derecho
aparecia el menu flotante y al pulsar en una opcion
aparecia el dialogo.

Despues se cambiaron las funciones que ejecutaban los
menus de la clase vista a la clase CMainFrame. Eliminando
las funciones que ejecutaban ID_CREARMENU1 desde
ClassWizard que estaban en CProyectoView y añadiendolas a
CMainFrame.

void CMainFrame::OnCrearMenu1()
{
CCrearDialogo1 dlg;
if (dlg.DoModal() == IDOK)
{
...
}
}

Pues bien, ahora cuando se pulsa el menu aparece
correctamente el dialogo. Cuando se pulsa el boton derecho
aparece correctamente el menu flotante, pero al
seleccionar una opcion ya no aparece el dialogo por lo que
no se ejecuta la funcion CMainFrame::OnCrearMenu1()
seleccionada.

un saludo,
Respuesta Responder a este mensaje
#3 Cholo Lennon
26/04/2004 - 18:13 | Informe spam
He probado el siguiente código en base a lo que me explicas. Al pulsar el
botón derecho sobre la vista se activa el menú contextual. Una vez
seleccionada la opción de prueba, el marco responde con un cuadro de
mensaje:

void CContextMenuView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu Menu;
if (Menu.LoadMenu(IDR_MENU1)){
CMenu* pSubMenu = Menu.GetSubMenu(0);
if (pSubMenu!=NULL) {
pSubMenu->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x,
point.y,
AfxGetApp()->m_pMainWnd); // << REVISA este parametro!
}
}
}

...

void CMainFrame::OnTestOption()
{
MessageBox("CMainFrame::OnTestOption");
}


Me parece que tu problema puede estar en que estás llamando a TrackPopupMenu
con la ventana inadecuada, es decir estás pasando un puntero a la vista y no
un puntero a la ventana principal de la aplicacion. Por lo tanto el marco
nunca recibe el mensaje. De la forma que lo he hecho funciona siempre (es
decir, no importa si los controladores de comandos estan en el marco, en las
vistas o en los documentos) ya que las vistas son hijas del marco, por lo
cual si el mismo no controla el comando, este es pasado a cada una de sus
ventanas hijas.

Saludos
Cholo Lennon
Salta, ARG
Respuesta Responder a este mensaje
#4 salva
26/04/2004 - 23:05 | Informe spam
Efectivamente, le pasaba el puntero this a la vista. Es
que este es el primer programa que preparo en Visual C++ y
cuando me falla algo me cuesta una mucho encontrarle la
solucion.

Muchas gracias por tu ayuda.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida