Page 1 of 1

Problemas al crear la libreria TWBROWSE

Posted: Fri Jan 04, 2013 9:55 am
by ander7319
Estoy intentado crear la libreria TWBROWSE con Harbour 2.0 y FWH 1104 y me dan los siguientes errores: si alguien pudiera ayudarme....


Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
.\source\function\twbrowse\WBRWLINE.C:
Error E2356 .\source\function\twbrowse\WBRWLINE.C 38: Type mismatch in redeclaration of 'hb_storvni'
Error E2344 C:\utilp_5\hb20\INCLUDE\hbapi.h 778: Earlier declaration of 'hb_storvni'
Error E2356 .\source\function\twbrowse\WBRWLINE.C 39: Type mismatch in redeclaration of 'hb_parvnl'
Error E2344 C:\utilp_5\hb20\INCLUDE\hbapi.h 664: Earlier declaration of 'hb_parvnl'
Error E2356 .\source\function\twbrowse\WBRWLINE.C 40: Type mismatch in redeclaration of 'hb_parvni'
Error E2344 C:\utilp_5\hb20\INCLUDE\hbapi.h 663: Earlier declaration of 'hb_parvni'
Error E2356 .\source\function\twbrowse\WBRWLINE.C 41: Type mismatch in redeclaration of 'hb_storvnl'
Error E2344 C:\utilp_5\hb20\INCLUDE\hbapi.h 779: Earlier declaration of 'hb_storvnl'
*** 8 errors in Compile ***



FICHERO WBRWLINE.C

void * __conArrayGet( void *, void *, ... );
long __conGetNL( void *, long * );
long __conRelease( void * );

#include <Windows.h>
#ifdef __HARBOUR__
#include <hbapi.h>
#include <hbapiitm.h>
#include <hbvm.h>
// #include <hbfast.h>
#define MoveTo( hDC, x, y ) MoveToEx( hDC, x, y, NULL )
#define _PutSym( _SymEval ) hb_vmPushSymbol( &hb_symEval )
#define _xPushM hb_vmPush
#define _PutLN hb_vmPushLong
#define _xEval hb_vmDo
#define _cEval0 hb_vmEvalBlock
#define _Get_Sym hb_dynsymFindName
#endif

#define LOGICAL HB_IT_LOGICAL
#define NUMERIC HB_IT_NUMERIC
#define CHARACTER HB_IT_STRING
#define BLOCK HB_IT_BLOCK

#define HA_LEFT 0 // by CeSoTech Alineaciones Horizontales y Verticales
#define HA_RIGHT 1
#define HA_CENTER 2
#define VA_TOP 4
#define VA_BOTTOM 8
#define VA_CENTER 32

#ifdef __FLAT__
#undef PCLIPVAR
#define PCLIPVAR PHB_ITEM
#endif

#ifdef __XHARBOUR__
void hb_storvni( int iValue, int iParam, int iIndex );
long hb_parvnl( int iParam, int iIndex );
int hb_parvni( int iParam, int iIndex );
void hb_storvnl( LONG lValue, int iParam, int iIndex );
#endif



static far BOOL bAdjLastCol ; // CeSoTech
static far BOOL bAdjBrowse ; // CeSoTech
static far BOOL bDrawHeaders ; // CeSoTech
static far BOOL bDrawFooters ; // CeSoTech
static far WORD wHeaderHeight; // CeSoTech
static far WORD wFooterHeight; // CeSoTech
static far WORD wLineHeight ; // CeSoTech

static far BOOL bWorking;

WORD WBrwRowsC( HWND hWnd, HDC hDC, HFONT hFont ); // CeSoTech

static void FW_DrawText( HDC hDC, RECT * rct, LPCSTR pText,
WORD wAlign, int iLen, HFONT hFont,
BOOL bHeadFoot ) ; // CeSoTech
static void FW_DrawBitmapCenter( HDC hDC, HBITMAP hBmp, RECT * rct, WORD nStyle, BOOL bFocused ) ;

void MaskRegion( HDC hDC, RECT * rct, COLORREF cTrColor,
COLORREF cBackColor );

FrameDot( HDC hDC, RECT * pRect );

extern void WndDrawBox( HDC, LPRECT, HPEN, HPEN );
extern void DrawBitmap( HDC, HBITMAP, WORD wCol, WORD wRow, WORD wWidth,
WORD wHeight, DWORD dwRaster );


static void near PaintTheLine( HDC hDC, RECT * rct, WORD wIndex,
PCLIPVAR pAtext, PCLIPVAR pAsizes,
HPEN hWhitePen, HPEN hGrayPen, BOOL bTree,
PCLIPVAR pAJustify, WORD wPressed,
BOOL bHeader, WORD nStyle,
WORD nFocus, BOOL bFocused,
PCLIPVAR pTextColor, PCLIPVAR pBkColor,
WORD wRowPos, WORD nHeightCtrl,
LONG nClrLine, BOOL bFooter,
BOOL bSelect, PCLIPVAR pFont,
BOOL bDrawFocusRect ) ;



void DrawMasked( HDC, HBITMAP, WORD wCol, WORD wRow );
// LOW HIGH
extern int _dvtoi( DWORD, DWORD );
void MsgStr( long l );
LPSTR Str( WORD w );

#ifndef __FLAT__
static int near GetInt( PCLIPVAR Array, WORD wIndex );
static far PCLIPSYMBOL pSkip = 0;
#else
static long near GetInt( void * Array, WORD wIndex );
PHB_DYNS pSkip = NULL;
#endif

//---------------------------------------------------------------------------//

static void MaskRegion( HDC hdc, RECT * rct, COLORREF cTransparentColor,
COLORREF cBackgroundColor )

{
HDC hdcTemp, hdcObject, hdcBack, hdcMem;
POINT ptSize;
COLORREF cColor;
HBITMAP bmAndObject, bmAndBack, bmBackOld, bmObjectOld,
bmAndTemp, bmTempOld, bmAndMem, bmMemOld;
HBRUSH hBrush, hBrOld;

ptSize.x = rct->right - rct->left + 1;
ptSize.y = rct->bottom - rct->top + 1;

hBrush = CreateSolidBrush(cBackgroundColor);

hdcTemp = CreateCompatibleDC(hdc);
hdcObject = CreateCompatibleDC(hdc);
hdcBack = CreateCompatibleDC(hdc);
hdcMem = CreateCompatibleDC(hdc);

bmAndTemp = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

bmTempOld = SelectObject(hdcTemp, bmAndTemp);
bmMemOld = SelectObject(hdcMem, bmAndMem);
bmBackOld = SelectObject(hdcBack, bmAndBack);
bmObjectOld = SelectObject(hdcObject, bmAndObject);

hBrOld = SelectObject(hdcMem, hBrush);

BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdc, rct->left, rct->top, SRCCOPY);

SetMapMode(hdcTemp, GetMapMode(hdc));

cColor = SetBkColor(hdcTemp, cTransparentColor);

BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

SetBkColor(hdcTemp, cColor);

BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
PatBlt(hdcMem, 0,0, ptSize.x, ptSize.y, PATCOPY);
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);
BitBlt(hdc, rct->left, rct->top, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);

DeleteObject(SelectObject(hdcMem, hBrOld));
DeleteObject(SelectObject(hdcTemp, bmTempOld));
DeleteObject(SelectObject(hdcMem, bmMemOld));
DeleteObject(SelectObject(hdcBack, bmBackOld));
DeleteObject(SelectObject(hdcObject, bmObjectOld));
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcTemp);
}

//---------------------------------------------------------------------------//

#ifdef __CLIPPER__
static int near GetInt( PCLIPVAR Array, WORD wIndex )
{
int iRet = 0;
_cAt( Array, wIndex, -1, ++_tos );

if( _tos->wType & NUMERIC )
iRet = (int) _tos->pPointer1;

else if( _tos->wType & NUM_FLOAT )
iRet = _dvtoi( (DWORD) _tos->pPointer1, (DWORD) _tos->pPointer2 );

--_tos;

return iRet;
}
#endif

#ifdef __XPP__
static long GetInt( void * Array, WORD wIndex )
{
void * chItem = 0;
long l;

__conArrayGet( Array, chItem, wIndex, 0 );
__conGetNL( chItem, &l );
__conRelease( chItem );

return l;
}
#endif

#ifdef __HARBOUR__
#define GetInt( Array, wIndex ) hb_arrayGetNL( Array, wIndex )
#endif

