el 10-18-2011 11:50 PM
Hola,
trabajo con el LabWindows CVI 9.0, voy a tratar de explicar el problema que tengo.
En mi programa tengo un Control TAB, dentro de él un Control PICTURE, este último es bastante grande (en dimensiones), osea que si quiero ver el contenido completo (la imagen) de este control, tengo que usar las barras de desplazamiento.
En mi programa, cuando hago doble klick sobre PICTURE, hago visible un Panel que lo tenía escondido, mi problema radica en que, quiero que ese Panel aparezca donde hice el doble klick, pero me aparece un poco mas arriba, y cuando recorro la imagen al final de la pantalla y ahí hago doble klick, entonce ya no me aparece el Panel nuevo, me parece que se hace visible fuera de la pantalla.
Este es mi código (parte de él):
int CVICALLBACK Make_control (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_LEFT_DOUBLE_CLICK:
SetPanelPos (popuphandle_ini, eventData1, eventData2);
SetPanelAttribute (popuphandle_ini, ATTR_VISIBLE, 1);
break;
}
return 0;
}
tiene talvez alguien alguna idea de cómo recupero las coordinadas del ratón, para que ahí me aparezca el nuevo Panel?
Gracias por toda respuesta.
Saludos.
Abel.
¡Resuelto! Ir a solución.
10-19-2011 06:11 AM - editado 10-19-2011 06:12 AM
Hola Abel,
el tema es que las coordenadas que recibes en el evento mouse tienen referencia en el panel sobre el que está el control y tienes que referirlas al video para posicionar correctamente el panel.
Ahora bien, considera que tu imagen está dentro de un TAB, que es en realidad un panel por si mismo hijo del panel principal, así que tienes que obrar dos maniobras para calcular las coordenadas correctas:
int top = 0, left = 0, ptop = 0, pleft = 0, parent; if (event != EVENT_LEFT_DOUBLE_CLICK) return 0; GetPanelAttribute (panel, ATTR_PANEL_PARENT, &parent); if (parent) { GetPanelAttribute (parent, ATTR_TOP, &ptop); GetPanelAttribute (parent, ATTR_LEFT, &pleft); } GetPanelAttribute (panel, ATTR_TOP, &top); GetPanelAttribute (panel, ATTR_LEFT, &left); SetPanelPos (popuphandle_ini, eventData1 + top + ptop, eventData2 + left + pleft); SetPanelAttribute (popuphandle_ini, ATTR_VISIBLE, 1); return 0; }
Otra manera podría ser esta:
int top = 0, left = 0; if (event != EVENT_LEFT_DOUBLE_CLICK) return 0; GetGlobalMouseState (NULL, &left, &top, NULL, NULL, NULL); SetPanelPos (popuphandle_ini, top, left); SetPanelAttribute (popuphandle_ini, ATTR_VISIBLE, 1);
Por último, considera que todo esto ya no es necesario si tu panel 'popuphandle_ini' es un hijo del panel principal (esto es, lo cargas pasando en el primer parámetro del LoadPanel el handle de la página del TAB en la que está la imagen).
el 10-19-2011 06:46 AM
Hola Roberto,
gracias por la respuesta, si resultó.
Me puedes esplicar mejor por favor a que te refieres con el último párrafo que escribiste:
Por último, considera que todo esto ya no es necesario si tu panel 'popuphandle_ini' es un hijo del panel principal (esto es, lo cargas pasando en el primer parámetro del LoadPanel el handle de la página del TAB en la que está la imagen).
Saludos.
Abel
el 10-19-2011 09:31 AM
Simplemente eso: un panel hijo (child panel) tiene sus referencias dentro del marco del panel padre, por lo que las coordenadas que encuentras en los eventData de la callback del picture pueden ser usadas sin modificaciones para posicionar el panel hijo. El panel hijo solo puede moverse dentro de la área del padre y esto puede u no ser un problema en tu aplicación: si consideras que puedes usarlo puedes pasar los callbackData al SetPanelPos tal y como mostraste en tu primer mensaje.
el 10-19-2011 11:23 PM
Hola Roberto,
lo que te entendí es lo siguiente:
if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */
if ((panelHandle = LoadPanel (INVISIBLE, "ATS.uir", PANEL)) < 0) return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
osea con eso cargué a INVISIBLE como un Panel Hijo ó?, el problema es que me sale el siguiente error:
Panel pop-up, or menu bar handle is invalid.
Saludos.
Abel,
el 10-19-2011 11:49 PM
Abel, un child panel necesita tener un padre, por lo que ¡no puede ser el primer panel que cargas al iniciar el programa!
Lo que entendía era esto:
Si quires, puedes mirar al ejemplo panels.prj que hay en la carpeta \samples\userint en tu disco duro.
el 10-20-2011 12:13 AM
Hola Roberto,
Buenos días, no pensé que estabas despierto tan temprano. Yo tambien empiezo temprano en el trabajo.
Ahora si entendí, de todas maneras no le dá a mi programa. Sin embargo la primera solución que me diste:
GetGlobalMouseState (NULL, &left, &top, NULL, NULL, NULL);
con eso resolví el problema. Nuevamente gracias y hasta pronto.
Abel
el 10-20-2011 02:44 PM
Hola Abel, esta mañana desperté un poco mas tempranito porque salí para visitar un cliente
Me alegra que hayas encontrado una solución a tu problema. Ya te dije que lo del child panel podía no resultar correcto dependiendo de cómo has desarrollado tu aplicación, sin embargo lo añadí para darte una indicación completa: cada uno de nosotros elige las soluciones que más le agradan y que reputa má útiles para su problema, pero es importante conocerlas todas para eligir mejor.
¡Suerte en tu trabajo!