Page 3 of 3

Re: DRAW A TEXT ON A BITMAP

PostPosted: Tue Jul 02, 2013 5:44 pm
by cnavarro
Thanks Uwe

The text that I want to see behind the image.
No one could get the hDC of the image that contains the cell? Maybe so they could paint over the image

Gracias Uwe

El texto que quiero poner aparece por detrás de la imagen.
No se podria obtener el hDC de la imagen que contiene la celda ? Quizas asi se podria pintar encima de la imagen.

Code: Select all  Expand view

:aCols[1]:bPaintText     := {|oB, hDC, cData, aRect, aClrs, lHigh| DRAWTEXT( oXBrw:aCols[ oXBrw:nColSel ], hDC, oXBrw, cData, aRect, , ) }
 


Regards

Re: DRAW A TEXT ON A BITMAP

PostPosted: Tue Jul 02, 2013 6:53 pm
by ukoenig
It is a bit more complicated. The images are defined with :
DrawCell( oBrw1, oCol, hDC, cData, aRect, hBrush1 ) }
It works fine, but still needed to define different textcolors of cells.
For the moment only ROW works.
I will create a sample of the final solution.

The browser :

Code: Select all  Expand view

FUNCTION SHOW_BROW()
LOCAL hBrush1 := CreateSolidBrush( nObjColor )

@ 60, 55 XBROWSE oBrw1 SIZE 730, 601 PIXEL OF oDlg1 ;
AUTOCOLS ARRAY aImg NOBORDER
oBrw1:lHeader := .F.
oBrw1:lFooter := .F.
oBrw1:lRecordSelector := .F.
oBrw1:lHScroll := .F.
oBrw1:lVScroll := .F.
oBrw1:lAllowRowSizing := .F.
oBrw1:lAllowColSwapping := .F.
oBrw1:lContrastClr := .F.

oBrw1:nMarqueeStyle := 0
oBrw1:nRowDividerStyle := 1
oBrw1:nColDividerStyle := 1

FOR nCol := 1 to nSGet[3]
    WITH OBJECT oBrw1:aCols[ nCol ]
        :nWidth := nCellSize
        :bPaintText := { | oCol, hDC, cData, aRect | DrawCell( oBrw1, oCol, hDC, cData, aRect, hBrush1 ) }
            :lAllowSizing := .F.
    END
NEXT

WITH OBJECT oBrw1
    :nRowHeight := nCellSize
    // Selected Row on Focus ( Text / Background )
    // ------------------------------------------------------------
    :bClrSelFocus = { || { , 16777215 } }  

    // Selected Row on LostFocus ( Text / Background )
    // -----------------------------------------------------------------
    :bClrSel = { || { 0, 16777215 } }  
    :bClrStd  := {|| { 0, 16777215 } }
    :bClrSelFocus = { || { 0, 16777215 } }  
        XBRW_BACK(oBrw1)
END

// DEFINE YOUR ACTION !!!
// ------------------------------
oBrw1:bLClicked := { | nRow, nCol | ( nRPos := oBrw1:KeyNo(), ;
                                nCPos := oBrw1:SelectedCol():nCreationOrder, ;
                                nRecPos1 := ( ( nRPos - 1 )* nSGet[3] ) + nCPos, ;  
                                IIF( ALLTRIM(aImg[ nRPos, nCPos ]) <> ALLTRIM(c_path1 + cImages[17]) , ;
                                          ( SOUND_PLAY(3), MsgAlert( "Selected Image !" + CRLF + "Please hide the Preview !", "Error" ) ), ;       
                                  ( nSelect++, ;
                                    aImg[ nRPos, nCPos ] :=  c_path1 + cCards[nRecPos1], ;
                                    IIF( nSelect = 1, ( nRPos1 := nRPos, nCPos1 := nCPos ), NIL ), ;
                                    IIF( nSelect = 2, ( nRPos2 := nRPos, nCPos2 := nCPos ), NIL ), ;
                                    SET_POINTS() ) ) ) }
                                                                   

oBrw1:CreateFromCode()

RETURN NIL

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