//-----------------------------------------------------------------------=
// ÚÄ1ra Col.a Pintar
// ³
static void near PaintTheLine( HDC hDC, RECT * rct, WORD wIndex,
PCLIPVAR pAtext, PCLIPVAR pAsizes,
HPEN hWhitePen, HPEN hGrayPen, BOOL bTree,
PCLIPVAR pAJustify, WORD wPressed,
BOOL bHeader, WORD nStyle,
WORD wFocus, BOOL bFocused,
PCLIPVAR pTextColor, PCLIPVAR pBkColor,
WORD wRowPos, WORD nHeightCtrl,
LONG nClrLine, BOOL bFooter,
BOOL bSelect, PCLIPVAR pFont,
BOOL bDrawFocusRect )
{
RECT box, wholebox, rctadj;
int iMaxRight = rct->right;

WORD wLenJust = 0 ;
#ifndef __HARBOUR__
WORD wLen = _VARRAYLEN( pAtext );
CLV_WORD lJustify;
#else
WORD wLen = hb_arrayLen( pAtext );
PHB_ITEM uElem = hb_itemNew( NULL );
#endif
WORD wType, wcLen;
LONG lValue;
char * cValue;
HPEN hOldPen, hPen;
BITMAP bmp;
WORD wRow, wCol;
LONG lColor ;
HBRUSH hBrush;
LONG lTextColorOld = -1 ; // CeSoTech
LONG lBkColorOld = -1 ; // CeSoTech
PCLIPVAR pEvalOld ;
HFONT hFont ; // CeSoTech
WORD wAlign ; // CeSoTech

// CeSoTech
LONG nClrLineC = ( nStyle == 2 || nStyle == 6 || nStyle == 8 ||
nStyle == 10 ) ? GetSysColor( COLOR_BTNSHADOW ) : 0 ;

// CeSoTech
if ( nClrLine >= 0 ) // Desde Clipper manda color especifico linea
nClrLineC = nClrLine ;

if ( ! bDrawHeaders )
bHeader = FALSE ;

if ( bFooter )
bHeader = TRUE ; //-> Para que lo pinte con similar aspecto

//CeSoTech
// Si es un estilo sin separadores horizontales, pintar uno mas arriba
//CeSoTech para que que bien completa el area !!!
if ( ! (bHeader) && (nStyle == 0 || nStyle == 5 || nStyle == 6 ||
nStyle == 9 || nStyle == 10) )
rct->top-- ;

wholebox.top = rct->top+1;
wholebox.left = rct->left;
wholebox.bottom = rct->bottom;
wholebox.right = rct->right;

rct->right = 0;

box.top = rct->top ;
box.bottom = rct->bottom - 1;

if( !wIndex | wIndex > wLen )
wIndex = 1;

if ( pAJustify )
#ifndef __HARBOUR__
wLenJust = _VARRAYLEN( pAJustify );
#else
wLenJust = hb_arrayLen( pAJustify );
#endif

while( wIndex <= wLen )
{

rct->left = rct->right;

rct->right = ( wIndex == wLen ? iMaxRight
: rct->left + GetInt( pAsizes, wIndex ) );
// CeSoTech // Cuando estoy estoy en la ultima celda, NO pintar hasta
// el final si no existe ajuste de ultima columna.
if ( ( wIndex == wLen ) && ( ! bAdjLastCol ) )
{
rct->right = rct->left + GetInt( pAsizes, wIndex ) +(bHeader ? 1: 0) ;
if ( !bAdjBrowse )
wholebox.right = rct->right ; // Tambien ajusto el borde focus

}
// CeSoTech //


wAlign = HA_LEFT | VA_CENTER ; // Alineacion por defecto
wcLen = 0;
///////// INICIO Toma de datos celda !!!

#ifndef __HARBOUR__
if ( wIndex <= wLenJust )
{
_cAt( pAJustify, wIndex, 0xFFFF, ( PCLIPVAR ) &lJustify );
wAlign = lJustify.wWord ;
}
_cAt( pAtext, wIndex, 0xFFFF, ++_tos );
wType = _tos->wType;
if ( wType & NUMERIC )
lValue = (LONG) _tos->pPointer1;
if ( wType & CHARACTER )
{
cValue = _VSTR( _tos );
wcLen = _tos->w2;
}
#else

if ( wIndex <= wLenJust )
{
hb_arrayGet( pAJustify, wIndex, uElem );
if ( ( hb_itemType( uElem ) & LOGICAL ) && hb_itemGetL( uElem ) )
wAlign = HA_RIGHT | VA_CENTER ;
else
wAlign = hb_itemGetNL( uElem );

hb_itemClear( uElem );
}

// uElem.type = HB_IT_NIL;
hb_arrayGet( pAtext, wIndex, uElem );
wType = hb_itemType( uElem );
if ( wType & NUMERIC )
lValue = hb_itemGetNL( uElem );
if ( wType & CHARACTER )
{
// cValue = hb_itemGetC( uElem );
cValue = ( char * ) hb_itemGetCPtr( uElem );
wcLen = strlen( cValue );
}

#endif
///////// FIN Toma de datos celda !!!



if( wFocus > 0 && wIndex != wFocus )
{
#ifndef __HARBOUR__
_tos--;
#endif

if( rct->right >= iMaxRight )
{
wIndex = wLen + 1; // ya no pintamos m s
}
else
++wIndex;
continue;
}

if( bTree ||
(GetInt( pAsizes, wIndex ) > 0) ) //Si NO es columna oculta (x Freeze)
{ //(Es lo mismo no hacer esto,
// pero es para evitar hacer trabajar
// al codigo sin sentido !!! )

if( (wType & NUMERIC) && bTree )
{
if( lValue )
{
FillRect( hDC, rct, hBrush = CreateSolidBrush( GetPixel( hDC, rct->left, rct->top ) ) );
DrawMasked( hDC, (HBITMAP) lValue, rct->top, rct->left );
DeleteObject( hBrush );
}

}
else // Si es Numerico Bmp no Tree, o , es Character !!!!
{

if ( pBkColor ) // Bloque de Color Fondo Celda
{
_PutSym( _SymEval );
_xPushM( pBkColor );
_PutLN( wRowPos );
_PutLN( wIndex );
_PutLN( bFooter ? 2 : ( bHeader ? 1 : ( bSelect ? 3 : 0 ) ) );
_xEval( 3 ) ;
if ( hb_parinfo( -1 ) & NUMERIC )
lBkColorOld = SetBkColor( hDC, hb_parnl( - 1 ) ) ;
}

if( pTextColor ) // Bloque de Color Texto Celda
{
_PutSym( _SymEval );
_xPushM( pTextColor );
_PutLN( wRowPos );
_PutLN( wIndex );
_PutLN( bFooter ? 2 : ( bHeader ? 1 : ( bSelect ? 3 : 0 ) ) );
_xEval( 3 ) ;
if ( hb_parinfo( -1 ) & NUMERIC )
lTextColorOld = SetTextColor( hDC, hb_parnl( - 1 ) ) ;
}

hFont = 0 ;
if( pFont ) // Bloque de Font Celda
{
_PutSym( _SymEval );
_xPushM( pFont );
_PutLN( wRowPos );
_PutLN( wIndex );
_PutLN( bFooter ? 2 : ( bHeader ? 1 : ( bSelect ? 3 : 0 ) ) );
_xEval( 3 ) ;
if ( hb_parinfo( -1 ) & NUMERIC )
hFont = (HFONT) hb_parnl( - 1 ) ;
}


/////// CeSoTech ///////
if (!bHeader) rct->top ++;


if( wType & NUMERIC ) // Es un BitMap
{
FW_DrawBitmapCenter( hDC, (HBITMAP) lValue, rct, nStyle, bSelect );
}
else // Es una Cadena
{
FW_DrawText( hDC, rct,
( wType & CHARACTER ) ? cValue : "",
wAlign, wcLen, hFont, bHeader ) ;
}


/////// CeSoTech restauracion de colores //////
if ( lTextColorOld >= 0 )
{
SetTextColor( hDC, lTextColorOld ) ;
lTextColorOld = -1 ;
}
if ( lBkColorOld >= 0 )
{
SetBkColor( hDC, lBkColorOld ) ;
lBkColorOld = -1 ;
}


/// CeSoTech ///
// Si hay modalidad ajustar el Browse y no hay ajuste de ultima
// columna, deber‚ pintar hasta el final hasta cubrir toda
// el area, hasta llegar a la derecha del control. (Col.Ficticia)
if ( bAdjBrowse && wIndex == wLen && !bAdjLastCol &&
rct->right <= iMaxRight )
{
rctadj.top = rct->top;
rctadj.left = rct->right ;
rctadj.bottom = rct->bottom;
rctadj.right = wholebox.right ;

if ( nStyle == 3 )
rctadj.top--;

if ( wFocus == 0 ) // Si No es CellStyle (Pinto hasta final)
ExtTextOut( hDC, 0, rct->top, ETO_OPAQUE, &rctadj, "", 0, 0 );

if ( bHeader && nStyle==3 ) // Pinto Bordes Header Falso
{
rctadj.right = wholebox.right - 2 ;
rctadj.bottom = rctadj.bottom - 2 ;
WndDrawBox( hDC, &rctadj, hWhitePen, hGrayPen );
rctadj.bottom++ ;
rctadj.right++ ;
WndDrawBox( hDC, &rctadj, hWhitePen, GetStockObject( BLACK_PEN ) );

if ( bFooter ) // Si es Footer (Linea Negra de Arriba Foot)
{
hPen = GetStockObject( BLACK_PEN );
hOldPen = SelectObject( hDC, hPen );
MoveTo( hDC, rctadj.left-1, rctadj.top-1 );
LineTo( hDC, rctadj.right+1, rctadj.top-1 );
SelectObject( hDC, hOldPen );
}

}

}
/// CeSoTech Fin ///

if (!bHeader) rct->top --;
}

box.left = rct->left;

box.right = ( wIndex < wLen && rct->right <= iMaxRight ?
rct->right - 1 :
iMaxRight - 1 );

// CeSoTech // El Borde derecho de Box de la ultima columna,
// no estirarlo cuando no exista ajuste de ultima columna
// PERO cuando nLineStyle (nStyle) es 7/8 (Lineas Horiz)
// queda anti-estetico cortar los renglones, cuando no hay
// ajuste ult.col. y hay ajuste de browse. Por ello
// se verificara que para cortar el borde no se de esta
// condicion.
if ( ( wIndex == wLen ) && ( ! bAdjLastCol ) )
{
if (! (!bHeader && (nStyle==7 || nStyle==8) && !bAdjLastCol && bAdjBrowse) )
box.right = rct->left + GetInt( pAsizes, wIndex ) - 1 ;
}
// CeSoTech //



if( ! bTree )
{
if( wPressed && ( wIndex == wPressed ) )
{
WndDrawBox( hDC, &box, hGrayPen, hWhitePen );
}
else
///////////// if(!bHeader)
if(!bHeader || (bHeader && nStyle!=3) )
{
switch( nStyle )
{
case 0:
break;
case 1:
// hOldPen = SelectObject( hDC, GetStockObject( BLACK_PEN ) );
hPen = CreatePen(PS_SOLID, 0, nClrLineC );
hOldPen = SelectObject( hDC, hPen);
MoveTo( hDC, box.left, box.bottom+1 );
LineTo( hDC, box.left, box.top );
LineTo( hDC, box.right+1, box.top );
LineTo( hDC, box.right+1, box.bottom+1 );
LineTo( hDC, box.left, box.bottom+1 );
SelectObject( hDC, hOldPen );
DeleteObject( hPen);
break;
case 2:
hPen = CreatePen(PS_SOLID, 0, nClrLineC );
hOldPen = SelectObject( hDC, hPen);
MoveTo( hDC, box.left, box.bottom+1 );
LineTo( hDC, box.left, box.top );
LineTo( hDC, box.right+1, box.top );
LineTo( hDC, box.right+1, box.bottom+1 );
LineTo( hDC, box.left, box.bottom+1 );
SelectObject( hDC, hOldPen );
DeleteObject( hPen);
break;
case 3:
WndDrawBox( hDC, &box, hWhitePen, hGrayPen );
break;
case 4:
box.bottom ++;
box.right ++;
FrameDot( hDC, &box );
box.bottom --;
box.right --;
break;
case 7:
case 8:
hPen = CreatePen(PS_SOLID, 0, nClrLineC );
hOldPen = SelectObject( hDC, hPen);
MoveTo( hDC, box.left, box.top );
LineTo( hDC, box.right+1, box.top );
MoveTo( hDC, box.right+1, box.bottom+1 );
LineTo( hDC, box.left, box.bottom+1 );
SelectObject( hDC, hOldPen );
DeleteObject( hPen);
break;
case 5:
case 6:
case 9:
case 10:
hPen = CreatePen(PS_SOLID, 0, nClrLineC);
hOldPen = SelectObject( hDC, hPen);
if (box.left>1)
{
MoveTo( hDC, box.left, box.bottom+1 );
LineTo( hDC, box.left, box.top );
}
MoveTo( hDC, box.right+1, box.top );

if ( bDrawFooters && nStyle >= 9 )
{
LineTo( hDC, box.right+1,
nHeightCtrl - (wFooterHeight+1) ) ;
} else {
LineTo( hDC, box.right+1,
nStyle < 9 ? box.bottom+1 : nHeightCtrl );
}

SelectObject( hDC, hOldPen );
DeleteObject( hPen);
break;
}
}
else // Box para Headers !!!
{
box.left ++;

// CeSoTech
if ( bFooter ) // Linea negra sobre el Footer
{
hPen = GetStockObject( BLACK_PEN );
hOldPen = SelectObject( hDC, hPen );
MoveTo( hDC, box.left-1, box.top-1 );
LineTo( hDC, box.right+1, box.top-1 );
SelectObject( hDC, hOldPen );
}

box.right-- ;
box.bottom-- ;
WndDrawBox( hDC, &box, hWhitePen, hGrayPen );
box.bottom++ ;
box.right++ ;
WndDrawBox( hDC, &box, hWhitePen, GetStockObject( BLACK_PEN ) );

box.left --;

}
}
else
{
if( ! ( wType & NUMERIC ) )
{
box.left -= 16;
}
}

// CeSoTech if( bFocused && wFocus > 0 && wIndex == wFocus )
if( bDrawFocusRect && bFocused && wFocus > 0 &&
wIndex == wFocus && nStyle != 3)
{
rct->left++;
rct->top++;
DrawFocusRect( hDC, rct );
rct->left--;
rct->top--;
}

}

#ifndef __HARBOUR__
_tos--;
#endif

if( rct->right >= iMaxRight )
{
wIndex = wLen + 1; // ya no pintamos m s
}
else
++wIndex;


}

if (bDrawFocusRect && !bTree && bFocused && wFocus==0 && nStyle!=3) // CeSoTech
DrawFocusRect( hDC, &wholebox );

hb_itemRelease( uElem );
}

//---------------------------------------------------------------------------//

HB_FUNC( WBRWSELBOX )// ( hWnd, hDC, nRow, nFirstCol, nCurCol,;
// lFocus, aSizes, hFont)
{
HWND hWnd = (HWND) hb_parnl( 1 );
HDC hDC = (HDC) hb_parnl( 2 );
WORD wRow = hb_parni( 3 );
WORD wIndex = hb_parni( 4 );
WORD wCol = hb_parni( 5 );
BOOL bFocused = hb_parl( 6 );
PCLIPVAR pAsizes = hb_param( 7, -1 );
HFONT hFont = (HFONT) hb_parnl( 8 );
BOOL bDestroyDC = FALSE;
TEXTMETRIC tm;
RECT rct;
HFONT hOldFont;

if( ! hDC )
{
bDestroyDC = TRUE;
hDC = GetDC( hWnd );
}

if( hFont )
hOldFont = SelectObject( hDC, hFont );

GetClientRect( hWnd, &rct );
GetTextMetrics( hDC, &tm );

if( hFont )
SelectObject( hDC, hOldFont );

tm.tmHeight += 1;

if ( ! bDrawHeaders ) // By CeSoTech
wRow-- ;

rct.top = tm.tmHeight * wRow ;
rct.bottom = tm.tmHeight * ( wRow + 1) - 1;
rct.left = 0;

while( wIndex < wCol )
rct.left += GetInt( pAsizes, wIndex++ );

rct.right = rct.left+GetInt( pAsizes, wCol ) - 1;

MaskRegion( hDC, &rct, GetBkColor( hDC ), GetSysColor(COLOR_ACTIVECAPTION) );

if( bFocused )
DrawFocusRect( hDC, &rct );

if( bDestroyDC )
ReleaseDC( hWnd, hDC );
}

//---------------------------------------------------------------------------//

HB_FUNC( WBRWLINE ) // ( hWnd, hDC, nRow, aText, aSizes, nFirstItem, ;
// nClrFore, nClrBack, hFont, lTree, aJustify, nPressed,
// nStyle, nColAct, lFocused )
// bTextColor, bBkColor, nClrLine, lFooter, lSelect,
// bFont, lDrawFocusRect ) // New's by CesoTech

{
HWND hWnd = (HWND) hb_parnl( 1 );
HDC hDC = (HDC) hb_parnl( 2 );
WORD wRow = hb_parni( 3 );
BOOL bDestroyDC = FALSE;
WORD wHeight;
RECT rct, box;
PCLIPVAR bClrFore, bClrBack;
COLORREF clrFore = 0;
COLORREF clrBack = 0;
HPEN hGrayPen ;
HPEN hWhitePen ;
HFONT hFont = (HFONT) hb_parnl( 9 );
HFONT hOldFont;
BOOL bTree = hb_parl( 10 );
BOOL bFooter = ISLOG( 19 ) ? hb_parl( 19 ) : FALSE ; // CeSoTech

WORD nHeightCtrl ; // by CeSoTech

hGrayPen = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNSHADOW ) ) ; // RGB( 128, 128, 128 ) );
hWhitePen = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) ); // GetStockObject( WHITE_PEN );


if( hb_pcount() > 6 )
{
if( ISBLOCK( 7 ) )
{
bClrFore = hb_param( 7, HB_IT_BLOCK );
_cEval0( bClrFore );
clrFore = hb_parnl( -1 );
}
else
clrFore = hb_parnl( 7 );
}

if( hb_pcount() > 7 )
{
if( ISBLOCK( 8 ) )
{
bClrBack = hb_param( 8, HB_IT_BLOCK );
_cEval0( bClrBack );
clrBack = hb_parnl( -1 );
}
else
clrBack = hb_parnl( 8 );
}

if( ! hDC )
{
bDestroyDC = TRUE;
hDC = GetDC( hWnd );
}

if( hFont )
hOldFont = SelectObject( hDC, hFont );

GetClientRect( hWnd, &rct );

nHeightCtrl = rct.bottom-rct.top ; // by CeSoTech

SetTextColor( hDC, clrFore );
SetBkColor( hDC, clrBack );

wHeight = wLineHeight + 1 ;

if ( ( wRow == 0 ) && bDrawHeaders ) // Es una Cabecera
wHeight = wHeaderHeight + 1 ;

if ( ! bFooter )
{
if ( ( wRow == 0 ) && bDrawHeaders ) // Es una Cabecera
{
rct.top = 0 ;
rct.bottom = wHeaderHeight + 1 ;
}
else
{
rct.top = ( bDrawHeaders ? wHeaderHeight+1 : 0 ) + (wHeight * (wRow-1) ) ;
rct.bottom = ( bDrawHeaders ? wHeaderHeight+1 : 0 ) + (wHeight * wRow) ;
}

} else {
rct.top = rct.bottom - (wFooterHeight+1) ;
}

rct.left = 0;

PaintTheLine( hDC, &rct, hb_parni( 6 ), hb_param( 4, 0xFFFF ), hb_param( 5, 0xFFFF ),
hWhitePen, hGrayPen, bTree,
ISARRAY(11) ? hb_param( 11, -1 ) : 0, hb_parni( 12 ),
(wRow == 0), hb_parni( 13 ),
hb_parni( 14 ), hb_parl( 15 ),
ISBLOCK( 16 ) ? hb_param( 16, HB_IT_BLOCK ) : 0, // CeSoTech
ISBLOCK( 17 ) ? hb_param( 17, HB_IT_BLOCK ) : 0, // CeSoTech
wRow, nHeightCtrl, // CeSoTech
ISNUM( 18 ) ? hb_parnl( 18 ) : -1, // CeSoTech
bFooter, // CeSoTech
ISLOG( 20 ) ? hb_parl( 20 ) : FALSE, // CeSoTech
ISBLOCK( 21 ) ? hb_param( 21, HB_IT_BLOCK ) : 0, // CeSoTech
ISLOG( 22 ) ? hb_parl( 22 ) : FALSE );// CeSoTech

DeleteObject( hGrayPen );
DeleteObject( hWhitePen );

if( hFont )
SelectObject( hDC, hOldFont );

if( bDestroyDC )
ReleaseDC( hWnd, hDC );

hb_reta( 2 );
hb_storvni( rct.top, -1, 1 );
hb_storvni( rct.bottom, -1, 2 );

}

//---------------------------------------------------------------------------//
HB_FUNC( AWBRWROWDIM )
{
HWND hWnd = (HWND) hb_parnl( 1 );
WORD wRow = (WORD) hb_parnl( 2 );
HFONT hFont = (HFONT) hb_parnl( 3 );
HFONT hOldFont;
HDC hDC = GetDC( hWnd );
TEXTMETRIC tm;

if( hFont )
hOldFont = SelectObject( hDC, hFont );

GetTextMetrics( hDC, &tm );
tm.tmHeight += 1;

if( hFont )
SelectObject( hDC, hOldFont );

ReleaseDC( hWnd, hDC );

hb_reta( 2 );
hb_storvni( tm.tmHeight * wRow++, -1, 1 );
hb_storvni( tm.tmHeight * wRow, -1, 2 );
}

//---------------------------------------------------------------------------//

WORD ScreenBaseX( WORD wX )
{
return 4 * wX / LOWORD( GetDialogBaseUnits() );
}

//---------------------------------------------------------------------------//

WORD ScreenBaseY( WORD wY )
{
return 8 * wY / HIWORD( GetDialogBaseUnits() );
}


//---------------------------------------------------------------------------//
HB_FUNC( WBRWRECT ) // ( hWnd, nRow, aSizes, nFirstItem, nCol,
// nLineStyle, nWidthVScroll )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );

HDC hDC = GetDC( hWnd );
WORD wRow = hb_parni( 2 );
WORD wHeight ;
RECT rct;
WORD nStyle = ISNUM( 6 ) ? hb_parni( 6 ) : -1 ; // CeSoTech


