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


0