STATIC FUNCTION DrawCell ( oBrw1, oCol, hDC, cData, aRect, hBrush1 )
LOCAL oBrw := oCol:oBrw
LOCAL nTop := aRect[ 1 ]
LOCAL nLeft := aRect[ 2 ]
LOCAL nBottom := aRect[ 3 ]
LOCAL nRight := aRect[ 4 ]
LOCAL nOld, nOld1, lAlpha, nZeroClr
LOCAL hBmp, hBmpO, nBmpW, nBmpH, nBmpTop, nBmpLeft
LOCAL oBold, oItalic

DEFINE FONT oBold   NAME 'TAHOMA' SIZE 0,-18 BOLD
DEFINE FONT oItalic NAME 'TAHOMA' SIZE 0,-18 ITALIC

IF ! Empty( cData := oCol:Value() ) // note: cData is reassigned
    hBmp := FILoadImg( cData )
    nBmpH  := nCellSize
    nBmpW := nCellSize + 2
    nBmpTop := nTop - 2
    nBmpLeft := nLeft - 4

    lAlpha := HasAlpha( hBmp )

    IF lAlpha .or. ! oCol:lBmpTransparent
        hBmpO := hBmp
        hBmp := ResizeImg( hBmpO, nBmpW, nBmpH )
        DeleteObject( hBmpO )
    ENDIF
    IF lAlpha
        ABPaint( hDC, nBmpLeft, nBmpTop, hBmp, oCol:nAlphaLevel(255) )
    ELSEIF oCol:lBmpTransparent
        nZeroClr := GetZeroZeroClr( hDC, hBmp )
        TransBmp( hBmp, nBmpWidth( hBmp ), nBmpHeight( hBmp ),;
                nZeroClr, hDC, nBmpLeft, nBmpTop, nBmpW, nBmpH )
    ELSE
        DrawBitmap( hDC, hBmp, nBmpTop, nBmpLeft )
    ENDIF

    // --------------------
    // --------------------
    DRAWTEXT( oCol, hDC, oBrw1, cFileNoPath(cData), aRect, oBold, oItalic )
    // --------------------
    // --------------------

    DeleteObject( hBmp )
    DeleteObject( hBrush1)

ENDIF
RELEASE FONT oBold
RELEASE FONT oItalic

RETURN NIL

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

STATIC FUNCTION GetZeroZeroClr( hDC, hBmp )
LOCAL hDCMem, hOldBmp, nZeroZeroClr

hDCMem = CreateCompatibleDC( hDC )
hOldBmp = SelectObject( hDCMem, hBmp )
nZeroZeroClr = GetPixel( hDCMem,0,0)
SelectObject( hDCMem, hOldBmp )
DeleteDC( hDCMem )

RETURN nZerozeroClr

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

STATIC FUNCTION DRAWTEXT( oCol, hDC, oBrw1, cText, aCoord, oBold, oItalic )
local nTop  := aCoord[ 1 ], nLeft := aCoord[ 2 ]
local nBottom := aCoord[ 3 ], nRight := aCoord[ 4 ]
local nRow  := nTop
local cLine, nFontHt, nAt

nAt := AT( CRLF, cText )
IF nAt > 0
    cLine := Left( cText, nAt - 1  )
    oBold:Activate( hDC )
    nFontHt  := GetTextHeight( oCol:oBrw:hWnd, hDC )
    DRAWTEXTEX( hDC, cLine, { nRow, nLeft, nRow + nFontHt + 4, nRight }, 1 ) //oCol:nDataStyle )
    oBold:DeActivate( hDC )
    nRow += nFontHt + 4
    cLine := SubStr( cText, nAt + 2 )
ELSE
    cLine := cText
ENDIF
IF oBrw1:KeyNo() = 2 .or. oBrw1:KeyNo() = 4
    SetTextColor( hDC, 255 )
ELSE
    SetTextColor( hDC, 0 )
ENDIF

oItalic:Activate( hDC )
DRAWTEXTEX( hDC, cLine, { nRow, nLeft, nBottom, nRight }, oCol:nDataStyle )
oItalic:DeActivate( hDC )

RETURN NIL
 


Best Regards
Uwe :lol:

Re: DRAW A TEXT ON A BITMAP

PostPosted: Wed Jul 03, 2013 7:41 am
by cnavarro
Thank you very much Uwe
I continue testing and will comment the results.