#ifdef __CLIPPER__
PCLIPVAR paSizes = _param( 3, 0x8000 );
WORD wLen = _VARRAYLEN( paSizes );
#else
#ifdef __HARBOUR__
// void * paSizes = ( void * ) _param( 3, HB_IT_ARRAY );
WORD wLen = hb_parinfa( 3, 0 );
#else
void * paSizes = ( void * ) _param( 3, 0x8000 );
WORD wLen = _VARRAYLEN( paSizes );
#endif
#endif
WORD wIndex = hb_parni( 4 );
WORD wCol = hb_parni( 5 );
WORD wMaxRight;
LONG l;

if( !wCol || wCol > wLen )
return;


GetWindowRect( hWnd, &rct );
wMaxRight = rct.right - 2;

wHeight = wLineHeight + 1 ;

rct.top = rct.top + ( bDrawHeaders ? wHeaderHeight+1 : 0 ) +
(wHeight * (wRow-1) ) ;


rct.bottom = rct.top + wHeight;
rct.right = rct.left;

while( wIndex <= wCol )
{
rct.left = rct.right;

#ifndef __FLAT__

rct.right = ( wIndex == wLen && bAdjLastCol ? wMaxRight
: rct.left + GetInt( paSizes, wIndex ) );

#else
#ifndef __HARBOUR__
#define _parnl(x,y) PARNL(x,params,y);
#endif
l = hb_parvnl( 3, wIndex );

rct.right = ( wIndex == wLen && bAdjLastCol ? wMaxRight
: rct.left + l );
#endif

if( rct.right >= wMaxRight )
{
wIndex = wCol + 1; // ya no pintamos m s
rct.right = wMaxRight;
}
else
wIndex++;
}



ReleaseDC( hWnd, hDC );

hb_reta( 4 );

#ifdef __XPP__
#define _storni( x, y, z ) STORNI( x, params, y, z )
#endif


// Si es un estilo sin separadores horizontales, pintar uno mas arriba
//CeSoTech para que que bien completa el area !!!
if (nStyle == 0 || nStyle == 5 || nStyle == 6 || nStyle == 9 || nStyle == 10)
rct.top-- ; // Las coord.de edicion deberan ser mas arriba tambien !!!


hb_storvni( rct.top, -1, 1 );
hb_storvni( rct.left, -1, 2 );
hb_storvni( rct.bottom, -1, 3 );
hb_storvni( ( wMaxRight <= rct.right ) ?
wMaxRight - hb_parni( 7 ) : rct.right, -1, 4 );
}

//---------------------------------------------------------------------------//

HB_FUNC( WBRWPANE ) // ( hWnd, hDC, Self, bLine, aSizes, nFirstItem,
// nClrFore, nClrBack, hFont, aJustify, nStyle
// lCellStyle, lFocused ) -> nRowsSkipped
// bTextColor, bBkColor, nClrLine, nColorFondo, bFont ) // New's by CesoTech
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
HDC hDC = ( HDC ) hb_parnl( 2 );
WORD wRows;
WORD wLastBottom = 0;
WORD wRow = 1;
WORD wSkipped = 1;
PCLIPVAR Self = hb_param( 3, -1 );
PCLIPVAR bLine = hb_param( 4, -1 );
PCLIPVAR pASizes = hb_param( 5, -1 );
HFONT hFont = ( HFONT ) hb_parnl( 9 );
HFONT hOldFont;
BOOL bDestroyDC = FALSE;
WORD wHeight ;
RECT rct, box, client;
WORD wIndex = hb_parni( 6 );
PCLIPVAR bClrFore = 0, bClrBack = 0;
COLORREF clrFore = 0;
COLORREF clrBack = 0;
HPEN hGrayPen = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNSHADOW ) ) ; // RGB( 128, 128, 128 ) );
HPEN hWhitePen = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) ); // GetStockObject( WHITE_PEN );
#ifndef __HARBOUR__
BOOL bColBlock = pASizes->wType & BLOCK;
#else
BOOL bColBlock = hb_itemType( pASizes ) & BLOCK;
PHB_ITEM aLine = hb_itemNew( NULL );
#endif
PCLIPVAR pAJustify = ISARRAY( 10 ) ? hb_param( 10, -1 ): 0;
WORD nHeightCtrl ; // by CeSoTech
WORD nStyle = hb_parni( 11 );



if( hb_pcount() > 6 )
{
if( ISBLOCK( 7 ) )
bClrFore = hb_param( 7, HB_IT_BLOCK );
else
clrFore = hb_parnl( 7 );
}

if( hb_pcount() > 7 )
{
if( ISBLOCK( 8 ) )
{
bClrBack = hb_param( 8, HB_IT_BLOCK );
_cEval0( bClrBack );
clrBack = hb_parnl( -1 );
}
else
clrBack = hb_parnl( 8 );
}

if( ! hDC )
{
bDestroyDC = TRUE;
hDC = GetDC( hWnd );
}

if( ! pSkip )
pSkip = _Get_Sym( "SKIP" );

if( hFont )
hOldFont = SelectObject( hDC, hFont );

/////////////////////////
// Borremos el Area de la derecha no coubierta
if ( !bAdjBrowse && !bAdjLastCol )
{
GetClientRect( hWnd, &rct );
SetBkColor( hDC, hb_parnl( 17 ) ) ;

for( wIndex=wIndex ; wIndex <= (WORD) hb_parinfa( 5, NULL); wIndex++ )
{
rct.left += hb_parvni( 5, wIndex ) ;
}

if ( !(nStyle == 0 || nStyle == 7 || nStyle == 8 || nStyle == 3) )
rct.left++;

ExtTextOut( hDC, rct.left, rct.top, ETO_OPAQUE | ETO_CLIPPED,
&rct, "", 0, 0 );

wIndex = hb_parni( 6 );
GetClientRect( hWnd, &rct );
}
/////////////////////////

GetClientRect( hWnd, &client );

nHeightCtrl = client.bottom-client.top ; // by CeSoTech

wHeight = wLineHeight + 1 ;

wRows = WBrwRowsC( hWnd, hDC, hFont );

if( ! bClrFore )
SetTextColor( hDC, clrFore );
SetBkColor( hDC, clrBack );

while( wRow <= wRows && wSkipped == 1 )
{
rct.top = client.top + ( bDrawHeaders ? wHeaderHeight+1 : 0 ) +
(wHeight * (wRow-1) ) ;

rct.bottom = rct.top + wHeight;
rct.left = 0;
rct.right = client.right;

#ifndef __HARBOUR__

_cEval0( bLine );
_xPushM( _eval );

if( bClrFore )
{
_cEval0( bClrFore );
SetTextColor( hDC, hb_parnl( -1 ) );
}

if( bClrBack )
{
_cEval0( bClrBack );
SetBkColor( hDC, hb_parnl( -1 ) );
}

if( bColBlock )
_cEval0( pASizes );

PaintTheLine( hDC, &rct, wIndex, _tos,
( bColBlock ? _eval : pASizes ),
hWhitePen, hGrayPen,
bColBlock, pAJustify, 0, FALSE, hb_parni( 11 ),
hb_parni ( 12 ), hb_parl( 13 ),
ISBLOCK( 14 ) ? hb_param( 14, HB_IT_BLOCK ) : 0, // CeSoTech
ISBLOCK( 15 ) ? hb_param( 15, HB_IT_BLOCK ) : 0, // CeSoTech
wRow, nHeightCtrl, // CeSoTech
ISNUM( 16 ) ? hb_parnl( 16 ) : -1, // CeSoTech
FALSE, FALSE, // CeSoTech
ISBLOCK( 18 ) ? hb_param( 18, HB_IT_BLOCK ) : 0, // CeSoTech
FALSE ) ;

_tos--;

_PutSym( pSkip );
_xPushM( Self );
_PutQ( 1 );
_xSend( 1 );

#else
{
// aLine.type = HB_IT_NIL;

// Esta extension de xHarbour no se puede aplicar en Harbour
// hb_itemForwardValue( aLine, hb_vmEvalBlock( bLine ) );

hb_itemCopy( aLine, hb_vmEvalBlock( bLine ) );

if( bClrFore )
{
_cEval0( bClrFore );
SetTextColor( hDC, hb_parnl( -1 ) );
}

if( bClrBack )
{
_cEval0( bClrBack );
SetBkColor( hDC, hb_parnl( -1 ) );
}

PaintTheLine( hDC, &rct, wIndex, aLine,
( bColBlock ? hb_vmEvalBlock( pASizes ) : pASizes ),
hWhitePen, hGrayPen,
bColBlock, pAJustify, 0, FALSE, hb_parnl( 11 ),
hb_parnl ( 12 ), hb_parl( 13 ),
ISBLOCK( 14 ) ? hb_param( 14, HB_IT_BLOCK ) : 0, // CeSoTech
ISBLOCK( 15 ) ? hb_param( 15, HB_IT_BLOCK ) : 0, // CeSoTech
wRow, nHeightCtrl, // CeSoTech
ISNUM( 16 ) ? hb_parnl( 16 ) : -1, // CeSoTech
FALSE, FALSE, // CeSoTech
ISBLOCK( 18 ) ? hb_param( 18, HB_IT_BLOCK ) : 0, // CeSoTech
FALSE ) ;

if ( pSkip )
{
hb_vmPushSymbol( hb_dynsymSymbol( pSkip ) );
hb_vmPush( Self );
hb_vmPushLong( 1 );
hb_vmDo( 1 );
}
}

#endif

wLastBottom = rct.bottom ;
wSkipped = hb_parni( -1 );

if( wSkipped == 1 )
wRow++;
}

////////////////////////
// Borremos el Area de Abajo no cubierta
GetClientRect( hWnd, &rct );
SetBkColor( hDC, hb_parnl( 17 ) ) ;

rct.top = wLastBottom + 1 ;
if ( wLastBottom == 0 ) // No Mostro Registros
rct.top = ( bDrawHeaders ? wHeaderHeight+1 : 0 ) ;

rct.bottom-= 1 + ( bDrawFooters ? wFooterHeight+1 : 0 ) ;

if (nStyle == 0 || nStyle == 5 || nStyle == 6 ||
nStyle == 9 || nStyle == 10 || nStyle == 3 )
rct.top--;

if ( !bDrawFooters )
rct.bottom++;


if ( rct.top < rct.bottom )
{
ExtTextOut( hDC, rct.left, rct.top, ETO_OPAQUE | ETO_CLIPPED,
&rct, "", 0, 0 );
}
////////////////////////

DeleteObject( hGrayPen );
DeleteObject( hWhitePen );

if( hFont )
SelectObject( hDC, hOldFont );

if( bDestroyDC )
ReleaseDC( hWnd, hDC );


hb_retni( wRow );

hb_itemRelease( aLine );
}


//---------------------------------------------------------------------------//
HB_FUNC( WBRWSET )// ( lAdjLastCol, lAdjBrowse, lDrawHeaders, lDrawFooters )
{ // CeSoTech
bAdjLastCol = hb_parl( 1 ) ; // Ajuste o no de ultima columna al control.
bAdjBrowse = hb_parl( 2 ) ; // Ajuste del Browse a la derecha
// cuando no existe ajuste de ultima columna.
bDrawHeaders = hb_parl( 3 ) ; // Si quiere visualizar Headers !!!
bDrawFooters = hb_parl( 4 ) ; // Si se quiere visualizar Footers !!!

wHeaderHeight= hb_parni( 5 ) ;
wFooterHeight= hb_parni( 6 ) ;
wLineHeight = hb_parni( 7 ) ;

}

//----------------------------------------------------------------------------//
// Devuelve Nro. de Filas de Datos (No incluye Headers ni Footers)
static WORD WBrwRowsC( HWND hWnd, HDC hDC, HFONT hFont )
{
WORD wHeight;
RECT rct;
WORD wRows;
BOOL bDCDestroy = FALSE;
HFONT hOldFont;

if( ! hDC )
{
bDCDestroy = TRUE;
hDC = GetDC( hWnd );
}

if( hFont )
hOldFont = SelectObject( hDC, hFont );

wHeight = wLineHeight + 1 ;

GetClientRect( hWnd, &rct );
wRows = ( ( rct.bottom - rct.top - 2 ) -
( bDrawHeaders ? wHeaderHeight+1 : 0 ) -
( bDrawFooters ? wFooterHeight+1 : 0 ) ) / wHeight ;

if( hFont )
SelectObject( hDC, hOldFont );

if( bDCDestroy )
ReleaseDC( hWnd, hDC );

return wRows;
}

//----------------------------------------------------------------------------//

HB_FUNC( WBRWROWS )// ( hWnd, hDC, hFont )
{
hb_retni( WBrwRowsC( ( HWND ) hb_parnl( 1 ), ( HDC ) hb_parnl( 2 ),
( HFONT ) hb_parnl( 3 ) ) );
}
//----------------------------------------------------------------------------//

HB_FUNC( WBRWSCRL )// ( hWnd, nRows, hFont, nLineStyle, hDC )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
int wRows = hb_parni( 2 );
HFONT hFont = ( HFONT ) hb_parnl( 3 );
HFONT hOldFont;
HDC hDC = ( HDC ) hb_parnl( 5 ); // = GetDC( hWnd );
RECT rct;
WORD nStyle = hb_parni( 4 );

if( hFont )
hOldFont = SelectObject( hDC, hFont );

GetClientRect( hWnd, &rct );

if ( bDrawHeaders )
rct.top += wHeaderHeight+1 ;


// Defino Bottom de Area del Scroll
rct.bottom = ( WBrwRowsC( hWnd, hDC, hFont ) * (wLineHeight+1) ) +
( bDrawHeaders ? wHeaderHeight+1 : 0 ) ;


// Si es un estilo sin separadores horizontales, pintar uno mas arriba
// CeSoTech para que que bien completa el area !!!
// El Area Scroll deber  entonces no tomar el separator (forma parte de ant)
if ( !(nStyle == 0 || nStyle == 5 || nStyle == 6 ||
nStyle == 9 || nStyle == 10 || nStyle == 3 ) )
rct.bottom++; // Debe tomarse dado que no pinta celda 1 una mas arriba

// ScrollWindowEx( hWnd, 0, -( (wLineHeight+1) * wRows ), 0, &rct, 0, 0, 0 );

ScrollDC( hDC, 0, -( (wLineHeight+1) * wRows ), 0, &rct, 0, 0 );



if( hFont )
SelectObject( hDC, hOldFont );

// ReleaseDC( hWnd, hDC );
}

//----------------------------------------------------------------------------//
HB_FUNC( WBRWHEIGHT )// ( hWnd, hFont )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
HFONT hFont = ( HFONT ) hb_parnl( 2 );
HFONT hOldFont;
HDC hDC = GetDC( hWnd );
TEXTMETRIC tm;

if( hFont )
hOldFont = SelectObject( hDC, hFont );

GetTextMetrics( hDC, &tm );
hb_retni( tm.tmHeight ) ;

if( hFont )
SelectObject( hDC, hOldFont );

ReleaseDC( hWnd, hDC );
}

//----------------------------------------------------------------------------//
static void FW_DrawText( HDC hDC, RECT * rct, LPCSTR pText,
WORD wAlign, int iWidth,
HFONT hFont, BOOL bHeadFoot )

