Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby MarioG » Wed Feb 12, 2014 11:57 pm

Gente;
me sumo al pedido

muchas gracias
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby carlos vargas » Thu Feb 13, 2014 3:24 pm

Este es la version que uso, es una suyma de todas las versiones que he visto de wbrowse de hernan, ademas he adecuado el codigo para compilarse con harbour, harbour, xhb.com

wbrowse.prg

Code: Select all  Expand view

#ifdef __HARBOUR__
#ifndef __XHARBOUR__
#define _HB_API_INTERNAL_
#define HB_LEGACY_TYPES_ON
#endif
#endif

#include <windows.h>
#include <hbdefs.h>
#include <hbapiitm.h>
#include <hbvm.h>

#ifdef __HARBOUR__
   #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

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

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

#define HA_LEFT    0  // by CeSoTech Alineaciones Horizontales
#define HA_RIGHT   1
#define HA_CENTER  2

#define VA_TOP     4  // by CeSoTech Alineaciones Verticales
#define VA_BOTTOM  8
#define VA_CENTER  32

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;

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

//extern
void FrameDot( HDC hDC, RECT * pRect );
void MaskRegion( HDC hDC, RECT * rct, COLORREF cTrColor, COLORREF cBackColor );
void WndDrawBox( HDC, LPRECT, HPEN, HPEN );
void DrawBitmap( HDC, HBITMAP, int wCol, int wRow, WORD wWidth, WORD wHeight, DWORD dwRaster );
void DrawMasked( HDC, HBITMAP, WORD wCol, WORD wRow );

//static WORD ScreenBaseX( WORD wX );
//static WORD ScreenBaseY( WORD wY );

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

#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

/*------------------------------------------------------------------------------------------------*/

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

/*------------------------------------------------------------------------------------------------*/

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 & HB_IT_NUMERIC )
         {
              lValue = (LONG) _tos->pPointer1;
         }

         if ( wType & HB_IT_STRING )
         {
            cValue = _VSTR( _tos );
            wcLen = _tos->w2;
         }
      #else
         if ( wIndex <= wLenJust )
         {
            hb_arrayGet( pAJustify, wIndex, uElem );
            if ( ( hb_itemType( uElem ) & HB_IT_LOGICAL ) && hb_itemGetL( uElem ) )
            {
               wAlign = HA_RIGHT | VA_CENTER ;
            }
            else
            {
               wAlign = hb_itemGetNL( uElem );
            }
            hb_itemClear( uElem );
         }

         hb_arrayGet( pAtext, wIndex, uElem );
         wType = hb_itemType( uElem );

         if ( wType & HB_IT_NUMERIC )
         {
            lValue = hb_itemGetNL( uElem );
         }

         if ( wType & HB_IT_STRING )
         {
            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 mas
         }
         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 & HB_IT_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 ) & HB_IT_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 ) & HB_IT_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 ) & HB_IT_NUMERIC )
               {
                  hFont = (HFONT) hb_parnl( -1 ) ;
               }
            }

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

            if( wType & HB_IT_NUMERIC )   // Es un BitMap
            {
               FW_DrawBitmapCenter( hDC, (HBITMAP) lValue, rct, nStyle, bSelect );
            }
            else                         // Es una Cadena
            {
               FW_DrawText( hDC, rct, ( wType & HB_IT_STRING ) ? 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 || ( bHeader && nStyle != 3 ) )
               {
                  switch( nStyle )
                  {
                     case 0:
                        break;
                     case 1:
                        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 + 0 );   //kds + 1
                        LineTo( hDC, box.left,      box.bottom + 0 );   //kds + 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 & HB_IT_NUMERIC ) )
            {
               box.left -= 16;
            }
         }

         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        = (WORD)  hb_parni( 3 );
   WORD wIndex      = (WORD)  hb_parni( 4 );
   WORD wCol        = (WORD)  hb_parni( 5 );
   BOOL bFocused    =         hb_parl( 6 );
   PCLIPVAR pAsizes =         hb_param( 7, -1 );
   HFONT hFont      = (HFONT) hb_parnl( 8 );
   BOOL bDestroyDC  = FALSE;

   RECT rct;
   TEXTMETRIC tm;
   HFONT hOldFont;

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

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

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

   if( hOldFont )
   {
      SelectObject( hDC, hOldFont );
   }

   tm.tmHeight += 1;

   if( !bDrawHeaders )
   {
      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        = (WORD) 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    ) );
   hWhitePen = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_BTNHIGHLIGHT ) );

   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,
                 ISBLOCK( 17 ) ? hb_param( 17, HB_IT_BLOCK ) : 0,
                 wRow, nHeightCtrl,
                 ISNUM( 18 ) ? hb_parnl( 18 ) : -1,
                 bFooter,
                 ISLOG( 20 ) ? hb_parl( 20 ) : FALSE,
                 ISBLOCK( 21 ) ? hb_param( 21, HB_IT_BLOCK ) : 0,
                 ISLOG( 22 ) ? hb_parl( 22 ) : FALSE );

   DeleteObject( hGrayPen );
   DeleteObject( hWhitePen );

   if( hOldFont )
   {
      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 );
   HDC  hDC       =         GetDC( hWnd );
   TEXTMETRIC tm;
   HFONT hOldFont;

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

   GetTextMetrics( hDC, &tm );

   tm.tmHeight += 1;

   if( hFont )
   {
      SelectObject( hDC, hOldFont );
   }

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

   hb_reta( 2 );

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

