Manuel,
Como el fondo de las reglas es de color celeste, el invertir el color podr铆a servir pues se ver铆a oscuro.
Cristobal, lo tienes ya casi implementado 贸 me pongo con ello ? gracias ![]()
Manuel,
Como el fondo de las reglas es de color celeste, el invertir el color podr铆a servir pues se ver铆a oscuro.
Cristobal, lo tienes ya casi implementado 贸 me pongo con ello ? gracias ![]()
...
drawRulerLines( oApp:aRulerBmp1[nArea], nRulerTop, nRuler, nColPos )
// AEVAL( aRuler, {|x,y| IIF( x[1] <> NIL, ;
// ( x[1]:Move( nRulerTop-nRuler, nColPos, 1, ;
// IIF( lShow, ER_GetPixel( oGenVar:aAreaSizes[y,2] ) + nRuler, nRuler ), .T. ) ), ) } )
...
FUNCTION drawRulerLines( oRulerBmp, nRulerTop, nRuler, nColPos )
LOCAL hDC := oRulerBmp:GetDC()
if !empty( aOldRect )
InvertRect(hDC , aOldRect )
endif
aNewRect := { nRulerTop - (nRuler+10 ), nColPos-2, nRulerTop , nColPos }
InvertRect( hDC , aNewRect )
aOldRect := aNewRect
oRulerBmp:ReleaseDC()
RETURN nilManuel,
Voy a probarlo, gracias! ![]()
Hay que implementar el evento de abandono de superficie para eliminar ese 煤ltimo pintado:
METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS ...
TrackMouseEvent( ::hWnd, TME_LEAVE )
...
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS ...
if nMsg == WM_MOUSELEAVE
return ::MouseLeave( nHiWord( nLParam ), nLoWord( nLParam ), nWParam )
endif
...
METHOD MouseLeave( nRow, nCol, nFlags ) CLASS ...
::lMOver = .F.
::Refresh()
return nil
Lo 煤nico que como son ventanas MDICHILD vamos a tener que derivar 贸 a帽adir esos m茅todos dinamicamente (no se si funcionar谩)
Manuel,
Tenemos que hacer el pintado vertical en todas las areas, porque por ejemplo el usuario puede querer alinear un item de un area con otro de otra area.
En tal caso, casa regla deber铆a tener sus ultimas coordenadas de dibujo...
Manuel,
Partiendo de tu c贸digo lo he implementado, a falta de implementar el c贸digo de s谩lida de 谩rea.
El problema que tenemos ahora es que al pasar por encima de un control (item) no se pinta.
A ver que se nos ocurre...
Tenemos que hacer lo mismo en el pintado lateral...
Os acordais de en donde se creaban los SAYs usados para esas l铆neas verticales ? Tenemos que eliminar el de arriba...
en : FillWindow( nArea, cAreaIni ) linea 1414 apox.
He modificado el c贸digo que acababa de subir, me hab铆a liado con los aRulers ![]()
En realidad pintamos directamente sobre las ventanas MDIChild que estan en aWnd
Poco a poco enter茅ndonos de en donde est谩 cada cosa ![]()
La soluci贸n funciona muy bien
Pero si hay alguna "regla" que no aparece entera en la pantalla, al desplazarte hacia abajo se queda la marca y ya no se quita
Habr铆a, o bien, hacer un refresh de ese bmp cuando aparece totalmente o no dibujar si las "reglas" no son totalmente visibles
Espero haberme explicado
function DeclarePublics( cDefFile )
.../...
聽 聽PUBLIC oRulerBmp1 := {}
聽 聽PUBLIC oRulerBmp2 := {}
聽 聽PUBLIC nRuler 聽 聽:= 20
聽 聽PUBLIC nRulerTop := 37
.../...function FillWindow( nArea, cAreaIni )
.../...
聽 聽if Len( oRulerBmp1 ) < nArea
聽 聽 聽 AAdd( oRulerBmp1, nil )
聽 聽endif
聽 聽if Len( oRulerBmp2 ) < nArea
聽 聽 聽 AAdd( oRulerBmp2, nil )
聽 聽endif
聽 聽@ nRulerTop-nRuler, 20 BITMAP oRulerBmp1[ nArea ] RESOURCE cRuler1 OF aWnd[nArea] PIXEL NOBORDER
聽 聽@ nRulerTop-nRuler, 聽0 BITMAP oRulerBmp2[ nArea ] RESOURCE cRuler2 OF aWnd[nArea] PIXEL NOBORDER
.../...Antonio Linares wrote:Manuel,
.../...
El problema que tenemos ahora es que al pasar por encima de un control (item) no se pinta.
A ver que se nos ocurre...
function DrawRulerLines( oWnd, nColPos, nRowPos )
聽 聽local aPoint 聽 := { nRowPos, nColPos }
聽 聽local aPointI 聽:= aPoint
聽 聽local y
聽 聽local z 聽 聽 聽 聽:= 0
聽 聽local lSw 聽 聽 聽:= .F.
聽 聽local hDC 聽 //:= oWnd:GetDC()
聽 聽For y = 1 to len( aItems )
聽 聽 聽 聽if !empty( aItems[ y, 1 ] )
聽 聽 聽 聽 聽 //ScreenToClient( aItems[ y, 1 ]:hWnd, aPointI )
聽 聽 聽 聽 聽 //ClientToScreen( aItems[ y, 1 ]:hWnd, aPointI )
聽 聽 聽 聽 聽 if IsOverWnd( aItems[ y, 1 ]:hWnd, aPointI[ 1 ], aPointI[ 2 ] )
聽 聽 聽 聽 聽 聽 聽//ScreenToClient( aItems[ y, 1 ]:hWnd, aPoint )
聽 聽 聽 聽 聽 聽 聽oMsgInfo:SetText( " 聽 聽SI 聽 聽 " )
聽 聽 聽 聽 聽 聽 聽z 聽 聽:= y
聽 聽 聽 聽 聽 聽 聽lSw 聽:= .T.
聽 聽 聽 聽 聽 聽 聽y 聽 聽:= len( aItems ) + 1
聽 聽 聽 聽 聽 endif
聽 聽 聽 聽endif
聽 聽Next y
聽 聽hDC := oWnd:GetDC()
聽 聽if !lSw
聽 聽 聽 //hDC := oWnd:GetDC()
聽 聽 聽 if ! Empty( oWnd:Cargo )
聽 聽 聽 聽 聽InvertRect( hDC, oWnd:Cargo )
聽 聽 聽 endif 聽
聽 聽 聽 oWnd:Cargo = { 17, aPoint[ 2 ], 37, aPoint[ 2 ] + 1 }
聽 聽 聽 InvertRect( hDC, oWnd:Cargo )
聽 聽else
聽 聽 聽 if ! Empty( aItems[ z, 1 ]:Cargo )
聽 聽 聽 聽 聽InvertRect( hDC, aItems[ z, 1 ]:Cargo )
聽 聽 聽 endif 聽
聽 聽 聽 ClientToScreen( aItems[ z, 1 ]:hWnd, aPoint )
聽 聽 聽 aItems[ z, 1 ]:Cargo = { 17, aPoint[ 2 ], 37, aPoint[ 2 ] + 1 }
聽 聽 聽 InvertRect( hDC, aItems[ z, 1 ]:Cargo )
聽 聽endif
聽 聽oWnd:ReleaseDC()
return nilCristobal,
En realidad no necesitamos guardar los bitmaps de los rulers puesto que el pintado se hace encima de la propia ventana.
Acabo de subir unos cambios para el pintado horizontal.
La soluci贸n ser铆a que todos los items en su bMMoved llamen a la funci贸n SetReticule()
A ver si damos con el sitio correcto para hacer tal asignaci贸n
En cuanto la salida del rat贸n del area de la ventana, a ver que hacemos porque si modificamos la clase TMdiChild estariamos modificando todas las MdiChilds de la aplicaci贸n y eso no es correcto. Vamos a tener que crear una clase derivada de TMdiChild...
Critobal, Manuel,
En eritems.prg function ElementActions() he definido el bMMoved de los items para que llamen a SetReticule() convirtiendo las coordenadas recibidas en el item a coordenadas de su ventana padre (un Area). En principio lo hace bien pero se ve un parpadeo en la ultima posici贸n pintada en el padre.
Lo he subido a bitbucket y a ver si se nos ocurre como quitar ese parpadeo 贸 por que ocurre.
Se agradece ayuda! ![]()
Solucionado y subido a bitbucket ![]()
Solo falta ya controlar cuando el rat贸n se marcha de un area. Tambien si hacemos scroll previamente hay que apagar las l铆neas pintadas.