{
RECT rcttmp ;
int iHeight ;
UINT uiFlag ;
HFONT hOldFont ;
int iFactor ;

if( hFont )
hOldFont = SelectObject( hDC, hFont );

/////////////////////////////
// Alineaciones Verticales //
/////////////////////////////
iHeight = DrawText( hDC, pText, iWidth, &rcttmp, DT_CALCRECT ) ;
iFactor = ( ( rct->bottom - rct->top ) - iHeight ) / 2 ;

if ( wAlign & VA_TOP )
iFactor = 0 ;

if ( wAlign & VA_BOTTOM )
{
iFactor = ( rct->bottom - rct->top ) - iHeight - ( bHeadFoot ? 1 : 0 ) ;
}


rcttmp.top = rct->top + iFactor ;
rcttmp.bottom = rct->bottom ;
rcttmp.left = rct->left ;
rcttmp.right = rct->right ;


if ( rcttmp.top < rct->top )
rcttmp.top = rct->top ;

///////////////////////////////
// Alineaciones Horizontales //
///////////////////////////////
uiFlag = DT_LEFT ;
rcttmp.left+= 2 ;

if ( wAlign & HA_CENTER )
{
rcttmp.left-= 2 ;
uiFlag = DT_CENTER ;
}

if ( wAlign & HA_RIGHT )
{
rcttmp.left-= 2 ;
uiFlag = DT_RIGHT ;
rcttmp.right-= 2 + ( bHeadFoot ? 1 : 0 ) ;
}


ExtTextOut( hDC, 0, 0, ETO_OPAQUE | ETO_CLIPPED, rct, "", 0, 0 ) ;
DrawText( hDC, pText, iWidth, &rcttmp, uiFlag | DT_NOPREFIX ) ;

if( hFont )
SelectObject( hDC, hOldFont );

}















//----------------------------------------------------------------------------//

static void FW_DrawBitmapCenter( HDC hDC, HBITMAP hBmp, RECT * rct, WORD nStyle, BOOL bSelect )
{
WORD wWidth ;
WORD wHeight ;
WORD wRow ;
WORD wCol ;
BITMAP bm;
LONG lBkColorBMP, lBkColor = GetBkColor( hDC );
BOOL bFlag = FALSE ;

if ( (nStyle == 0 || nStyle == 3 || nStyle == 5 ||
nStyle == 6 || nStyle == 9 || nStyle == 10) && bSelect )
{
rct->bottom-- ;
bFlag = TRUE ;
}

wWidth = rct->right - rct->left ;
wHeight = rct->bottom - rct->top ;
GetObject( hBmp, sizeof( BITMAP ), ( LPSTR ) &bm );

if ( wHeight > bm.bmHeight )
{
wRow = rct->top + ( ( wHeight - bm.bmHeight ) / 2 ) ;
wHeight = bm.bmHeight ;
} else
{
wRow = rct->top ;
}

if ( wWidth > bm.bmWidth )
{
wCol = rct->left + ( ( wWidth - bm.bmWidth ) / 2 ) ;
wWidth = bm.bmWidth ;
} else
{
wCol = rct->left ;
}

rct->bottom++;
ExtTextOut( hDC, 0, rct->top, ETO_OPAQUE, rct, "", 0, 0 );
rct->bottom--;

if ( hBmp > 0 )
{
DrawBitmap( hDC, hBmp, wRow, wCol, wWidth, wHeight, 0 ) ;
if( ( lBkColorBMP = GetPixel( hDC, wCol, wRow ) ) != lBkColor)
MaskRegion( hDC, rct, lBkColorBMP, lBkColor );
}

if (bFlag)
rct->bottom++ ;


}

//----------------------------------------------------------------------------//



/*******


static void FW_DrawBitmapCenter( HDC hDC, HBITMAP hBmp, RECT * rct, WORD nStyle, BOOL bSelect )
{
WORD wWidth ;
WORD wHeight ;
WORD wRow ;
WORD wCol ;
BITMAP bm;
LONG lBkColorBMP, lBkColor = GetBkColor( hDC ), lBkColorOld;
BOOL bFlag = FALSE ;

RECT rRect ;
HDC hDC2 ;
HBITMAP hBmp2, hBmpOld ;


if ( (nStyle == 0 || nStyle == 3 || nStyle == 5 ||
nStyle == 6 || nStyle == 9 || nStyle == 10) && bSelect )
{
rct->bottom-- ;
bFlag = TRUE ;
}

///////////////////////////////
// Creo un buffer auxiliar ////
rRect.top = 0 ;
rRect.left = 0 ;
rRect.right = rct->right - rct->left ;
rRect.bottom = rct->bottom - rct->top ;

hDC2 = CreateCompatibleDC( hDC );
hBmp2 = CreateCompatibleBitmap( hDC, rRect.right, rRect.bottom );
hBmpOld = SelectObject( hDC2, hBmp2 );
BitBlt( hDC2, 0, 0, rRect.right, rRect.bottom, hDC, 0, 0, SRCCOPY );
///////////////////////////////


wWidth = rct->right - rct->left ;
wHeight = rct->bottom - rct->top ;
GetObject( hBmp, sizeof( BITMAP ), ( LPSTR ) &bm );

if ( wHeight > bm.bmHeight )
{
wRow = 0 + ( ( wHeight - bm.bmHeight ) / 2 ) ;
wHeight = bm.bmHeight ;
} else
{
wRow = 0 ;
}

if ( wWidth > bm.bmWidth )
{
wCol = 0 + ( ( wWidth - bm.bmWidth ) / 2 ) ;
wWidth = bm.bmWidth ;
} else
{
wCol = 0 ;
}

rRect.bottom++;
lBkColorOld = SetBkColor( hDC2, lBkColor );
ExtTextOut( hDC2, 0, 0, ETO_OPAQUE, &rRect, "", 0, 0 );
rRect.bottom--;

if ( hBmp > 0 )
{
DrawBitmap( hDC2, hBmp, wRow, wCol, wWidth, wHeight, 0 ) ;
if( ( lBkColorBMP = GetPixel( hDC2, wCol, wRow ) ) != lBkColor)
MaskRegion( hDC2, &rRect, lBkColorBMP, lBkColor );
}

///////////////////////////////
// Pego el buffer auxiliar ////
BitBlt( hDC, rct->left, rct->top, rRect.right, rRect.bottom, hDC2, 0, 0, SRCCOPY );
SetBkColor( hDC2, lBkColorOld );
SelectObject( hDC2, hBmpOld );
DeleteObject( hBmp2 );
DeleteObject( hBmpOld );
DeleteDC( hDC2 );
///////////////////////////////

if (bFlag)
rct->bottom++ ;

}


************/




















//----------------------------------------------------------------------------//
HB_FUNC( FWDISPBEGIN )// ( hWnd, hDC )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
HDC hDC = ( HDC ) hb_parnl( 2 );
HDC hDC2 ;
HBITMAP hBmp, hBmpOld ;
RECT rct;

GetClientRect( hWnd, &rct );

hDC2 = CreateCompatibleDC( hDC );
hBmp = CreateCompatibleBitmap( hDC, rct.right - rct.left, rct.bottom - rct.top );
hBmpOld = SelectObject( hDC2, hBmp );
BitBlt( hDC2, 0, 0, rct.right, rct.bottom, hDC, 0, 0, SRCCOPY );

hb_reta( 5 );
hb_storvnl( (LONG) hWnd , -1, 1 );
hb_storvnl( (LONG) hDC , -1, 2 );
hb_storvnl( (LONG) hDC2 , -1, 3 );
hb_storvnl( (LONG) hBmp , -1, 4 );
hb_storvnl( (LONG) hBmpOld, -1, 5 );

return;
}




//----------------------------------------------------------------------------//
HB_FUNC( FWDISPEND )// { hWnd, hDC, hDC2, hBmp, hBmpOld }
{
RECT rct;

GetClientRect( (HWND) hb_parvnl( 1, 1 ), &rct );

BitBlt( (HDC) hb_parvnl( 1, 2 ), 0, 0, rct.right - rct.left, rct.bottom - rct.top, (HDC) hb_parvnl( 1, 3 ), 0, 0, SRCCOPY );
SelectObject( (HDC) hb_parvnl( 1, 3 ), (HBITMAP) hb_parvnl( 1, 5 ) );
DeleteObject( (HBITMAP) hb_parvnl( 1, 4 ) );
DeleteObject( (HBITMAP) hb_parvnl( 1, 5 ) );
DeleteDC( (HDC) hb_parvnl( 1, 3 ) );

hb_retnl( (LONG) hb_parvnl( 1, 2 ) ) ;

return ;
}

Re: Problemas al crear la libreria TWBROWSE

Posted: Mon Jan 07, 2013 3:56 am
by nnicanor
Hola,

Puedes usar harbour 3.o que es mas estable, te envio el codigo corregido para harbour 3.0

tienes que compilarlo con las siguines parametros -D__HARBOUR__ -D__FLAT__ -M -c -O2 en el compilador de C

Code: Select all


// se corrigio para harbour 3.0 y 3.1
//Cambia todas las llamadas a funciones IS... por HB_IS... (por ejemplo: HB_ISLOG(...) en vez de ISLOG(...))
//y además añade despues de los includes Antes de los #includes añade este define: #define _HB_API_INTERNAL_
//

void * __conArrayGet( void *, void *, ... );
long __conGetNL( void *, long * );
long __conRelease( void * );

#include <Windows.h>
#ifdef __HARBOUR__

#define _HB_API_INTERNAL_

//   #include <clipapi.h>
   #include <hbapi.h>
   #include <hbapiitm.h>
   #include <hbvm.h>
   #include <hbstack.h>
   #include <hbvm.h>
   // #include <hbfast.h>
   #define MoveTo( hDC, x, y ) MoveToEx( hDC, x, y, NULL )
   #define _PutSym( _SymEval ) hb_vmPushSymbol( &hb_symEval )
   #define _xPushM  hb_vmPush
   #define _PutLN   hb_vmPushLong
   #define _xEval   hb_vmDo
   #define _cEval0  hb_vmEvalBlock
   #define _Get_Sym hb_dynsymFindName
#endif


#define LOGICAL   HB_IT_LOGICAL
#define NUMERIC   HB_IT_NUMERIC
#define CHARACTER HB_IT_STRING
#define BLOCK     HB_IT_BLOCK

#define HA_LEFT    0  // by CeSoTech Alineaciones Horizontales y Verticales
#define HA_RIGHT   1
#define HA_CENTER  2
#define VA_TOP     4
#define VA_BOTTOM  8
#define VA_CENTER  32

#ifdef __FLAT__
#undef  PCLIPVAR
#define PCLIPVAR PHB_ITEM
#endif

#ifdef __XHARBOUR__
   void hb_storvni( int iValue, int iParam, int iIndex );
   long hb_parvnl( int iParam, int iIndex );
   int hb_parvni( int iParam, int iIndex );
   void hb_storvnl( LONG lValue, int iParam, int iIndex );
#endif



static far BOOL bAdjLastCol  ; // CeSoTech
static far BOOL bAdjBrowse   ; // CeSoTech
static far BOOL bDrawHeaders ; // CeSoTech
static far BOOL bDrawFooters ; // CeSoTech
static far WORD wHeaderHeight; // CeSoTech
static far WORD wFooterHeight; // CeSoTech
static far WORD wLineHeight  ; // CeSoTech

static far BOOL bWorking;

WORD WBrwRowsC( HWND hWnd, HDC hDC, HFONT hFont ); // CeSoTech

static void FW_DrawText( HDC hDC, RECT * rct, LPCSTR pText,
                         WORD wAlign, int iLen, HFONT hFont,
                         BOOL bHeadFoot ) ; // CeSoTech
static void FW_DrawBitmapCenter( HDC hDC, HBITMAP hBmp, RECT * rct, WORD nStyle, BOOL bFocused ) ;

void MaskRegion( HDC hDC, RECT * rct, COLORREF cTrColor,
                 COLORREF cBackColor );

FrameDot( HDC hDC, RECT * pRect );

extern void WndDrawBox( HDC, LPRECT, HPEN, HPEN );
extern void DrawBitmap( HDC, HBITMAP, WORD wCol, WORD wRow, WORD wWidth,
                        WORD wHeight, DWORD dwRaster );


static void near PaintTheLine( HDC hDC, RECT * rct, WORD wIndex,
                               PCLIPVAR pAtext, PCLIPVAR pAsizes,
                               HPEN hWhitePen, HPEN hGrayPen, BOOL bTree,
                               PCLIPVAR pAJustify, WORD wPressed,
                               BOOL bHeader, WORD nStyle,
                               WORD nFocus, BOOL bFocused,
                               PCLIPVAR pTextColor, PCLIPVAR pBkColor,
                               WORD wRowPos, WORD nHeightCtrl,
                               LONG nClrLine, BOOL bFooter,
                               BOOL bSelect, PCLIPVAR pFont,
                               BOOL bDrawFocusRect ) ;



void DrawMasked( HDC, HBITMAP, WORD wCol, WORD wRow );
                  // LOW    HIGH
extern int _dvtoi( DWORD, DWORD );
void MsgStr( long l );
LPSTR Str( WORD w );

#ifndef __FLAT__
   static int near GetInt( PCLIPVAR Array, WORD wIndex );
   static far PCLIPSYMBOL pSkip = 0;
#else
   static long near GetInt( void * Array, WORD wIndex );
   PHB_DYNS pSkip = NULL;
#endif

//---------------------------------------------------------------------------//

static void MaskRegion( HDC hdc, RECT * rct, COLORREF cTransparentColor,
                        COLORREF cBackgroundColor )

{
   HDC        hdcTemp, hdcObject, hdcBack, hdcMem;
   POINT      ptSize;
   COLORREF   cColor;
   HBITMAP    bmAndObject, bmAndBack, bmBackOld, bmObjectOld,
              bmAndTemp, bmTempOld, bmAndMem, bmMemOld;
   HBRUSH     hBrush, hBrOld;

   ptSize.x = rct->right - rct->left + 1;
   ptSize.y = rct->bottom - rct->top + 1;

   hBrush      = CreateSolidBrush(cBackgroundColor);

   hdcTemp     = CreateCompatibleDC(hdc);
   hdcObject   = CreateCompatibleDC(hdc);
   hdcBack     = CreateCompatibleDC(hdc);
   hdcMem      = CreateCompatibleDC(hdc);

   bmAndTemp   = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
   bmAndMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
   bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
   bmAndBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

   bmTempOld   = SelectObject(hdcTemp, bmAndTemp);
   bmMemOld    = SelectObject(hdcMem, bmAndMem);
   bmBackOld   = SelectObject(hdcBack, bmAndBack);
   bmObjectOld = SelectObject(hdcObject, bmAndObject);

   hBrOld      = SelectObject(hdcMem, hBrush);

   BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdc, rct->left, rct->top, SRCCOPY);

   SetMapMode(hdcTemp, GetMapMode(hdc));

   cColor = SetBkColor(hdcTemp, cTransparentColor);

   BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

   SetBkColor(hdcTemp, cColor);

   BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
   PatBlt(hdcMem, 0,0, ptSize.x, ptSize.y, PATCOPY);
   BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
   BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
   BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);
   BitBlt(hdc, rct->left, rct->top, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);

   DeleteObject(SelectObject(hdcMem, hBrOld));
   DeleteObject(SelectObject(hdcTemp, bmTempOld));
   DeleteObject(SelectObject(hdcMem, bmMemOld));
   DeleteObject(SelectObject(hdcBack, bmBackOld));
   DeleteObject(SelectObject(hdcObject, bmObjectOld));
   DeleteDC(hdcMem);
   DeleteDC(hdcBack);
   DeleteDC(hdcObject);
   DeleteDC(hdcTemp);
}

//---------------------------------------------------------------------------//