/*------------------------------------------------------------------------------------------------*/

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

/*------------------------------------------------------------------------------------------------*/

//static 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 __HARBOUR__
      WORD wLen = hb_parinfa( 3, 0 );
   #else
      void * paSizes = ( void * ) _param( 3, 0x8000 );
      WORD wLen = _VARRAYLEN( paSizes );
   #endif

   WORD wIndex = hb_parni( 4 );
   WORD wCol   = hb_parni( 5 );
   WORD wMaxRight;
   LONG l;

   if( !wCol || wCol > wLen )
   {
      ReleaseDC( hWnd, hDC ); //KDS
      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 );

   //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       = (WORD) 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 & HB_IT_BLOCK;
   #else
   BOOL bColBlock = hb_itemType( pASizes ) & HB_IT_BLOCK;
   PHB_ITEM aLine = hb_itemNew( NULL );
   #endif
   PCLIPVAR pAJustify = ISARRAY( 10 ) ? hb_param( 10, -1 ): 0;
   WORD nHeightCtrl ; // by CeSoTech
   WORD nStyle = (WORD) 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 cubierta
   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 == 3 || nStyle == 7 || nStyle == 8 ) )
      {
         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 ;

   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 ) );
         }

         if( bColBlock ) //KDS agregado
         {
            _cEval0( pASizes );
         }

         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,                                              // CeSoTech
                       nHeightCtrl,                                       // CeSoTech
                       ISNUM( 16 ) ? hb_parnl( 16 ) : -1,                 // CeSoTech
                       FALSE,                                             // CeSoTech
                       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 == 3 ||
        nStyle == 5 ||
        nStyle == 6 ||
        nStyle == 9 ||
        nStyle == 10 )
   {
      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 ) // WBrwSet( lAdjLastCol, lAdjBrowse, lDrawHeaders, lDrawFooters )
{
    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= (WORD) hb_parni( 5 ) ;
    wFooterHeight= (WORD) hb_parni( 6 ) ;
    wLineHeight  = (WORD) hb_parni( 7 ) ;
}

/*------------------------------------------------------------------------------------------------*/
// retorna el numero de filas de datos (no incluye headers ni footers)
static WORD WBrwRowsC( HWND hWnd, HDC hDC, HFONT hFont )
{
   RECT rct;
   WORD wHeight;
   WORD wRows;
   HFONT hOldFont;
   BOOL bDCDestroy = FALSE;

   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 ) // WBrwScrl( hWnd, nRows, hFont, nLineStyle, hDC )
{
   HWND hWnd   = ( HWND  ) hb_parnl( 1 );
   int wRows   =           hb_parni( 2 );
   HFONT hFont = ( HFONT ) hb_parnl( 3 );
   WORD nStyle = ( WORD  ) hb_parni( 4 );
   HDC hDC     = ( HDC   ) hb_parnl( 5 );
   BOOL bDCDestroy = FALSE;
   HFONT hOldFont;
   RECT rct;

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

   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 == 3  ||
           nStyle == 4  ||
           nStyle == 5  ||
           nStyle == 9  ||
           nStyle == 10 ))
   {
      rct.bottom++;   // Debe tomarse dado que no pinta celda 1 una mas arriba
   }

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

   if( hFont )
   {
      SelectObject( hDC, hOldFont );
   }

   if( bDCDestroy )
   {
      ReleaseDC( hWnd, hDC );
   }
}

/*------------------------------------------------------------------------------------------------*/

HB_FUNC( WBRWHEIGHT ) //WbrHeight( hWnd, hFont )
{
   HFONT hOldFont;
   HWND hWnd   = ( HWND  ) hb_parnl( 1 );
   HFONT hFont = ( HFONT ) hb_parnl( 2 );
   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 )
{
   int iHeight;
   int iFactor;

   RECT rcttmp;
   UINT uiFlag;
   HFONT hOldFont;

   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 )
   {
      uiFlag =  DT_CENTER;
      rcttmp.left -= 2;
   }

   if( wAlign & HA_RIGHT )
   {
      uiFlag = DT_RIGHT;
      rcttmp.left  -= 2;
      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--;

   /*KDS LONG era > y lo cambie a <>*/
   if( (LONG) hBmp != 0 )
   {
      DrawBitmap( hDC, hBmp, (int) wRow, (int) wCol, wWidth, wHeight, 0 ) ;
      if( ( lBkColorBMP = GetPixel( hDC, wCol, wRow ) ) != lBkColor )
      {
         MaskRegion( hDC, rct, lBkColorBMP, lBkColor );
      }
   }

   if( bFlag )
   {
      rct->bottom++ ;
   }

}