One more question:
Would it be easier to put text on the bottom of the image? I've seen your example below there are pictures and text in another cell. Any hints on this issue?
A main panel pictures, as they are fixed, I can put up with titles IconLover pictures but no side panel, because they are created at runtime.
Attached is a picture of what I need and another of the images that I have to put the text in the foot.
Windows 8
Image
and my images
with xbrowse
Image

Image


Thanks again and greetings

Muchas gracias Uwe
Sigo haciendo pruebas y comentare los resultados.
Una pregunta mas:
¿Seria mas facil poner el texto en el pie de la imagen? He visto un ejemplo tuyo que hay imagenes y debajo en otra celda un texto. ¿Alguna pista sobre este tema?
A las imagenes del panel principal, como son fijas, les puedo poner con IconLover los titulos pero a las imagenes del panel lateral no, porque se crean en tiempo de ejecucion.
Adjunto una imagen de lo que necesito y otra de las imagenes que tengo que poner el texto en el pie.
Windows 8

y mis imagenes
con xbrowse
Gracias de nuevo y saludos

Re: DRAW A TEXT ON A BITMAP

PostPosted: Wed Jul 03, 2013 8:18 am
by cnavarro
This example is done with yours xbrowse

Este ejemplo tuyo esta hecho con un xbrowse

viewtopic.php?f=3&t=24494&p=132531#p132531

I'm trying to understand the operation of the FUNCTION DrawCell
Estoy intentando entender el funcionamiento de la FUNCTION DrawCell

Regards

Re: DRAW A TEXT ON A BITMAP

PostPosted: Tue Jul 09, 2013 1:58 pm
by arthursilvestre
How can I change the text font?

Re: DRAW A TEXT ON A BITMAP

PostPosted: Tue Jul 09, 2013 2:32 pm
by ukoenig
Adjust TEXT-position and FONTSIZE.

Image

You can try .

oBrw1:lContrastClr := .T.

Code: Select all  Expand view

#define DT_LEFT    0x00000000
#define DT_CENTER     0x00000001
#define DT_VCENTER   0x00000004

FOR nCol := 1 to 5  // ? Your cols
    WITH OBJECT oBrw1:aCols[ nCol ]
        :nWidth := nCellSize
        :bPaintText := { | oCol, hDC, cData, aRect | ;
                  DRAWCELL( oBrw1, oCol, hDC, cData, aRect, hBrush1 ), ;
              DRAWTEXT( oCol, hDC, cFileNoPath(cData), aRect ) }
        :lAllowSizing := .F.
        SETTEXTCOLOR( hDC,  255 )
    END
NEXT

...
...
//----------------------------------------------------------------------------//

STATIC FUNCTION DRAWTEXT( oCol, hDC, cText, aCoord )
local nTop  := aCoord[ 1 ], nLeft := aCoord[ 2 ]
local nBottom := aCoord[ 3 ], nRight := aCoord[ 4 ]
local nRow  := nTop
local cLine, nFontHt, nAt
LOCAL oBold, oItalic

DEFINE FONT oBold   NAME 'TAHOMA' SIZE 0,-16 BOLD
DEFINE FONT oItalic NAME 'TAHOMA' SIZE 0,-16 ITALIC

nAt := AT( CRLF, cText )
IF nAt > 0
    cLine := Left( cText, nAt - 1  )
    oBold:Activate( hDC )
    nFontHt  := GetTextHeight( oCol:oBrw:hWnd, hDC )
    DRAWTEXTEX( hDC, cLine, { nRow, nLeft, nRow + nFontHt + 4, nRight }, 1 ) //oCol:nDataStyle )
    oBold:DeActivate( hDC )
    nRow += nFontHt + 4
    cLine := SubStr( cText, nAt + 2 )
ELSE
    cLine := cText
ENDIF

oBold:Activate( hDC )
nFontHt  := GetTextHeight( oCol:oBrw:hWnd, hDC )

// calculate the TEXTPOSITION
// ---------------------------------
DRAWTEXTEX( hDC, cLine, { nBottom - nFontHt - 5, nLeft + 5, nBottom - 1, nRight - 1 }, ;
               DT_VCENTER )
oBold:DeActivate( hDC )

RELEASE FONT oBold
RELEASE FONT oItalic

//SETTEXTCOLOR( hDC,  255 )

RETURN NIL
 


Best Regards
Uwe :lol: