Page 1 of 1
Revisando por alto el treeview
Posted: Thu Aug 21, 2014 8:47 pm
by mastintin
Veo que no es el treeview de fivewin y existen _ ... como primera aproximación seria bueno tener un comando que cree el treeview desde recursos ....
Una primera modificación :
A añadir al código de fivewin ( yo no he encontrado que tengamos algo )
En fivewin.ch
Code: Select all
#xcommand REDEFINE TREEVIEW [<oTV>] ;
[ ID <nId> ];
[ <of: OF, WINDOW, DIALOG> <oWnd> ] ;
[ <design: DESIGN> ] ;
[ COLOR <nClrFore> [,<nClrBack>] ] ;
[ MESSAGE <cMsg> ] ;
[ ON CHANGE <uChange,...> ] ;
=> ;
[ <oTV> := ] TTreeView():Redefine( <nId>, <oWnd>, <nClrFore>, <nClrBack>,;
[<.design.>], [<cMsg>], [ { | nOption, nOldOption | <uChange> } ] )
y en la clase ...
Code: Select all
METHOD ReDefine( nId, oWnd, nClrFore, nClrBack, lDesign, cMsg , bChange ) CLASS TTreeView // añadido bChange
......
::nClrText = nClrFore
::nClrPane = nClrBack
::bChanged = bChange // añadido
.....
Re: Revisando por alto el treeview
Posted: Thu Aug 21, 2014 9:49 pm
by Antonio Linares
Manuel,
Implementado, muchas gracias!
Re: Revisando por alto el treeview
Posted: Fri Aug 22, 2014 3:16 pm
by mastintin
Tenemos 2 problemas localizados con los treeview de fwh ...
1.- Si usamos SetDlgGradient() los items no se refrescan correctamente al hacer scroll .
2.- En el treeview de easyreport se usas checks pero solo en algunos de los items . Si activamos los checks para los treeview se activan en todos los nodos .
Una opción seria poder ocultar los checks en los nodos que no se utilicen ...
He encontrado este código que hace eso :
private void HideCheckBox(TreeView tvw, TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}
Antonio seria bueno implementar un metodo nuevo que use este código .
P.D. para mantener la compatibilidad con versiones antiguas de fwH tendremos que adjuntar un archivo ER_Treeview que sea una clase derivada de ttreeview pero que incluya _ .
Re: Revisando por alto el treeview
Posted: Fri Aug 22, 2014 3:26 pm
by Antonio Linares
Manuel,
Vamos a enfocarnos en que funcione aunque haya que modificar FWH y ya me encargo yo de buscar la compatibilidad con versiones anteriores
Re: Revisando por alto el treeview
Posted: Fri Aug 22, 2014 11:32 pm
by mastintin
Ya tengo casi terminado el tema de los treeview y sin ningún cambio en el código de la clase
.
Me ha tenido loco por nombres de bmps que aparecían en el código y que daba por hecho que existían y luego no estaban ...
Al final falta incorporar unos bmps mas a las imagelist .
Tenemos un problema con el refresco del treeview si colocamos el dialogo con degradado de fondo por lo que de momento lo he deshabitado .
Subido el código al repositorio .
Re: Revisando por alto el treeview
Posted: Sat Aug 23, 2014 10:05 am
by mastintin
Posibles mejoras para el treeview de Fwh :
Code: Select all
METHOD New( nTop, nLeft, oWnd, nClrFore,;
nClrBack, lPixel, lDesign, nWidth, nHeight, cMsg, lCheckBoxes, bChange, acResName, acBmpFile ) CLASS TTreeView // añadido ultimo parámetro un array de nombres de bmp en recursos
......
if lDesign
::CheckDots()
endif
IF ! Empty( acResname ) .or. ! Empty( acBmpFile )
::CreateTreeImageList( acResname , acBmpFile ) // procesamos y creamos el ImageList
endif
return Self
ReDefine( nId, oWnd, nClrFore, nClrBack, lDesign, cMsg , bChange,, acResname, acBmpFile ) CLASS TTreeView // añadido ultimo parámetro un array de nombres de bmp en recursos
....
oWnd:DefControl( Self )
IF ! Empty( acResname ) .or. ! Empty( acBmpFile )
::CreateTreeImageList( acResname , acBmpFile ) // procesamos y creamos el ImageList
endif
return Self
//------------------------------------------------------------------------------
METHOD CreateTreeImageList( acResname, acBmpFile ) CLASS TTreeView // nuevo metido procesa el array y crea imagelist
LOCAL i,oBmp
LOCAL nLen
LOCAL oImageList := TImageList():New()
if !Empty (acResname)
nLen:= Len( acResname )
oBmp = TBitmap():Define( acResName[i], ::oWnd )
oImageList:Add( oBmp,setMasked( oBmp:hBitmap, ::nClrPane ) )
endif
if !Empty ( acBmpFile )
nLen:= Len( acBmpFile )
FOR i=1 TO nLen
oBmp = TBitmap():Define( ,acBmpFile[i], ::oWnd )
oImageList:Add( oBmp,setMasked( oBmp:hBitmap, ::nClrPane ) )
NEXT
endif
::SetImageList( oImageList )
RETURN nil
// function setMasked( oBmp , mascara ) que genera la mascara del bmp ... He probado el Methodo de imagelist addmasked y no va como esperaba .
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
void MaskRegion(HDC hdc, RECT * rct,
COLORREF cTransparentColor,
COLORREF cBackgroundColor);
HB_FUNC( SETMASKED ) // ( hBitmap , lMaskColor) --> nil
{
HBITMAP hBitmap ;
DWORD lMaskColor ;
HDC hDC ;
BITMAP Bmp ;
RECT rct ;
hBitmap = ( HBITMAP ) hb_parnl( 1 ) ;
lMaskColor = hb_parnl( 2 ) ;
hDC = CreateCompatibleDC( NULL ) ;
GetObject( hBitmap, sizeof( BITMAP ), ( LPSTR ) &Bmp ) ;
SelectObject( hDC, ( HGDIOBJ ) LOWORD( hBitmap ) ) ;
rct.top = 0 ;
rct.left = 0 ;
rct.right = Bmp.bmWidth - 1 ;
rct.bottom = Bmp.bmHeight -1 ;
MaskRegion( hDC, &rct, GetPixel( hDC, 0, 0 ), lMaskColor ) ;
DeleteDC( hDC ) ;
}
#pragma ENDDUMP