#ifdef __CLIPPER__
static int near GetInt( PCLIPVAR Array, WORD wIndex )
{
    int iRet = 0;
    _cAt( Array, wIndex, -1, ++_tos );

    if( _tos->wType & NUMERIC )
        iRet = (int) _tos->pPointer1;

    else if( _tos->wType & NUM_FLOAT )
        iRet = _dvtoi( (DWORD) _tos->pPointer1, (DWORD) _tos->pPointer2 );

    --_tos;

    return iRet;
}
#endif

#ifdef __XPP__
static long GetInt( void * Array, WORD wIndex )
{
   void * chItem = 0;
   long l;

   __conArrayGet( Array, chItem, wIndex, 0 );
   __conGetNL( chItem, &l );
   __conRelease( chItem );

   return l;
}
#endif

#ifdef __HARBOUR__
   #define GetInt( Array, wIndex )  hb_arrayGetNL( Array, wIndex )
#endif

//-----------------------------------------------------------------------=
                                                        // ÚÄ1ra Col.a Pintar
                                                        // ³
static void near PaintTheLine( HDC hDC, RECT * rct, WORD wIndex,
                               PCLIPVAR pAtext, PCLIPVAR pAsizes,
                               HPEN hWhitePen, HPEN hGrayPen, BOOL bTree,
                               PCLIPVAR pAJustify, WORD wPressed,
                               BOOL bHeader, WORD nStyle,
                               WORD wFocus, BOOL bFocused,
                               PCLIPVAR pTextColor, PCLIPVAR pBkColor,
                               WORD wRowPos, WORD nHeightCtrl,
                               LONG nClrLine, BOOL bFooter,
                               BOOL bSelect, PCLIPVAR pFont,
                               BOOL bDrawFocusRect )
{
   RECT box, wholebox, rctadj;
   int iMaxRight = rct->right;

   WORD wLenJust = 0 ;
   #ifndef __HARBOUR__
   WORD wLen     = _VARRAYLEN( pAtext );
   CLV_WORD lJustify;
   #else
   WORD wLen     = hb_arrayLen( pAtext );
   PHB_ITEM uElem = hb_itemNew( NULL );
   #endif
   WORD wType, wcLen;
   LONG lValue;
   char * cValue;
   HPEN hOldPen, hPen;
   BITMAP bmp;
   WORD wRow, wCol;
   LONG lColor ;
   HBRUSH hBrush;
   LONG lTextColorOld = -1 ; // CeSoTech
   LONG lBkColorOld   = -1 ; // CeSoTech
   PCLIPVAR pEvalOld ;
   HFONT hFont ; // CeSoTech
   WORD wAlign ; // CeSoTech

   // CeSoTech
   LONG nClrLineC = ( nStyle == 2 || nStyle == 6 || nStyle == 8 ||
                      nStyle == 10 ) ? GetSysColor( COLOR_BTNSHADOW ) : 0 ;

   // CeSoTech
   if ( nClrLine >= 0 )   // Desde Clipper manda color especifico linea
      nClrLineC = nClrLine ;

   if ( ! bDrawHeaders )
      bHeader = FALSE ;

   if ( bFooter )
      bHeader = TRUE ; //-> Para que lo pinte con similar aspecto

   //CeSoTech
   // Si es un estilo sin separadores horizontales, pintar uno mas arriba
   //CeSoTech para que que bien completa el area !!!
   if ( ! (bHeader) && (nStyle == 0 || nStyle == 5 || nStyle == 6 ||
                        nStyle == 9 || nStyle == 10) )
      rct->top--       ;

   wholebox.top    = rct->top+1;
   wholebox.left   = rct->left;
   wholebox.bottom = rct->bottom;
   wholebox.right  = rct->right;

   rct->right  = 0;

   box.top    = rct->top ;
   box.bottom = rct->bottom - 1;

   if( !wIndex | wIndex > wLen )
       wIndex = 1;

   if ( pAJustify )
      #ifndef __HARBOUR__
         wLenJust = _VARRAYLEN( pAJustify );
      #else
         wLenJust = hb_arrayLen( pAJustify );
      #endif

   while( wIndex <= wLen )
   {

        rct->left   = rct->right;

        rct->right  = ( wIndex == wLen ? iMaxRight
                                      : rct->left + GetInt( pAsizes, wIndex ) );
        // CeSoTech // Cuando estoy estoy en la ultima celda, NO pintar hasta
                    // el final si no existe ajuste de ultima columna.
        if ( ( wIndex == wLen ) && ( ! bAdjLastCol )  )
        {
           rct->right  = rct->left + GetInt( pAsizes, wIndex ) +(bHeader ? 1: 0) ;
           if ( !bAdjBrowse )
              wholebox.right = rct->right ; // Tambien ajusto el borde focus

        }
        // CeSoTech //


        wAlign = HA_LEFT | VA_CENTER ;  // Alineacion por defecto
        wcLen = 0;
        ///////// INICIO Toma de datos celda !!!

        #ifndef __HARBOUR__
           if ( wIndex <= wLenJust )
           {
             _cAt( pAJustify, wIndex, 0xFFFF, ( PCLIPVAR ) &lJustify );
             wAlign = lJustify.wWord ;
           }
           _cAt( pAtext, wIndex, 0xFFFF, ++_tos );
           wType = _tos->wType;
           if ( wType & NUMERIC )
              lValue = (LONG) _tos->pPointer1;
           if ( wType & CHARACTER )
           {
              cValue = _VSTR( _tos );
              wcLen = _tos->w2;
           }
        #else

           if ( wIndex <= wLenJust )
           {
              hb_arrayGet( pAJustify, wIndex, uElem );
              if ( ( hb_itemType( uElem ) & LOGICAL ) && hb_itemGetL( uElem ) )
                 wAlign = HA_RIGHT | VA_CENTER ;
              else
                 wAlign = hb_itemGetNL( uElem );

                    hb_itemClear( uElem );
           }    

           // uElem.type = HB_IT_NIL;
           hb_arrayGet( pAtext, wIndex, uElem );
           wType = hb_itemType( uElem );
           if ( wType & NUMERIC )
              lValue = hb_itemGetNL( uElem );
           if ( wType & CHARACTER )
           {
//              cValue = hb_itemGetC( uElem );
                cValue = ( char * ) hb_itemGetCPtr( uElem );
                wcLen = strlen( cValue );
           }

        #endif
        ///////// FIN Toma de datos celda !!!



        if( wFocus > 0 && wIndex != wFocus )
        {
           #ifndef __HARBOUR__
              _tos--;
           #endif

           if( rct->right >= iMaxRight )
           {
               wIndex = wLen + 1;   // ya no pintamos m s
           }
           else
              ++wIndex;
           continue;
        }

        if( bTree ||
            (GetInt( pAsizes, wIndex ) > 0) ) //Si NO es columna oculta (x Freeze)
        {                                     //(Es lo mismo no hacer esto,
                                              // pero es para evitar hacer trabajar
                                              // al codigo sin sentido !!! )

           if( (wType & NUMERIC) && bTree )
           {
               if( lValue )
               {
                  FillRect( hDC, rct, hBrush = CreateSolidBrush( GetPixel( hDC, rct->left, rct->top ) ) );
                  DrawMasked( hDC, (HBITMAP) lValue, rct->top, rct->left );
                  DeleteObject( hBrush );
               }

           }
           else  // Si es Numerico Bmp no Tree, o , es Character !!!!
           {

               if ( pBkColor )  // Bloque de Color Fondo Celda
               {
                  _PutSym( _SymEval );
                  _xPushM( pBkColor );
                  _PutLN( wRowPos );
                  _PutLN( wIndex );
                  _PutLN( bFooter ? 2 : ( bHeader ? 1 : ( bSelect ? 3 : 0 ) ) );
                  _xEval( 3 ) ;
                  if ( hb_parinfo( -1 ) & NUMERIC )
                    lBkColorOld = SetBkColor( hDC, hb_parnl( - 1 ) ) ;
               }

               if( pTextColor ) // Bloque de Color Texto Celda
               {
                  _PutSym( _SymEval );
                  _xPushM( pTextColor );
                  _PutLN( wRowPos );
                  _PutLN( wIndex );
                  _PutLN( bFooter ? 2 : ( bHeader ? 1 : ( bSelect ? 3 : 0 ) ) );
                  _xEval( 3 ) ;
                  if ( hb_parinfo( -1 ) & NUMERIC )
                    lTextColorOld = SetTextColor( hDC, hb_parnl( - 1 ) ) ;
               }

               hFont = 0 ;
               if( pFont )      // Bloque de Font Celda
               {
                  _PutSym( _SymEval );
                  _xPushM( pFont );
                  _PutLN( wRowPos );
                  _PutLN( wIndex );
                  _PutLN( bFooter ? 2 : ( bHeader ? 1 : ( bSelect ? 3 : 0 ) ) );
                  _xEval( 3 ) ;
                  if ( hb_parinfo( -1 ) & NUMERIC )
                     hFont = (HFONT) hb_parnl( - 1 ) ;
               }


               /////// CeSoTech ///////
               if (!bHeader) rct->top ++;


               if( wType & NUMERIC )   // Es un BitMap
               {
                  FW_DrawBitmapCenter( hDC, (HBITMAP) lValue, rct, nStyle, bSelect );
               }
               else                    // Es una Cadena
               {
                  FW_DrawText( hDC, rct,
                               ( wType & CHARACTER ) ? cValue : "",
                               wAlign, wcLen, hFont, bHeader ) ;
               }


               /////// CeSoTech restauracion de colores //////
               if ( lTextColorOld >= 0 )
               {
                  SetTextColor( hDC, lTextColorOld ) ;
                  lTextColorOld = -1 ;
               }
               if ( lBkColorOld >= 0 )
               {
                  SetBkColor( hDC, lBkColorOld ) ;
                  lBkColorOld = -1 ;
               }


               /// CeSoTech ///
               // Si hay modalidad ajustar el Browse y no hay ajuste de ultima
               // columna, deber‚ pintar hasta el final hasta cubrir toda
               // el area, hasta llegar a la derecha del control. (Col.Ficticia)
               if ( bAdjBrowse && wIndex == wLen && !bAdjLastCol &&
                    rct->right <= iMaxRight )
               {
                  rctadj.top    = rct->top;
                  rctadj.left   = rct->right ;
                  rctadj.bottom = rct->bottom;
                  rctadj.right  = wholebox.right  ;

                  if ( nStyle == 3 )
                     rctadj.top--;

                  if ( wFocus == 0 )  // Si No es CellStyle (Pinto hasta final)
                     ExtTextOut( hDC, 0, rct->top, ETO_OPAQUE, &rctadj, "", 0, 0 );

                  if ( bHeader && nStyle==3 ) // Pinto Bordes Header Falso
                   {
                      rctadj.right  = wholebox.right - 2  ;
                      rctadj.bottom = rctadj.bottom - 2 ;
                      WndDrawBox( hDC, &rctadj, hWhitePen, hGrayPen );
                      rctadj.bottom++  ;
                      rctadj.right++  ;
                      WndDrawBox( hDC, &rctadj, hWhitePen, GetStockObject( BLACK_PEN ) );

                      if ( bFooter ) // Si es Footer (Linea Negra de Arriba Foot)
                      {
                        hPen = GetStockObject( BLACK_PEN );
                        hOldPen = SelectObject( hDC, hPen );
                        MoveTo( hDC, rctadj.left-1, rctadj.top-1 );
                        LineTo( hDC, rctadj.right+1, rctadj.top-1 );
                        SelectObject( hDC, hOldPen );
                      }

                  }

               }
               /// CeSoTech Fin ///

               if (!bHeader) rct->top --;
           }

           box.left   = rct->left;

           box.right  = ( wIndex < wLen && rct->right <= iMaxRight ?
                                                        rct->right - 1 :
                                                        iMaxRight - 1 );

           // CeSoTech // El Borde derecho de Box de la ultima columna,
                       // no estirarlo cuando no exista ajuste de ultima columna
                       // PERO cuando nLineStyle (nStyle) es 7/8 (Lineas Horiz)
                       // queda anti-estetico cortar los renglones, cuando no hay
                       // ajuste ult.col. y hay ajuste de browse. Por ello
                       // se verificara que para cortar el borde no se de esta
                       // condicion.
           if ( ( wIndex == wLen ) && ( ! bAdjLastCol ) )
           {
              if (! (!bHeader && (nStyle==7 || nStyle==8) && !bAdjLastCol && bAdjBrowse) )
               box.right  = rct->left + GetInt( pAsizes, wIndex ) - 1 ;
           }
           // CeSoTech //



           if( ! bTree )
           {
              if( wPressed && ( wIndex == wPressed ) )
              {
                WndDrawBox( hDC, &box, hGrayPen, hWhitePen );
              }
              else
/////////////  if(!bHeader)
               if(!bHeader || (bHeader && nStyle!=3) )
               {
                  switch( nStyle )
                  {
                     case 0:
                        break;
                     case 1:
                    //  hOldPen = SelectObject( hDC, GetStockObject( BLACK_PEN ) );
                        hPen = CreatePen(PS_SOLID, 0, nClrLineC );
                        hOldPen = SelectObject( hDC, hPen);
                        MoveTo( hDC, box.left, box.bottom+1 );
                        LineTo( hDC, box.left, box.top );
                        LineTo( hDC, box.right+1, box.top );
                        LineTo( hDC, box.right+1,  box.bottom+1 );
                        LineTo( hDC, box.left, box.bottom+1 );
                        SelectObject( hDC, hOldPen );
                        DeleteObject( hPen);
                        break;
                     case 2:
                        hPen = CreatePen(PS_SOLID, 0, nClrLineC );
                        hOldPen = SelectObject( hDC, hPen);
                        MoveTo( hDC, box.left, box.bottom+1 );
                        LineTo( hDC, box.left, box.top );
                        LineTo( hDC, box.right+1, box.top );
                        LineTo( hDC, box.right+1,  box.bottom+1 );
                        LineTo( hDC, box.left, box.bottom+1 );
                        SelectObject( hDC, hOldPen );
                        DeleteObject( hPen);
                        break;
                     case 3:
                        WndDrawBox( hDC, &box, hWhitePen, hGrayPen );
                        break;
                     case 4:
                        box.bottom ++;
                        box.right ++;
                        FrameDot( hDC, &box );
                        box.bottom --;
                        box.right --;
                        break;
                     case 7:
                     case 8:
                        hPen = CreatePen(PS_SOLID, 0, nClrLineC );
                        hOldPen = SelectObject( hDC, hPen);
                        MoveTo( hDC, box.left, box.top );
                        LineTo( hDC, box.right+1, box.top );
                        MoveTo( hDC, box.right+1,  box.bottom+1 );
                        LineTo( hDC, box.left, box.bottom+1 );
                        SelectObject( hDC, hOldPen );
                        DeleteObject( hPen);
                        break;
                     case 5:
                     case 6:
                     case 9:
                     case 10:
                        hPen = CreatePen(PS_SOLID, 0, nClrLineC);
                        hOldPen = SelectObject( hDC, hPen);
                        if (box.left>1)
                        {
                           MoveTo( hDC, box.left, box.bottom+1 );
                           LineTo( hDC, box.left, box.top );
                        }
                        MoveTo( hDC, box.right+1, box.top );

                        if ( bDrawFooters && nStyle >= 9 )
                        {
                        LineTo( hDC, box.right+1,
                                     nHeightCtrl - (wFooterHeight+1) ) ;
                        } else {
                          LineTo( hDC, box.right+1,
                                     nStyle < 9 ? box.bottom+1 : nHeightCtrl );
                        }

                        SelectObject( hDC, hOldPen );
                        DeleteObject( hPen);
                        break;
                  }
               }
               else  // Box para Headers !!!
               {
                  box.left ++;

                  // CeSoTech
                  if ( bFooter ) // Linea negra sobre el Footer
                  {
                    hPen = GetStockObject( BLACK_PEN );
                    hOldPen = SelectObject( hDC, hPen );
                    MoveTo( hDC, box.left-1, box.top-1 );
                    LineTo( hDC, box.right+1, box.top-1 );
                    SelectObject( hDC, hOldPen );
                  }

                  box.right--  ;
                  box.bottom-- ;
                  WndDrawBox( hDC, &box, hWhitePen, hGrayPen );
                  box.bottom++  ;
                  box.right++  ;
                  WndDrawBox( hDC, &box, hWhitePen, GetStockObject( BLACK_PEN ) );

                  box.left --;

               }
           }
           else
           {
              if( ! ( wType & NUMERIC ) )
              {
                 box.left -= 16;
              }
           }

          // CeSoTech if( bFocused && wFocus > 0 && wIndex == wFocus )
           if( bDrawFocusRect && bFocused && wFocus > 0 &&
               wIndex == wFocus && nStyle != 3)
           {
            rct->left++;
            rct->top++;
            DrawFocusRect( hDC, rct );
            rct->left--;
            rct->top--;
           }

        }

        #ifndef __HARBOUR__
           _tos--;
        #endif

        if( rct->right >= iMaxRight )
        {
            wIndex = wLen + 1;   // ya no pintamos m s
        }
        else
           ++wIndex;


   }

   if (bDrawFocusRect && !bTree && bFocused && wFocus==0 && nStyle!=3) // CeSoTech
      DrawFocusRect( hDC, &wholebox );

  hb_itemRelease( uElem );
}

//---------------------------------------------------------------------------//

HB_FUNC( WBRWSELBOX )// ( hWnd, hDC, nRow, nFirstCol, nCurCol,;
                     //   lFocus, aSizes, hFont)
{
   HWND hWnd        = (HWND) hb_parnl( 1 );
   HDC hDC          = (HDC) hb_parnl( 2 );
   WORD wRow        = hb_parni( 3 );
   WORD wIndex      = hb_parni( 4 );
   WORD wCol        = hb_parni( 5 );
   BOOL bFocused    = hb_parl( 6 );
   PCLIPVAR pAsizes = hb_param( 7, -1 );
   HFONT hFont      = (HFONT) hb_parnl( 8 );
   BOOL bDestroyDC  = FALSE;
   TEXTMETRIC tm;
   RECT rct;
   HFONT hOldFont;

   if( ! hDC )
   {
      bDestroyDC = TRUE;
      hDC = GetDC( hWnd );
   }

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   GetClientRect( hWnd, &rct );
   GetTextMetrics( hDC, &tm );

   if( hFont )
      SelectObject( hDC, hOldFont );

   tm.tmHeight += 1;

   if ( ! bDrawHeaders )  // By CeSoTech
      wRow-- ;

   rct.top    = tm.tmHeight * wRow ;
   rct.bottom = tm.tmHeight * ( wRow + 1) - 1;
   rct.left   = 0;

   while( wIndex < wCol )
      rct.left  += GetInt( pAsizes, wIndex++ );

   rct.right  =  rct.left+GetInt( pAsizes, wCol ) - 1;

   MaskRegion( hDC, &rct, GetBkColor( hDC ), GetSysColor(COLOR_ACTIVECAPTION) );

   if( bFocused )
      DrawFocusRect( hDC, &rct );

   if( bDestroyDC )
      ReleaseDC( hWnd, hDC );
}

//---------------------------------------------------------------------------//

HB_FUNC( WBRWLINE )        // ( hWnd, hDC, nRow, aText, aSizes, nFirstItem, ;
                           // nClrFore, nClrBack, hFont, lTree, aJustify, nPressed,
                           // nStyle, nColAct, lFocused )
                           // bTextColor, bBkColor, nClrLine, lFooter, lSelect,
                           // bFont, lDrawFocusRect ) // New's by CesoTech

{
   HWND hWnd        = (HWND) hb_parnl( 1 );
   HDC hDC          = (HDC) hb_parnl( 2 );
   WORD wRow        = hb_parni( 3 );
   BOOL bDestroyDC  = FALSE;
   WORD wHeight;
   RECT rct, box;
   PCLIPVAR bClrFore, bClrBack;
   COLORREF clrFore = 0;
   COLORREF clrBack = 0;
   HPEN hGrayPen    ;
   HPEN hWhitePen   ;
   HFONT hFont      = (HFONT) hb_parnl( 9 );
   HFONT hOldFont;
   BOOL bTree      = hb_parl( 10 );
   BOOL bFooter = HB_ISLOG( 19 ) ? hb_parl( 19 ) : FALSE ;  // CeSoTech

   WORD nHeightCtrl ; // by CeSoTech

   hGrayPen    = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNSHADOW ) ) ; // RGB( 128, 128, 128 ) );
   hWhitePen   = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) ); // GetStockObject( WHITE_PEN );


   if( hb_pcount() > 6 )
   {
      if( HB_ISBLOCK( 7 ) )
      {
         bClrFore = hb_param( 7, HB_IT_BLOCK );
         _cEval0( bClrFore );
         clrFore = hb_parnl( -1 );
      }
      else
         clrFore = hb_parnl( 7 );
   }

   if( hb_pcount() > 7 )
   {
      if( HB_ISBLOCK( 8 ) )
      {
         bClrBack = hb_param( 8, HB_IT_BLOCK );
         _cEval0( bClrBack );
         clrBack = hb_parnl( -1 );
      }
      else
         clrBack = hb_parnl( 8 );
   }

   if( ! hDC )
   {
      bDestroyDC = TRUE;
      hDC = GetDC( hWnd );
   }

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   GetClientRect( hWnd, &rct );

   nHeightCtrl = rct.bottom-rct.top ; // by CeSoTech

   SetTextColor( hDC, clrFore );
   SetBkColor( hDC, clrBack );

   wHeight = wLineHeight + 1 ;

   if ( ( wRow == 0 ) && bDrawHeaders )  // Es una Cabecera
      wHeight = wHeaderHeight + 1 ;

   if ( ! bFooter )
   {
      if ( ( wRow == 0 ) && bDrawHeaders )  // Es una Cabecera
      {
         rct.top    = 0 ;
         rct.bottom = wHeaderHeight + 1 ;
      }
      else
      {
        rct.top    = ( bDrawHeaders ? wHeaderHeight+1 : 0 ) + (wHeight * (wRow-1) )  ;
        rct.bottom = ( bDrawHeaders ? wHeaderHeight+1 : 0 ) + (wHeight * wRow)  ;
      }

   } else {
      rct.top    = rct.bottom - (wFooterHeight+1) ;
   }

   rct.left   = 0;

   PaintTheLine( hDC, &rct, hb_parni( 6 ), hb_param( 4, 0xFFFF ), hb_param( 5, 0xFFFF ),
                 hWhitePen, hGrayPen, bTree,
                 HB_ISARRAY(11) ? hb_param( 11, -1 ) : 0, hb_parni( 12 ),
                 (wRow == 0), hb_parni( 13 ),
                 hb_parni( 14 ), hb_parl( 15 ),
                 HB_ISBLOCK( 16 ) ? hb_param( 16, HB_IT_BLOCK ) : 0,   // CeSoTech
                 HB_ISBLOCK( 17 ) ? hb_param( 17, HB_IT_BLOCK ) : 0,   // CeSoTech
                 wRow, nHeightCtrl,                      // CeSoTech
                 HB_ISNUM( 18 ) ? hb_parnl( 18 ) : -1,        // CeSoTech
                 bFooter,                                // CeSoTech
                 HB_ISLOG( 20 ) ? hb_parl( 20 ) : FALSE,  // CeSoTech
                 HB_ISBLOCK( 21 ) ? hb_param( 21, HB_IT_BLOCK ) : 0,   // CeSoTech
                 HB_ISLOG( 22 ) ? hb_parl( 22 ) : FALSE );// CeSoTech

   DeleteObject( hGrayPen );
   DeleteObject( hWhitePen );

   if( hFont )
      SelectObject( hDC, hOldFont );

   if( bDestroyDC )
       ReleaseDC( hWnd, hDC );

   hb_reta( 2 );
   hb_storvni( rct.top,    -1, 1 );
   hb_storvni( rct.bottom, -1, 2 );

}

//---------------------------------------------------------------------------//
HB_FUNC( AWBRWROWDIM )
{
   HWND hWnd      = (HWND) hb_parnl( 1 );
   WORD wRow      = (WORD) hb_parnl( 2 );
   HFONT hFont    = (HFONT) hb_parnl( 3 );
   HFONT hOldFont;
   HDC  hDC       = GetDC( hWnd );
   TEXTMETRIC tm;

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   GetTextMetrics( hDC, &tm );
   tm.tmHeight += 1;

   if( hFont )
      SelectObject( hDC, hOldFont );

   ReleaseDC( hWnd, hDC );

   hb_reta( 2 );
   hb_storvni( tm.tmHeight * wRow++, -1, 1 );
   hb_storvni( tm.tmHeight * wRow,   -1, 2 );
}

//---------------------------------------------------------------------------//

WORD ScreenBaseX( WORD wX )
{
    return 4 * wX / LOWORD( GetDialogBaseUnits() );
}

//---------------------------------------------------------------------------//

WORD ScreenBaseY( WORD wY )
{
    return 8 * wY / HIWORD( GetDialogBaseUnits() );
}


//---------------------------------------------------------------------------//
HB_FUNC( WBRWRECT ) // ( hWnd, nRow, aSizes, nFirstItem, nCol,
                   //   nLineStyle, nWidthVScroll )
{
   HWND hWnd        = ( HWND ) hb_parnl( 1 );

   HDC hDC          = GetDC( hWnd );
   WORD wRow        = hb_parni( 2 );
   WORD wHeight ;
   RECT rct;
   WORD nStyle = HB_ISNUM( 6 ) ? hb_parni( 6 ) : -1 ; // CeSoTech


   #ifdef __CLIPPER__
      PCLIPVAR paSizes = _param( 3, 0x8000 );
      WORD wLen        = _VARRAYLEN( paSizes );
   #else
      #ifdef __HARBOUR__
//       void * paSizes = ( void * ) _param( 3, HB_IT_ARRAY );
         WORD wLen      = hb_parinfa( 3, 0 );
      #else
         void * paSizes = ( void * ) _param( 3, 0x8000 );
         WORD wLen      = _VARRAYLEN( paSizes );
      #endif
   #endif
   WORD wIndex      = hb_parni( 4 );
   WORD wCol        = hb_parni( 5 );
   WORD wMaxRight;
   LONG l;

   if( !wCol || wCol > wLen )
        return;


   GetWindowRect( hWnd, &rct );
   wMaxRight = rct.right - 2;

   wHeight = wLineHeight + 1 ;

   rct.top    = rct.top + ( bDrawHeaders ? wHeaderHeight+1 : 0 ) +
                (wHeight * (wRow-1) ) ;


   rct.bottom = rct.top + wHeight;
   rct.right  = rct.left;

   while( wIndex <= wCol )
   {
        rct.left   = rct.right;

        #ifndef __FLAT__

           rct.right  = ( wIndex == wLen && bAdjLastCol ? wMaxRight
                                         : rct.left + GetInt( paSizes, wIndex ) );

        #else
           #ifndef __HARBOUR__
              #define _parnl(x,y) PARNL(x,params,y);
           #endif
           l = hb_parvnl( 3, wIndex );

           rct.right  = ( wIndex == wLen && bAdjLastCol ? wMaxRight
                                         : rct.left + l );
        #endif

        if( rct.right >= wMaxRight )
        {
            wIndex = wCol + 1;   // ya no pintamos m s
            rct.right = wMaxRight;
        }
        else
            wIndex++;
   }



   ReleaseDC( hWnd, hDC );

   hb_reta( 4 );

   #ifdef __XPP__
      #define _storni( x, y, z ) STORNI( x, params, y, z )
   #endif


   // Si es un estilo sin separadores horizontales, pintar uno mas arriba
   //CeSoTech para que que bien completa el area !!!
   if (nStyle == 0 || nStyle == 5 || nStyle == 6 || nStyle == 9 || nStyle == 10)
      rct.top-- ;  // Las coord.de edicion deberan ser mas arriba tambien !!!


   hb_storvni( rct.top,    -1, 1 );
   hb_storvni( rct.left,   -1, 2 );
   hb_storvni( rct.bottom, -1, 3 );
   hb_storvni( ( wMaxRight <= rct.right ) ?
              wMaxRight - hb_parni( 7 ) : rct.right, -1, 4 );
}

//---------------------------------------------------------------------------//

