C/Visual C - Atascado, pls ayuda (Mejorado)

 
Vista:

Atascado, pls ayuda (Mejorado)

Publicado por Nelek (816 intervenciones) el 14/06/2006 17:51:28
Voy a condensarlo todo en un mensaje, quitando lo que ya he solucionado, agrupando y ordenando las pruebas que hice. Para que quede mas claro.

Yo me declaro la superficie de trabajo con el siguiente codigo.
void CFPSView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal(4200,2970);
CSize sizePage(sizeTotal.cx/10, sizeTotal.cy/10);
CSize sizeLine(sizeTotal.cx/100, sizeTotal.cy/100);

SetScrollSizes(MM_LOMETRIC, sizeTotal, sizePage, sizeLine); //Esto son 0.1mm
//SetScrollSizes(MM_HIMETRIC, sizeTotal, sizePage, sizeLine); //Esto son 0.01mm
//SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine); //esto son pixeles
}

Para guardar las coordenadas hago:
void CFPSView::OnLButtonDown(UINT nFlags, CPoint point)
{
CPoint cpTempPoint = point;
CPoint cpScrollPoint = GetScrollPosition ();

cpTempPoint.x = cpTempPoint.x + cpScrollPoint.x;
cpTempPoint.y = cpTempPoint.y - cpScrollPoint.y;
//Nota: el - del vertical en el caso de usar MM_TEXT se cambia a un +, cosas del MFC
//… mas codigo
}

y luego uso el valor final para guardarlo en el campo Coordenadas de mi objeto y mandarlo al documento, ya que con eso es con lo que luego los presento en la pantalla en otra funcion cuando el evento OnDraw.

Cuando uso la opcion de MM_TEXT me funciona todo a la perfeccion, pero cuando uso MM_LOMETRIC o MM_HIMETRIC resulta que, no me da fallo ninguno, pero funciona mal (mirar abajo).

Haciendo pruebas con los metodos...

void CWnd::GetClientRect( LPRECT lpRect ) const;
int CWnd::GetScrollPos( int nBar ) const;
int CWnd::GetScrollLimit( int nBar );
void CWnd::GetScrollRange( int nBar, LPINT lpMinPos, LPINT lpMaxPos ) const;
CPoint CScrollView::GetDeviceScrollPosition( ) const;
void CScrollView::GetDeviceScrollSizes( int& nMapMode, SIZE& sizeTotal, SIZE& sizePage, SIZE& sizeLine ) const;

Tanto en MM_TEXT, como en MM_LOMETRIC o en MM_HIMETRIC, los metodos de Get me dan lo mismo poniendo "Device" que sin ponerlo. Y el Rango y el sizeTotal coinciden (aunque creo que no deberia ser asi).

He visto que el Rango depende de los valores introducidos en sizeTotal, la posicion de la barra aumenta en sizePage o en sizeLine segun se clickea en boton o en la barra (aunque eso era obvio, ya lo se), las posiciones de la barra son siempre la misma para los distintos tamaños de ventana (al menos hasta llegar al limite) y el limite (que es parte de lo que me toca las narices) es el valor resultante de restarle al Rango las dimensiones de la ventana visible en ese momento, es decir, GetScrollLimit = GetScrollRange - GetClientRect.

El problema es que, si tengo la ventana en un tamaño (por ejemplo el tamaño por defecto de cuando se abre la aplicacion) y me voy a la esquina de abajo a la derecha (fin de ambos scrolls), cuando meto un elemento pegado a los bordes de la esquina... se queda ahi y puedo ir arriba y abajo sin problemas, que el objeto se mueve con la vista a la perfeccion. Pero si modifico el tamaño por defecto de la ventana (por ejemplo maximizando), resulta que el objeto desaparece de la vista (sigue estando en la memoria del programa con todos los parametros sin modificaciones, pero no se puede ver porque esta fuera de los limites del scroll) y, si restauro el tamaño anterior, sigue viendose en el mismo punto. Y si empiezo con la pantalla maximizada y lo hago a la inversa, lo mismo.

A partir de ahora voy a hablar siempre tomando como tamaño de la pantalla el valor por defecto con el que se abre el programa tras decirle que lo ejecute.

Si me voy al final del scroll (tanto horizontal como vertical) y ubico un elemento pegadito la esquina inferior derecha. Deberia de guardarse en
Coordenadas = ClientRect + ScrollPos - DistanciaDelClickALosBordes //o ScrollRange – DimensionesDelBitMap
O sea (hablando del eje X): Coord = 596 (AnchoCliente) + 600 (ScrollPos) – 140 (AnchoBitMap) = 1056

Sin embargo se me estan guardando las coordenadas (2622, 2222), pero se queda visible en el punto donde yo le di cuando se supone que esos valores estan fuera de la vista.

Al final he descubierto que hay una relacion fija entre Doc/vista. Resulta que hay un incremento de 30 unidades por cada linea de scroll desplazado, por lo que el tamaño de la ventana afecta y mucho.

-Scrolls en el origen: Funciona a la perfeccion

-Scrolls una "pagina" desplazados. Lo ubica en la pantalla donde toca, es decir, en ScrollPos + PuntoDondeSeHaceClick, pero el valor de coordenadas que me guarda es ScrollPos+PuntoDondeSeHaceClick+300 (30*10)

Supongo que podria hacerme una formula de correccion de rollo
PuntoAGuardar = PuntoAGuardar - (30 * LineasScrollDesplazadas)

Pero me da a mi que no seria buena idea por una respuesta anterior en la que me comentasteis acerca de la dependencia de la resolucion del monitor, etc... Imagino que si lograra hacerlo funcionar bien para mi pc, empezaria a dar por saco en cuanto lo llevara a otro sitio.

Creo que la solucion debe de estar en los metodos del LptoDP, DPtoLP, LPtoHIMETRIC, DPtoHIMETRIC... pero no logro hacerlo funcionar bien ni a la de tres.

Para probar he rehecho la funcion de guardar los puntos de arriba y ahora tengo:

CPoint cpTempPoint = point;
CPoint cpScrollPoint = GetScrollPosition ();

cpTempPoint.x = cpTempPoint.x + cpScrollPoint.x;
cpTempPoint.y = cpTempPoint.y - cpScrollPoint.y;

CSize *csTemp = new CSize;

csTemp->cx = cpTempPoint.x;
csTemp->cy = cpTempPoint.y;

CDC* pDC;
pDC = GetDC ();
//Aqui he hecho pruebas con todos los metodos, de uno en uno
//pDC->DPtoLP (csTemp);
//pDC->LPtoDP (csTemp);
//pDC->DPtoHIMETRIC (csTemp);
//pDC->LPtoHIMETRIC (csTemp);

CString str1 = "", str2 ="";
str1.Format ("%s%i", str1, csTemp1->cx);
str2.Format ("%s%i", str2, csTemp1->cy);
AfxMessageBox (str1+", "+str2);

Me hace las transformaciones, pero he comprobado que me da lo mismo ya empiece con DPto... o LPto... la unica diferencia es entre las terminaciones ...toXP ( X= L ó D, da igual cual de las dos) y ...toHIMETRIC y el problema del desfase entre las posiciones de la vista y del documento sigue.

Creo que me debo de estar equivocando en algo de concepto, entre window, view, client, CDC... y esas cosas, pero ya no se que probar.

Por favor que alguien me de opciones
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Atascado, pls ayuda (Mejorado)

Publicado por Armando (127 intervenciones) el 15/06/2006 07:56:38
Ve en este foro, espero te sirva........

http://www.foros3d.tk/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Atascado, pls ayuda (Mejorado)

Publicado por Nelek (816 intervenciones) el 20/06/2006 09:16:14
Gracias, lo estuve mirando y no me ha servido de mucho. El foro es bastante pequeño y los mensajes muy antiguos. Lastima, pero gracias por el intento
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar