C/Visual C - Desfase entre Doc/View

 
Vista:

Desfase entre Doc/View

Publicado por Nelek (816 intervenciones) el 21/06/2006 08:12:56
Hola a todos,

al final me doy por vencido con lo del desfase entre las coordenadas de la vista y lo que se me guarda en el documento. Lo he vuelto a dejar en pixeles y ya intentare arreglarlo o solventarlo por otro lado.

De todas maneras dejo otra vez el mensaje aqui abajo, a ver si alguien me puede explicar el porque de lo que me pasa, porque la verdad es que no tengo ni pu... idea.

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.
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

Es factible esta alternativa?

Publicado por Nelek (816 intervenciones) el 21/06/2006 08:19:24
Se me acaba de ocurrir una cosa.

El otro dia, mientras buscaba algun remedio para lo de arriba, me di con funciones como SetScaleToFit y similares.

En principio yo queria adecuar la superficie de trabajo a un A3 para luego no complicarme demasiado la vida imprimiendo, pero... si la mahoma no va a la montaña....
Creeis que es mejor dejar el tipo de scroll con el MM_TEXT y que funcione la interfaz y después, a la hora de imprimir, hacerlo ajustando entonces la escala?

Lo que me lleva a la pregunta...

Alguien sabe de algun ejemplo o pagina donde se encuentre codigo para mandar la vista y Documento a la impresora?? Porque en lo que es la ayuda del programa... -.- y en los manuales que tengo no he sacado demasiado en claro, parece ser un tema "tocanarices", me equivoco?
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