HB_FUNC( WBRWPANE )         // ( hWnd, hDC, Self, bLine, aSizes, nFirstItem,
                           //   nClrFore, nClrBack, hFont, aJustify, nStyle
                           //   lCellStyle, lFocused ) -> nRowsSkipped
                           //   bTextColor, bBkColor, nClrLine, nColorFondo, bFont ) // New's by CesoTech
{
   HWND hWnd        = ( HWND ) hb_parnl( 1 );
   HDC hDC          = ( HDC ) hb_parnl( 2 );
   WORD wRows;
   WORD wLastBottom = 0;
   WORD wRow        = 1;
   WORD wSkipped    = 1;
   PCLIPVAR Self    = hb_param( 3, -1 );
   PCLIPVAR bLine   = hb_param( 4, -1 );
   PCLIPVAR pASizes = hb_param( 5, -1 );
   HFONT hFont      = ( HFONT ) hb_parnl( 9 );
   HFONT hOldFont;
   BOOL bDestroyDC  = FALSE;
   WORD wHeight ;
   RECT rct, box, client;
   WORD wIndex      = hb_parni( 6 );
   PCLIPVAR bClrFore = 0, bClrBack = 0;
   COLORREF clrFore = 0;
   COLORREF clrBack = 0;
   HPEN hGrayPen    = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNSHADOW ) ) ; // RGB( 128, 128, 128 ) );
   HPEN hWhitePen   = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) ); // GetStockObject( WHITE_PEN );
   #ifndef __HARBOUR__
   BOOL bColBlock   = pASizes->wType & BLOCK;
   #else
   BOOL bColBlock   = hb_itemType( pASizes ) & BLOCK;
   PHB_ITEM aLine = hb_itemNew( NULL );
   #endif
   PCLIPVAR pAJustify = HB_ISARRAY( 10 ) ? hb_param( 10, -1 ): 0;
   WORD nHeightCtrl ; // by CeSoTech
   WORD nStyle = hb_parni( 11 );



   if( hb_pcount() > 6 )
   {
      if( HB_ISBLOCK( 7 ) )
         bClrFore = hb_param( 7, HB_IT_BLOCK );
      else
         clrFore = hb_parnl( 7 );
   }

   if( hb_pcount() > 7 )
   {
      if( HB_ISBLOCK( 8 ) )
      {
         bClrBack = hb_param( 8, HB_IT_BLOCK );
         _cEval0( bClrBack );
         clrBack = hb_parnl( -1 );
      }
      else
         clrBack = hb_parnl( 8 );
   }

   if( ! hDC )
   {
      bDestroyDC = TRUE;
      hDC = GetDC( hWnd );
   }

   if( ! pSkip )
       pSkip = _Get_Sym( "SKIP" );

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   /////////////////////////
   // Borremos el Area de la derecha no coubierta
   if ( !bAdjBrowse && !bAdjLastCol )
   {
       GetClientRect( hWnd, &rct );
       SetBkColor( hDC, hb_parnl( 17 ) ) ;

       for( wIndex=wIndex ; wIndex <= (WORD) hb_parinfa( 5, NULL); wIndex++ )
       {
            rct.left += hb_parvni( 5, wIndex ) ;
       }

       if ( !(nStyle == 0 || nStyle == 7 || nStyle == 8 || nStyle == 3) )
          rct.left++;

       ExtTextOut( hDC, rct.left, rct.top, ETO_OPAQUE | ETO_CLIPPED,
                   &rct, "", 0, 0 );

       wIndex = hb_parni( 6 );
       GetClientRect( hWnd, &rct );
   }
   /////////////////////////

   GetClientRect( hWnd, &client );

   nHeightCtrl = client.bottom-client.top ; // by CeSoTech

   wHeight = wLineHeight + 1 ;

   wRows = WBrwRowsC( hWnd, hDC, hFont );

   if( ! bClrFore )
      SetTextColor( hDC, clrFore );
      SetBkColor( hDC, clrBack );

   while( wRow <= wRows && wSkipped == 1 )
   {
      rct.top    = client.top + ( bDrawHeaders ? wHeaderHeight+1 : 0 ) +
                   (wHeight * (wRow-1) ) ;

      rct.bottom = rct.top + wHeight;
      rct.left   = 0;
      rct.right  = client.right;

      #ifndef __HARBOUR__

         _cEval0( bLine );
         _xPushM( _eval );

         if( bClrFore )
         {
            _cEval0( bClrFore );
            SetTextColor( hDC, hb_parnl( -1 ) );
         }

         if( bClrBack )
         {
            _cEval0( bClrBack );
            SetBkColor( hDC, hb_parnl( -1 ) );
         }

         if( bColBlock )
            _cEval0( pASizes );

         PaintTheLine( hDC, &rct, wIndex, _tos,
                       ( bColBlock ? _eval : pASizes ),
                       hWhitePen, hGrayPen,
                       bColBlock, pAJustify, 0, FALSE, hb_parni( 11 ),
                       hb_parni ( 12 ), hb_parl( 13 ),
                       HB_ISBLOCK( 14 ) ? hb_param( 14, HB_IT_BLOCK ) : 0,   // CeSoTech
                       HB_ISBLOCK( 15 ) ? hb_param( 15, HB_IT_BLOCK ) : 0,   // CeSoTech
                       wRow, nHeightCtrl,                      // CeSoTech
                       HB_ISNUM( 16 ) ? hb_parnl( 16 ) : -1,        // CeSoTech
                       FALSE, FALSE,                           // CeSoTech
                       HB_ISBLOCK( 18 ) ? hb_param( 18, HB_IT_BLOCK ) : 0,   // CeSoTech
                       FALSE ) ;

         _tos--;

         _PutSym( pSkip );
         _xPushM( Self );
         _PutQ( 1 );
         _xSend( 1 );

      #else
      {
         // aLine.type = HB_IT_NIL;

         // Esta extension de xHarbour no se puede aplicar en Harbour
         // hb_itemForwardValue( aLine, hb_vmEvalBlock( bLine ) );
        
         hb_itemCopy( aLine, hb_vmEvalBlock( bLine ) );

         if( bClrFore )
         {
            _cEval0( bClrFore );
            SetTextColor( hDC, hb_parnl( -1 ) );
         }

         if( bClrBack )
         {
            _cEval0( bClrBack );
            SetBkColor( hDC, hb_parnl( -1 ) );
         }

         PaintTheLine( hDC, &rct, wIndex, aLine,
                       ( bColBlock ? hb_vmEvalBlock( pASizes ) : pASizes ),
                       hWhitePen, hGrayPen,
                       bColBlock, pAJustify, 0, FALSE, hb_parnl( 11 ),
                       hb_parnl ( 12 ), hb_parl( 13 ),
                       HB_ISBLOCK( 14 ) ? hb_param( 14, HB_IT_BLOCK ) : 0,   // CeSoTech
                       HB_ISBLOCK( 15 ) ? hb_param( 15, HB_IT_BLOCK ) : 0,   // CeSoTech
                       wRow, nHeightCtrl,                      // CeSoTech
                       HB_ISNUM( 16 ) ? hb_parnl( 16 ) : -1,        // CeSoTech
                       FALSE, FALSE,                           // CeSoTech
                       HB_ISBLOCK( 18 ) ? hb_param( 18, HB_IT_BLOCK ) : 0,   // CeSoTech
                       FALSE ) ;

         if ( pSkip )
         {
            hb_vmPushSymbol( hb_dynsymSymbol( pSkip ) );
            hb_vmPush( Self );
            hb_vmPushLong( 1 );
            hb_vmDo( 1 );
         }
      }

      #endif

      wLastBottom = rct.bottom ;
      wSkipped = hb_parni( -1 );

      if( wSkipped == 1 )
          wRow++;
   }

   ////////////////////////
   // Borremos el Area de Abajo no cubierta
   GetClientRect( hWnd, &rct );
   SetBkColor( hDC, hb_parnl( 17 ) ) ;

   rct.top = wLastBottom + 1 ;
   if ( wLastBottom == 0 ) // No Mostro Registros
      rct.top = ( bDrawHeaders ? wHeaderHeight+1 : 0 ) ;

   rct.bottom-=  1 + ( bDrawFooters ? wFooterHeight+1 : 0 ) ;

   if (nStyle == 0 || nStyle == 5 || nStyle == 6 ||
       nStyle == 9 || nStyle == 10 || nStyle == 3 )
      rct.top--;

   if ( !bDrawFooters )
      rct.bottom++;


   if ( rct.top < rct.bottom )
   {
      ExtTextOut( hDC, rct.left, rct.top, ETO_OPAQUE | ETO_CLIPPED,
                  &rct, "", 0, 0 );
   }
   ////////////////////////

   DeleteObject( hGrayPen );
   DeleteObject( hWhitePen );

   if( hFont )
      SelectObject( hDC, hOldFont );

   if( bDestroyDC )
       ReleaseDC( hWnd, hDC );


   hb_retni( wRow );

   hb_itemRelease( aLine );
}


//---------------------------------------------------------------------------//
HB_FUNC( WBRWSET )// ( lAdjLastCol, lAdjBrowse, lDrawHeaders, lDrawFooters )
{                                                                  // CeSoTech
    bAdjLastCol  =  hb_parl( 1 ) ; // Ajuste o no de ultima columna al control.
    bAdjBrowse   =  hb_parl( 2 ) ; // Ajuste del Browse a la derecha
                                 // cuando no existe ajuste de ultima columna.
    bDrawHeaders = hb_parl( 3 )  ; // Si quiere visualizar Headers !!!
    bDrawFooters = hb_parl( 4 )  ; // Si se quiere visualizar Footers !!!

    wHeaderHeight= hb_parni( 5 )  ;
    wFooterHeight= hb_parni( 6 )  ;
    wLineHeight  = hb_parni( 7 )  ;

}

//----------------------------------------------------------------------------//
// Devuelve Nro. de Filas de Datos (No incluye Headers ni Footers)
static WORD WBrwRowsC( HWND hWnd, HDC hDC, HFONT hFont )
{
   WORD wHeight;
   RECT rct;
   WORD wRows;
   BOOL bDCDestroy = FALSE;
   HFONT hOldFont;

   if( ! hDC )
   {
      bDCDestroy = TRUE;
      hDC = GetDC( hWnd );
   }

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   wHeight = wLineHeight + 1 ;

   GetClientRect( hWnd, &rct );
   wRows = ( ( rct.bottom - rct.top - 2 ) -
             ( bDrawHeaders ? wHeaderHeight+1 : 0 ) -
             ( bDrawFooters ? wFooterHeight+1 : 0 ) ) / wHeight ;

   if( hFont )
      SelectObject( hDC, hOldFont );

   if( bDCDestroy )
      ReleaseDC( hWnd, hDC );

   return wRows;
}

//----------------------------------------------------------------------------//

HB_FUNC( WBRWROWS )// ( hWnd, hDC, hFont )
{
   hb_retni( WBrwRowsC( ( HWND ) hb_parnl( 1 ), ( HDC ) hb_parnl( 2 ),
                      ( HFONT ) hb_parnl( 3 ) ) );
}
//----------------------------------------------------------------------------//

HB_FUNC( WBRWSCRL )// ( hWnd, nRows, hFont, nLineStyle, hDC )
{
   HWND hWnd   = ( HWND ) hb_parnl( 1 );
   int wRows  = hb_parni( 2 );
   HFONT hFont = ( HFONT ) hb_parnl( 3 );
   HFONT hOldFont;
   HDC hDC = ( HDC ) hb_parnl( 5 );  //  = GetDC( hWnd );
   RECT rct;
   WORD nStyle = hb_parni( 4 );

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   GetClientRect( hWnd, &rct );

   if ( bDrawHeaders )
      rct.top += wHeaderHeight+1 ;


   // Defino Bottom de Area del Scroll
   rct.bottom = ( WBrwRowsC( hWnd, hDC, hFont ) * (wLineHeight+1) ) +
                ( bDrawHeaders ? wHeaderHeight+1 : 0 )  ;


   // Si es un estilo sin separadores horizontales, pintar uno mas arriba
   // CeSoTech para que que bien completa el area !!!
   // El Area Scroll deber  entonces no tomar el separator (forma parte de ant)
   if ( !(nStyle == 0 || nStyle == 5 || nStyle == 6 ||
          nStyle == 9 || nStyle == 10 || nStyle == 3 ) )
      rct.bottom++;   // Debe tomarse dado que no pinta celda 1 una mas arriba

  // ScrollWindowEx( hWnd, 0, -( (wLineHeight+1) * wRows ), 0, &rct, 0, 0, 0 );

   ScrollDC( hDC, 0, -( (wLineHeight+1) * wRows ), 0, &rct, 0, 0 );



   if( hFont )
      SelectObject( hDC, hOldFont );

  //  ReleaseDC( hWnd, hDC );
}

//----------------------------------------------------------------------------//
HB_FUNC( WBRWHEIGHT )// ( hWnd, hFont )
{
   HWND hWnd   = ( HWND ) hb_parnl( 1 );
   HFONT hFont = ( HFONT ) hb_parnl( 2 );
   HFONT hOldFont;
   HDC hDC     = GetDC( hWnd );
   TEXTMETRIC tm;

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   GetTextMetrics( hDC, &tm );
   hb_retni( tm.tmHeight ) ;

   if( hFont )
      SelectObject( hDC, hOldFont );

   ReleaseDC( hWnd, hDC );
}

//----------------------------------------------------------------------------//
static void FW_DrawText( HDC hDC, RECT * rct, LPCSTR pText,
                         WORD wAlign, int iWidth,
                         HFONT hFont, BOOL bHeadFoot )

{
   RECT rcttmp     ;
   int iHeight     ;
   UINT uiFlag     ;
   HFONT hOldFont  ;
   int iFactor     ;

   if( hFont )
      hOldFont = SelectObject( hDC, hFont );

   /////////////////////////////
   // Alineaciones Verticales //
   /////////////////////////////
   iHeight = DrawText( hDC, pText, iWidth, &rcttmp, DT_CALCRECT ) ;
   iFactor = ( ( rct->bottom - rct->top ) - iHeight ) / 2 ;

   if ( wAlign & VA_TOP )
      iFactor = 0 ;

   if ( wAlign & VA_BOTTOM )
   {
      iFactor = ( rct->bottom - rct->top ) - iHeight - ( bHeadFoot ? 1 : 0 ) ;
   }


   rcttmp.top    = rct->top + iFactor ;
   rcttmp.bottom = rct->bottom ;
   rcttmp.left   = rct->left   ;
   rcttmp.right  = rct->right  ;


   if ( rcttmp.top < rct->top )
     rcttmp.top = rct->top ;

   ///////////////////////////////
   // Alineaciones Horizontales //
   ///////////////////////////////
   uiFlag = DT_LEFT ;
   rcttmp.left+= 2 ;

   if ( wAlign & HA_CENTER )
   {
     rcttmp.left-= 2 ;
     uiFlag = DT_CENTER ;
   }

   if ( wAlign & HA_RIGHT )
   {
     rcttmp.left-= 2 ;
     uiFlag = DT_RIGHT ;
     rcttmp.right-= 2 + ( bHeadFoot ? 1 : 0 ) ;
   }


   ExtTextOut( hDC, 0, 0, ETO_OPAQUE | ETO_CLIPPED, rct, "", 0, 0 ) ;
   DrawText( hDC, pText, iWidth, &rcttmp, uiFlag | DT_NOPREFIX ) ;

   if( hFont )
      SelectObject( hDC, hOldFont );

}















//----------------------------------------------------------------------------//

static void FW_DrawBitmapCenter( HDC hDC, HBITMAP hBmp, RECT * rct, WORD nStyle, BOOL bSelect )
{
   WORD wWidth   ;
   WORD wHeight  ;
   WORD wRow ;
   WORD wCol ;
   BITMAP bm;
   LONG lBkColorBMP, lBkColor = GetBkColor( hDC );
   BOOL bFlag = FALSE ;

   if ( (nStyle == 0 || nStyle == 3 || nStyle == 5 ||
         nStyle == 6 || nStyle == 9 || nStyle == 10) && bSelect )
   {
      rct->bottom-- ;
      bFlag = TRUE ;
   }

   wWidth  = rct->right - rct->left ;
   wHeight = rct->bottom - rct->top ;
   GetObject( hBmp, sizeof( BITMAP ), ( LPSTR ) &bm );

   if ( wHeight > bm.bmHeight )
   {
      wRow = rct->top + ( ( wHeight - bm.bmHeight ) / 2 ) ;
      wHeight = bm.bmHeight ;
   } else
   {
      wRow = rct->top ;
   }

   if ( wWidth > bm.bmWidth )
   {
      wCol = rct->left + ( ( wWidth - bm.bmWidth ) / 2 ) ;
      wWidth = bm.bmWidth ;
   } else
   {
      wCol = rct->left ;
   }

   rct->bottom++;
   ExtTextOut( hDC, 0, rct->top, ETO_OPAQUE, rct, "", 0, 0 );
   rct->bottom--;

   if ( hBmp > 0 )
   {
      DrawBitmap( hDC, hBmp, wRow, wCol, wWidth, wHeight, 0 ) ;
      if( ( lBkColorBMP = GetPixel( hDC, wCol, wRow ) ) != lBkColor)
           MaskRegion( hDC, rct, lBkColorBMP, lBkColor );
   }

   if (bFlag)
      rct->bottom++ ;


}

//----------------------------------------------------------------------------//