/*------------------------------------------------------------------------------------------------*/

HB_FUNC( FWDISPBEGIN2 )
{
   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 );

}

/*------------------------------------------------------------------------------------------------*/

HB_FUNC( FWDISPEND2 )
{
   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 ) );

}

/*------------------------------------------------------------------------------------------------*/
/*EOF*/
/*------------------------------------------------------------------------------------------------*/
 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby MarioG » Thu Feb 13, 2014 3:48 pm

gracias Carlos

Pregunta: Wbrwline.c no sufrió modificaciones?
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby carlos vargas » Thu Feb 13, 2014 4:17 pm

sip, algunas, mas que todo pequeños fixes.
quiero subir todo el proyecto pero no me deja, hare un paquete zip y lo subire a algun sitio.

salu2
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby carlos vargas » Thu Feb 13, 2014 4:32 pm

como comente el código c fue adecuado para permitir la compilación con harbour y xharbour, algunos fixes, en el codigo c, eliminados algunas funciones que ya estaba incluidas en fw y estaban repetidas, ademas algunos add a la clase tmulti.

se incluye proyectos xmate para xharbour, harbour, xhb.com

http://www.filedropper.com/libtwbrowse
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby MarioG » Fri Feb 14, 2014 1:46 am

Carlos;
gracias por tu aporte!

Al parecer el sitio al que subiste es pago.
Algunos lugares donde podes hacerlo free:
DropBox
GDrive (GMail)
SkyDrive (Microsoft)
Box.Net

Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby vilian » Fri Feb 14, 2014 11:12 am

Carlos,

Obrigado.
Sds,
Vilian F. Arraes
vilian@vfatec.com.br
Belém-Pa-Brazil
User avatar
vilian
 
Posts: 920
Joined: Wed Nov 09, 2005 2:17 am
Location: Brazil

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby MarioG » Fri Feb 14, 2014 2:37 pm

Disculpas;
no lei bien... ya lo pude bajar

gracias!
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby vilian » Fri Feb 14, 2014 3:02 pm

Sds,
Vilian F. Arraes
vilian@vfatec.com.br
Belém-Pa-Brazil
User avatar
vilian
 
Posts: 920
Joined: Wed Nov 09, 2005 2:17 am
Location: Brazil

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby MarioG » Fri Feb 14, 2014 3:08 pm

brigado Vilian
(como dije, lo pude bajar del enlace dejado por Carlos)
Vacacione en Garopaba... hermoso lugar!
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Wbrowse de Hernan modificado Harbour BCC,MVC y MINGW

Postby Vikthor.Thomas » Mon Mar 03, 2014 6:18 pm

Hola, compilé el código fuente de la clase y obtuve los siguientes warnings
Code: Select all  Expand view
wbrwline.c
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(113) : warning C4244: 'initializing' : conversion from 'HB_SIZE' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(167) : warning C4554: '|' : check operator precedence for possible error; use parentheses to clarify precedence
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(177) : warning C4244: '=' : conversion from 'HB_SIZE' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(233) : warning C4244: '=' : conversion from 'long' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(249) : warning C4267: '=' : conversion from 'size_t' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(278) : warning C4244: 'function' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(121) : warning C4101: 'wRow' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(121) : warning C4101: 'wCol' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(120) : warning C4101: 'bmp' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(122) : warning C4101: 'lColor' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(126) : warning C4101: 'pEvalOld' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(714) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(657) : warning C4101: 'box' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(852) : warning C4244: 'initializing' : conversion from 'HB_SIZE' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(871) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1005) : warning C4047: 'function' : 'HB_SIZE' differs in levels of indirection from 'void *'
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1005) : warning C4024: 'hb_parinfa' : different types for formal and actual parameter 2
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1023) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1122) : warning C4244: 'function' : conversion from 'long' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1123) : warning C4244: 'function' : conversion from 'long' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1146) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(940) : warning C4101: 'box' : unreferenced local variable
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1245) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1448) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1449) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1455) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1456) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1460) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1465) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1466) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of data
C:\libtwbrowse\libtwbrowse\source\wbrwline.c(1470) : warning C4244: '=' : conversion from 'LONG' to 'WORD', possible loss of dat
C:\fwh64.1311\VC\Bin\Lib.exe /OUT:C:\libtwbrowse\libtwbrowse\twbrowse.Lib @C:\libtwbrowse\libtwbrowse\twbrowse.vcl
a
Microsoft (R) Library Manager Version 11.00.60315.1
Copyright (C) Microsoft Corporation.  All rights reserved.

C:\libtwbrowse\libtwbrowse\Obj\wbrowse.Obj C:\libtwbrowse\libtwbrowse\Obj\tmultise.Obj C:\libtwbrowse\libtwbrowse\Obj\wbrwline.Obj


Al correr algún ejemplo obtengo un error en el método paint()
User avatar
Vikthor.Thomas
 
Posts: 144
Joined: Thu Jan 02, 2014 1:49 pm

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 16 guests

cron