C/Visual C - Atasco, pls ayuda

 
Vista:

Atasco, pls ayuda

Publicado por Nelek (816 intervenciones) el 13/06/2006 16:27:19
Hola a todos,

Resulta que me habia emociando demasiado rapido con lo de la solucion del scroll, que comente hace unos dias. Hoy me he dado cuenta de una cosita...

Yo me declaro la superficie de trabajo con el siguiente codigo.
CSize sizeTotal(4200,2970); //420x297 mm = DINA3
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_TEXT, sizeTotal, sizePage, sizeLine); //esto son pixeles

Cuando uso la opcion de MM_TEXT me funciona todo a la perfeccion, pero cuando uso MM_LOMETRIC resulta que, no me da fallo ninguno, pero funciona mal. Lo que ocurre es que si tengo la ventana en un tamaño, me voy a la esquina de abajo a la derecha y meto un elemento en el borde... se queda ahi y puedo ir arriba y abajo sin problemas, que el objeto se mueve con la pantalla a la perfeccion. Pero si modifico el tamaño de la ventana agrandandolo, 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). Y si hago la pantalla mas pequeña, entonces deja de estar en la esquina para pasarse hacia el centro (es decir, gano superficie de trabajo)

Llevo todo el dia con ello haciendo pruebas de 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, los metodos de Get me dan lo mismo poniendo "Device" que sin ponerlo. Y el Rango y el sizeTotal coinciden.

A base de pruebas y apuntarme los resultados he descubierto que, el Rango depende de los valores introducidos en sizeTotal, la posicion de la barra aumenta en sizePage o en sizeLine segun se clicka 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 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.

Por lo que, cuanto menor es el tamaño de la pantalla, mas lejos llegan a poder ubicarse mis elementos. Dicha ubicacion de elementos la hago asi (version resumida):

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

y luego uso el valor final para guardarlo en el campo Coordenadas de mi objeto y con eso es con lo que luego los presento en la pantalla en otra funcion.

Lo que me mosquea es: Para el caso de tamaños por defecto (nada mas ejecutarse el programa). Si me voy al final del scroll (tanto horizontal como vertical) y ubico un elemento en la esquina inferior derecha. Deberia de guardarse en
Coordenadas = ClientRect + ScrollPos (= Rango) - DistanciaDelClickALosBordes
o sea, algo menor al rango que para este caso es (1195, 845). Sin embargo se me estan guardando las coordenadas (2622, 2222), pero se queda visible en punto donde yo le di cuando se supone que esos valores estan fuera de la vista.

Se que lo puedo solucionar si uso el metodo LPtoDP, pero no logro hacerlo funcionar bien ni a la de tres. He estado recibiendo fallos de compilacion, hasta que al final ya no me ha dado mas. El codigo con el que logro ejecutar mi programa sin errores de compilacion a la hora de guardar las coordenadas es:
CPoint *caPoints = new CPoint[1];
caPoints[0].x = point.x;
caPoints[0].y = point.y;

CPoint cpTempPoint;
CPoint cpScrollPoint = GetScrollPosition ();

CClientDC dc(this);
CDC dcMem;
dcMem.LPtoDP (caPoints,1);

cpTempPoint.x = caPoints[0].x;
cpTempPoint.y = caPoints[0].y;

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

Pero cuando ejecuto el programa y añado un elemento nuevo recibo un "Assertion Fail". Si lo ignoro me sigue dejando los elementos como estaban antes (es decir con todo lo que comento arriba) y si le digo que me enseñe el fallo me manda a afxwin1.inl, linea 629.
Es decir, a la segunda linea de este codigo:

_AFXWIN_INLINE void CDC::LPtoDP(LPPOINT lpPoints, int nCount) const
{ ASSERT(m_hAttribDC != NULL); VERIFY(::LPtoDP(m_hAttribDC, lpPoints, nCount)); }
_AFXWIN_INLINE void CDC::LPtoDP(LPRECT lpRect) const
{ ASSERT(m_hAttribDC != NULL); VERIFY(::LPtoDP(m_hAttribDC, (LPPOINT)lpRect, 2)); }

Y ya no se que mas hacer... Alguna idea por favor? o algun ejemplo de como co..nes debo usar el LPtoDP que este en condiciones?

Gracias
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

Mas Cosas

Publicado por Nelek (816 intervenciones) el 14/06/2006 14:22:48
Siguiendo a ver si logro hacer que funcione he descubierto que hay un patron fijo en mi problema, resulta que (supongo que por el desfase de unidades logicas y de dispositivo) hay un incremento de 30 por cada linea de scroll desplazado.

Es decir:
-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.

Nada, a ver si es cierto eso del que la sigue la consigue... Aunque una respuesta acertada me podria ahorrar muchisimo tiempo (que precisamente esta empezando a escasearme)
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

"Assertion Fail" solucionado

Publicado por Nelek (816 intervenciones) el 14/06/2006 16:54:10
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);

Así ya no me da ningun fallo y 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

Pero el problema del desfase entre las posiciones de la vista y del documento sigue y ya no se que hacer.

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 respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mucho lio, mejor arriba

Publicado por Nelek (816 intervenciones) el 14/06/2006 17:52:52
Voy a reescribir el mensjae para quitar del medio lo que ya he solucionado, ordenarlo y estructurarlo un poco mejor. Que este hilo esta muy liado
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