/*******


static void FW_DrawBitmapCenter( HDC hDC, HBITMAP hBmp, RECT * rct, WORD nStyle, BOOL bSelect )
{
   WORD wWidth   ;
   WORD wHeight  ;
   WORD wRow ;
   WORD wCol ;
   BITMAP bm;
   LONG lBkColorBMP, lBkColor = GetBkColor( hDC ), lBkColorOld;
   BOOL bFlag = FALSE ;

   RECT rRect ;
   HDC hDC2 ;
   HBITMAP hBmp2, hBmpOld ;


   if ( (nStyle == 0 || nStyle == 3 || nStyle == 5 ||
          nStyle == 6 || nStyle == 9 || nStyle == 10) && bSelect )
   {
      rct->bottom-- ;
      bFlag = TRUE ;
   }

   ///////////////////////////////
   // Creo un buffer auxiliar ////
   rRect.top    = 0 ;
   rRect.left   = 0 ;
   rRect.right  = rct->right - rct->left ;
   rRect.bottom = rct->bottom - rct->top ;

   hDC2    = CreateCompatibleDC( hDC );
   hBmp2   = CreateCompatibleBitmap( hDC, rRect.right, rRect.bottom );
   hBmpOld = SelectObject( hDC2, hBmp2 );
   BitBlt( hDC2, 0, 0, rRect.right, rRect.bottom, hDC, 0, 0, SRCCOPY );
   ///////////////////////////////


   wWidth  = rct->right - rct->left ;
   wHeight = rct->bottom - rct->top ;
   GetObject( hBmp, sizeof( BITMAP ), ( LPSTR ) &bm );

   if ( wHeight > bm.bmHeight )
   {
      wRow = 0 + ( ( wHeight - bm.bmHeight ) / 2 ) ;
      wHeight = bm.bmHeight ;
   } else
   {
      wRow = 0 ;
   }

   if ( wWidth > bm.bmWidth )
   {
      wCol = 0 + ( ( wWidth - bm.bmWidth ) / 2 ) ;
      wWidth = bm.bmWidth ;
   } else
   {
      wCol = 0 ;
   }

   rRect.bottom++;
   lBkColorOld = SetBkColor( hDC2, lBkColor );
   ExtTextOut( hDC2, 0, 0, ETO_OPAQUE, &rRect, "", 0, 0 );
   rRect.bottom--;

   if ( hBmp > 0 )
   {
      DrawBitmap( hDC2, hBmp, wRow, wCol, wWidth, wHeight, 0 ) ;
      if( ( lBkColorBMP = GetPixel( hDC2, wCol, wRow ) ) != lBkColor)
           MaskRegion( hDC2, &rRect, lBkColorBMP, lBkColor );
   }

   ///////////////////////////////
   // Pego el buffer auxiliar ////
   BitBlt( hDC, rct->left, rct->top, rRect.right, rRect.bottom, hDC2, 0, 0, SRCCOPY );
   SetBkColor( hDC2, lBkColorOld );
   SelectObject( hDC2, hBmpOld );
   DeleteObject( hBmp2 );
   DeleteObject( hBmpOld );
   DeleteDC( hDC2 );
   ///////////////////////////////

   if (bFlag)
      rct->bottom++ ;

}


************/




















//----------------------------------------------------------------------------//
HB_FUNC( FWDISPBEGIN )// ( hWnd, hDC )
{
  HWND hWnd        = ( HWND ) hb_parnl( 1 );
  HDC hDC          = ( HDC ) hb_parnl( 2 );
  HDC hDC2 ;
  HBITMAP hBmp, hBmpOld ;
  RECT rct;

  GetClientRect( hWnd, &rct );

  hDC2    = CreateCompatibleDC( hDC );
  hBmp    = CreateCompatibleBitmap( hDC, rct.right - rct.left, rct.bottom - rct.top );
  hBmpOld = SelectObject( hDC2, hBmp );
  BitBlt( hDC2, 0, 0, rct.right, rct.bottom, hDC, 0, 0, SRCCOPY );

  hb_reta( 5 );
  hb_storvnl( (LONG) hWnd   , -1, 1 );
  hb_storvnl( (LONG) hDC    , -1, 2 );
  hb_storvnl( (LONG) hDC2   , -1, 3 );
  hb_storvnl( (LONG) hBmp   , -1, 4 );
  hb_storvnl( (LONG) hBmpOld, -1, 5 );

   return;
}




//----------------------------------------------------------------------------//
HB_FUNC( FWDISPEND )// { hWnd, hDC, hDC2, hBmp, hBmpOld }
{
   RECT rct;

   GetClientRect( (HWND) hb_parvnl( 1, 1 ), &rct );

   BitBlt( (HDC) hb_parvnl( 1, 2 ), 0, 0, rct.right - rct.left, rct.bottom - rct.top, (HDC) hb_parvnl( 1, 3 ), 0, 0, SRCCOPY );
   SelectObject( (HDC) hb_parvnl( 1, 3 ), (HBITMAP) hb_parvnl( 1, 5 ) );
   DeleteObject( (HBITMAP) hb_parvnl( 1, 4 ) );
   DeleteObject( (HBITMAP) hb_parvnl( 1, 5 ) );
   DeleteDC( (HDC) hb_parvnl( 1, 3 ) );

   hb_retnl( (LONG) hb_parvnl( 1, 2 ) ) ;

   return ;
}   











 

Re: Problemas al crear la libreria TWBROWSE

Posted: Mon Jan 07, 2013 4:00 am
by nnicanor
En este post puedes resolver todas tus dudas.


http://forums.fivetechsupport.com/viewt ... t=wbrwline

Slds

Re: Problemas al crear la libreria TWBROWSE

Posted: Mon Jan 07, 2013 11:37 am
by ander7319
Muchas gracias Nicanor, voy a probar tal como me indicas.

Un saludo.

Re: Problemas al crear la libreria TWBROWSE

Posted: Wed Jan 23, 2013 3:54 pm
by ander7319
Estimado Nicanor:

He consultado el hilo que me indicas, he construido la libreria tal como me indicas, con los ficheros y flags, pero el programa me sigue dando el siguiente error con esta instrucción: oBrw:aJustify:= { 2,.f.}
Si la quito o la convierto en oBrw:aJustify:= { .f.,.f.} No hay problema .
El error es:

Code: Select all

Application
===========
   Path and name: C:\ander\ABSENTA\rh.Exe (32 bits)
   Size: 2,152,448 bytes
   Time from start: 0 hours 0 mins 2 secs 
   Error occurred at: 23.01.2013, 16:42:15
   Error description: Error BASE/1066  Error de argumento: conditional
   Args:
     [   1] = N   2

Stack Calls
===========
   Called from: .\source\classes\WBROWSE.PRG => WBRWLINE(2531)
   Called from: .\source\classes\WBROWSE.PRG => TWBROWSE:DRAWSELECT(464)
   Called from: .\source\classes\WBROWSE.PRG => (b)TWBROWSE(197)
   Called from: .\source\classes\WBROWSE.PRG => TWBROWSE:LOSTFOCUS(0)
   Called from: .\source\classes\CONTROL.PRG => TWBROWSE:KILLFOCUS(883)
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1456)
   Called from: .\source\classes\WBROWSE.PRG => TWBROWSE:HANDLEEVENT(1656)
   Called from: .\source\classes\WINDOW.PRG => _FWH(3409)
   Called from:  => DIALOGBOXINDIRECT(0)
   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(273)
   Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG(379)
   Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS(27)
   Called from: .\source\classes\WBROWSE.PRG => WBRWLINE(2531)
   Called from: .\source\classes\WBROWSE.PRG => TWBROWSE:DRAWSELECT(464)
   Called from: .\source\classes\WBROWSE.PRG => (b)TWBROWSE(180)
   Called from: .\source\classes\WBROWSE.PRG => TWBROWSE:GOTFOCUS(0)
   Called from:  => TWINDOW:HANDLEEVENT(0)
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1499)
   Called from: .\source\classes\WBROWSE.PRG => TWBROWSE:HANDLEEVENT(1656)
   Called from: .\source\classes\WINDOW.PRG => _FWH(3409)
   Called from:  => DIALOGBOX(0)
   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(273)
   Called from: C:\ander\ABSENTA\rh.prg => CONTROLPROF(0)
   Called from: C:\ander\ABSENTA\rh.prg => (b)MAIN(0)
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK(466)
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP(663)
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1489)
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT(1456)
   Called from: .\source\classes\WINDOW.PRG => _FWH(3409)
   Called from:  => WINRUN(0)
   Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(992)
   Called from: C:\ander\ABSENTA\rh.prg => MAIN(0)

System
======
   CPU type:               Intel(R) Pentium(R) D CPU 3.00GHz 3000 Mhz
   Hardware memory: 1016 megs

   Free System resources: 90 %
        GDI    resources: 90 %
        User   resources: 90 %

   Compiler version: Harbour 3.0.0 (Rev. 16951)
   Windows version: 5.1, Build 2600 Service Pack 3

   Windows total applications running: 80
      1 
      2 M
      3 Default IME
      4 Menú Inicio
      5 CiceroUIWndFrame
      6 SysFader
      7 S/PDIF IN/OUT Settings
      8 Set Device Type
      9 Mixer ToolBox
     10 Configuración de conector
     11 TF_FloatingLangBar_WndTitle
     12 UpdaterService
     13 FiveWin for Harbour
     14 Control de Absentismo
     15 ABSENTISMO
     16 VERCE v4.3, C:\ander\ABSENTA\rh.VRC
     17 Mis documentos
     18 TNOTIFThisThreadSink 0x0F00 0x0FA0
     19 FACTUR - [Maestro Clientes (PBC)]
     20 Timer
     21 OutlookFbThreadWnd
     22 RE: ASCENSORES GECOL - Mensaje (HTML) 
     23 MCI command handling window
     24 WOWExec
     25 WMS ST Notif Window 00000F00 00000474
     26 Microsoft Word
     27 PDFMakerWindow
     28 1268
     29 FSSystemTray
     30 DDE Server Window
     31 FSP Clipboard Links Viewer
     32 eDOCS DM Interceptor
     33 3152
     34 FSP Main Thread Window
     35 PowerDOCS Main Window
     36 WMS ST Notif Window 00000F00 00000FA0
     37 WMS Idle
     38 Microsoft Outlook
     39 ESET NOD32 Antivirus
     40 SP Panel de Gestión
     41 Sppg
     42 Msg
     43 DropboxTrayIcon
     44 Tea Timer
     45 AcrobatTrayIcon
     46 MS_WebcheckMonitor
     47 DTS Connect
     48 Dolby Home Threater
     49 Advance Setting
     50 TOOLBOX
     51 Load EQ Preset
     52 DeleteEQ
     53 Save EQ
     54 Realtek HD Audio Manager
     55 BackMain_Form
     56 Administrador de sonido Realtek HD
     57 WinAMRestoreWnd
     58 Spybot - Search & Destroy
     59 {A7E495BF-9589-4a6e-8479-DDA2D8D3C05F}
     60 HelperMsgListenerWnd
     61 Connections Tray
     62 Medidor de energía
     63 Nikon Monitor
     64 Socket Notification Sink
     65 Listening on port: 81 - PAPIHost
     66 PersistWndName
     67 HkWndName
     68 DameWare MRC Tray Icon
     69 EpfwWindow
     70 EKrnSvcWindow
     71 DWMRCS
     72 GDI+ Window
     73 Progreso de envío o recepción de Outlook
     74 DATA
     75 Escriba una pregunta
     76 Cuadro emergente personalizado 23816656
     77 Bandeja de entrada - Microsoft Outlook
     78 Programmer's File Editor - [C:\ander\ABSENTA\RH.prg]
     79 Error - Bloc de notas
     80 Program Manager

Variables in use
================
   Procedure     Type   Value
   ==========================
   WBRWLINE
     Param   1:    O    Class: ERROR
   TWBROWSE:DRAWSELECT
     Param   1:    N    3343708
     Param   2:    N    2063669956
     Param   3:    N    1
     Param   4:    A    Len:    2
     Param   5:    A    Len:    2
     Param   6:    N    1
     Param   7:    N    16777215
     Param   8:    N    8421504
     Param   9:    N    -1123413892
     Param  10:    L    .F.
     Param  11:    A    Len:    2
     Param  12:    U    
     Param  13:    N    2
     Param  14:    U    
     Param  15:    L    .F.
     Param  16:    O    Class: TSCROLLBAR
     Param  17:    B    {|| ... }
     Local   1:    U    
     Local   2:    U    
     Local   3:    N    14
     Local   4:    N    25821217
     Local   5:    N    34
     Local   6:    N    214
     Local   7:    N    1
     Local   8:    N    14
     Local   9:    N    27
     Local  10:    N    0
     Local  11:    N    34
     Local  12:    N    1
     Local  13:    L    .T.
     Local  14:    U    
     Local  15:    U    
     Local  16:    U    
     Local  17:    N    2
     Local  18:    N    8421504
     Local  19:    N    0
   (b)TWBROWSE
   TWBROWSE:LOSTFOCUS
     Param   1:    O    Class: TWBROWSE
     Param   2:    N    2492540
   TWBROWSE:KILLFOCUS
     Param   1:    N    2492540
   TCONTROL:HANDLEEVENT
     Param   1:    N    2492540
     Local   1:    U    
   TWBROWSE:HANDLEEVENT
     Param   1:    N    8
     Param   2:    N    2492540
     Param   3:    N    0
     Local   1:    U    
   _FWH
     Param   1:    N    8
     Param   2:    N    2492540
     Param   3:    N    0
   DIALOGBOXINDIRECT
     Param   1:    N    0
     Param   2:    N    8
     Param   3:    N    2492540
     Param   4:    N    0
     Param   5:    N    162
     Local   1:    O    Class: TWBROWSE
   TDIALOG:ACTIVATE
     Param   1:    N    4194304
     Param   2:    C    "€ È€     ‡ÿ«ÿá °     F i v e W i n   f o r   H a r b o u r       P    4  u  r S T A T I C         E r r o r   d e s c r i p t i o n :   E r r o r   B A S E / 1 0 6 6     E r r o r   d e   a r g u m e n t o :   c o n d i t i o n a l 
 
        P      H  s S T A T I C   & S t a c k   L i s t        ¡P     ! Ü  t L I S T B O X          P    a ¢   u B U T T O N   & Q u i t         P    ¯  /  v B U T T O N   S e e   E r r o r . l o g   f i l e     "
     Param   3:    N    2033184
     Param   4:    O    Class: TDIALOG
   ERRORDIALOG
     Param   1:    U    
     Param   2:    U    
     Param   3:    B    {|| ... }
     Param   4:    L    .T.
     Param   5:    U    
     Param   6:    L    .T.
     Param   7:    U    
     Param   8:    U    
     Param   9:    U    
     Param  10:    L    .F.
     Local   1:    N    2033184
     Local   2:    S    
     Local   3:    O    Class: TDIALOG
   (b)ERRORSYS
     Param   1:    O    Class: ERROR
     Local   1:    O    Class: TDIALOG
     Local   2:    O    Class: TLISTBOX
     Local   3:    U    
     Local   4:    U    
     Local   5:    C    "   Called from: .\source\classes\WBROWSE.PRG => WBRWLINE(2531)"
     Local   6:    N    9
     Local   7:    C    "   Error description: Error BASE/1066  Error de argumento: conditional
"
     Local   8:    A    Len:   20
     Local   9:    O    Class: TSAY
     Local  10:    N    -1794828539
     Local  11:    N    1
     Local  12:    C    "Application
===========
Seguro que algo estoy haciendo mal , pero no sé qué.

Gracias de antemano por tu ayuda.

Re: Problemas al crear la libreria TWBROWSE

Posted: Wed Jan 23, 2013 4:58 pm
by nnicanor
Hola,

Que version de TWbrowse y de FWH estas usando ??

Slds,

Re: Problemas al crear la libreria TWBROWSE

Posted: Wed Jan 23, 2013 5:25 pm
by ander7319
nnicanor wrote:Hola,

Que version de TWbrowse y de FWH estas usando ??

Slds,
Estoy usando FWH 11.04, BCC582 y HB3.0
De la librería TWBROWSE, los ficheros para HARBOUR que recomiendas en el foro:
WBROWSEH.PRG
TMULTISE.PRG
WBRWLINEH.C
La librería se monta sin problemas con los flags que me indicaste anteriormente.

A WBROWSEH.PRG lo he modificado, también siguiendo el foro, con la siguiente intrucción:
#xtranslate twbrowse => twbrowseh
En teoría para no tener que tocar los recursos.

Si lo crees necesario te puedo enviar los ficheros...

Muchas gracias por la ayuda y el interes.