A problem with GradientBrush()

Re: A problem with GradientBrush()

Postby Enrico Maria Giordano » Sun Jan 31, 2010 9:19 am

You da man!!! Many many thanks!

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8375
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: A problem with GradientBrush()

Postby James Bott » Mon Feb 01, 2010 5:23 pm

It would seem that we now need to move these changes into TDialog so one doesn't have to write code for each dialog using a brush.

Regards,
James
User avatar
James Bott
 
Posts: 4840
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA

Re: A problem with GradientBrush()

Postby Antonio Linares » Mon Feb 01, 2010 8:55 pm

Rao,

Many thanks! :-)

Lets see if we can migrate those changes into FWH classes
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41404
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: A problem with GradientBrush()

Postby Antonio Linares » Mon Feb 01, 2010 9:38 pm

Enrico,

Your examples on Windows 7 work fine

Going to test them on XP...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41404
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: A problem with GradientBrush()

Postby Antonio Linares » Mon Feb 01, 2010 10:06 pm

Enrico,

Statements like these should not be used:

Code: Select all  Expand view
oDlg:oBrush = TBrush():New()


because the above does not respect the FWH brushes reuse implementation.
Instead, method oWnd:SetBrush( oBrush ) should be used.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41404
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: A problem with GradientBrush()

Postby Enrico Maria Giordano » Mon Feb 01, 2010 10:09 pm

Can I use

Code: Select all  Expand view
oDlg:SetBrush( TBrush():New() )


?

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8375
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: A problem with GradientBrush()

Postby ukoenig » Mon Feb 01, 2010 10:45 pm

Enrico,

I'm still testing as well the Gradients and Brushes.
I need a working example to adjust a Brush to Dialog-Size ( a Image is used ).
I don't know what's wrong, but anyway, i don't get it working.
The results don't look as aspected.

// a. Now any image file ( jpg, png, etc. ) can be used to create a Brush.
// b. Brush can also be created from a bitmap handle by
// specifying the handle as the fifth parameter of TBrush():New() method.

must be used like :
TBrush():New( nil, nil, nil, nil, hBmp )

Do You have a working example for this ?

Best Regards
Uwe :lol:
Last edited by ukoenig on Mon Feb 01, 2010 11:00 pm, edited 1 time in total.
Since 1995 ( the first release of FW 1.9 )
i work with FW.
If you have any questions about special functions, maybe i can help.
User avatar
ukoenig
 
Posts: 4043
Joined: Wed Dec 19, 2007 6:40 pm
Location: Germany

Re: A problem with GradientBrush()

Postby Enrico Maria Giordano » Mon Feb 01, 2010 10:51 pm

Yes, all my samples now work fine with Rao change.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8375
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: A problem with GradientBrush()

Postby Enrico Maria Giordano » Mon Feb 01, 2010 10:53 pm

One more problem. How can I get transparent controls (ie. the SAY in the following sample) and not transparent image control at the same time?

Code: Select all  Expand view
#include "Fivewin.ch"
#include "Image.ch"


FUNCTION MAIN()

    LOCAL oDlg

    DEFINE DIALOG oDlg;
           TRANSPARENT

    @ 0, 0 SAY "This is a test"

    @ 1, 1 IMAGE;
           SIZE 50, 50;
           FILE "e:\fwharbour\bitmaps\select.bmp";
           NOBORDER ADJUST

    oDlg:SetBrush( TBrush():New() )

    ACTIVATE DIALOG oDlg;
             ON INIT GRADIENTBRUSH( oDlg, { { 1, RGB( 216, 230, 238 ), RGB( 103, 154, 194 ) } } );
             CENTER

    RETURN NIL


FUNCTION GRADIENTBRUSH( oDlg, aColors )

    LOCAL hDC, hBmp, hBmpOld

    hDC = CREATECOMPATIBLEDC( oDlg:GetDC() )

    hBmp = CREATECOMPATIBLEBITMAP( oDlg:hDC, oDlg:nWidth, oDlg:nHeight )

    hBmpOld = SELECTOBJECT( hDC, hBmp )

    GRADIENTFILL( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, aColors )

    DELETEOBJECT( oDlg:oBrush:hBrush )

    oDlg:oBrush:hBitmap = hBmp
    oDlg:oBrush:hBrush  = CREATEPATTERNBRUSH( hBmp )

    SELECTOBJECT( hDC, hBmpOld )

    DELETEDC( hDC )

    oDlg:ReleaseDC()

    RETURN NIL


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8375
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: A problem with GradientBrush()

Postby Antonio Linares » Mon Feb 01, 2010 10:54 pm

Enrico,

Yes, you can use:
Code: Select all  Expand view

oDlg:SetBrush( TBrush():New() )
 

but never use:
Code: Select all  Expand view

oDlg:oBrush = TBrush():New()
 

because this way the brush "counter" does not get incremented.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41404
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Re: A problem with GradientBrush()

Postby nageswaragunupudi » Tue Feb 02, 2010 12:05 am

Mr EMG

>>
One more problem. How can I get transparent controls (ie. the SAY in the following sample) and not transparent image control at the same time?
>>

Please try this modified code:
#include "Fivewin.ch"

FUNCTION MAIN()

LOCAL oDlg, oBrush
LOCAL cPath := 'c:\fwh\bitmaps\' // change to your path

DEFINE BRUSH oBrush
DEFINE DIALOG oDlg SIZE 240,200 PIXEL BRUSH oBrush TRANSPARENT

@ 10, 10 SAY 'Say on Transparent Dialog' SIZE 100,10 PIXEL OF oDlg

@ 25, 25 IMAGE FILE cPath + "select.bmp" SIZE 20,20 PIXEL NOBORDER ADJUST

@ 50, 25 IMAGE FILE cPath + "AlphaBmp\ichat.bmp" SIZE 50,50 PIXEL NOBORDER ADJUST

ACTIVATE DIALOG oDlg;
ON INIT GRADIENTBRUSH( oDlg, { { 1, RGB( 216, 230, 238 ), RGB( 103, 154, 194 ) } } );
CENTER

RELEASE BRUSH oBrush
RETURN NIL

function GradientBrush will be the same as in the code posted by me already.

Result:
Image
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10308
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: A problem with GradientBrush()

Postby Antonio Linares » Tue Feb 02, 2010 12:22 am

Enrico,

Please try this example which provides a good understanding about how brushes reuse works.

The problem with your examples is that you were modifying a brush that was already in use by the previous dialog. The solution is to end() its use and create a new one, so we don't interfere with the original one.

Code: Select all  Expand view

#include "Fivewin.ch"


FUNCTION MAIN()

    LOCAL oDlg

    LOCAL lVar := .F.

    DEFINE DIALOG oDlg;
           TRANSPARENT

    @ 1, 1 BUTTON "Test";
           ACTION TEST()

    @ 3, 1 CHECKBOX lVar

    ACTIVATE DIALOG oDlg;
             ON INIT GRADIENTBRUSH( oDlg, { { 1, RGB( 216, 230, 238 ), RGB( 103, 154, 194 ) } } );
             CENTER

    oDlg:oBrush:End()
   
    MsgInfo( oDlg:oBrush:nCount )        
   
RETURN NIL


FUNCTION TEST()

    LOCAL oDlg

    DEFINE DIALOG oDlg;
           TRANSPARENT

    ACTIVATE DIALOG oDlg;
             ON INIT GRADIENTBRUSH( oDlg, { { 1, RGB( 216, 230, 238 ), RGB( 103, 154, 194 ) } } );
             CENTER

    oDlg:oBrush:End()
             
    MsgInfo( oDlg:oBrush:nCount )        

RETURN NIL


FUNCTION GRADIENTBRUSH( oDlg, aColors )

    LOCAL hDC, hBmp, hBmpOld

    hDC = CREATECOMPATIBLEDC( oDlg:GetDC() )

    hBmp = CREATECOMPATIBLEBITMAP( oDlg:hDC, oDlg:nWidth, oDlg:nHeight )

    hBmpOld = SELECTOBJECT( hDC, hBmp )

    GRADIENTFILL( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, aColors )

    oDlg:oBrush:End()
    oDlg:SetBrush( TBrush():New( ,,,, hBmp ) )
    AEval( oDlg:aControls, { | o | o:SetBrush( oDlg:oBrush ) } )

    SELECTOBJECT( hDC, hBmpOld )
    DELETEDC( hDC )

    oDlg:ReleaseDC()

RETURN NIL
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41404
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: A problem with GradientBrush()

Postby Antonio Linares » Tue Feb 02, 2010 12:32 am

In this example, lets asume that we want to use the same gradient colors for all our dialogs, so we can create just one brush and reuse it in all dialogs:

Code: Select all  Expand view

#include "Fivewin.ch"


FUNCTION MAIN()

    LOCAL oDlg

    LOCAL lVar := .F.

    DEFINE DIALOG oDlg;
           TRANSPARENT

    @ 1, 1 BUTTON "Test";
           ACTION TEST( oDlg:oBrush )

    @ 3, 1 CHECKBOX lVar

    ACTIVATE DIALOG oDlg;
             ON INIT GRADIENTBRUSH( oDlg, { { 1, RGB( 216, 230, 238 ), RGB( 103, 154, 194 ) } } );
             CENTER

    oDlg:oBrush:End()
   
    MsgInfo( oDlg:oBrush:nCount )        
   
RETURN NIL


FUNCTION TEST( oBrush )

    LOCAL oDlg

    MsgInfo( oBrush:nCount )        

    DEFINE DIALOG oDlg;
           TRANSPARENT BRUSH oBrush

    ACTIVATE DIALOG oDlg;
             CENTER

    MsgInfo( oDlg:oBrush:nCount )        

RETURN NIL


FUNCTION GRADIENTBRUSH( oDlg, aColors )

    LOCAL hDC, hBmp, hBmpOld

    hDC = CREATECOMPATIBLEDC( oDlg:GetDC() )

    hBmp = CREATECOMPATIBLEBITMAP( oDlg:hDC, oDlg:nWidth, oDlg:nHeight )

    hBmpOld = SELECTOBJECT( hDC, hBmp )

    GRADIENTFILL( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, aColors )

    oDlg:oBrush:End()
    oDlg:SetBrush( TBrush():New( ,,,, hBmp ) )
    AEval( oDlg:aControls, { | o | o:SetBrush( oDlg:oBrush ) } )

    SELECTOBJECT( hDC, hBmpOld )
    DELETEDC( hDC )

    oDlg:ReleaseDC()

RETURN NIL
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41404
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: A problem with GradientBrush()

Postby Enrico Maria Giordano » Tue Feb 02, 2010 7:47 am

Antonio Linares wrote:
Code: Select all  Expand view
oDlg:oBrush:End()
oDlg:SetBrush( TBrush():New( ,,,, hBmp ) )


If I understand correctly, SetBrush() method already ends the previous brush, if assigned:

Code: Select all  Expand view
METHOD SetBrush( oBrush ) INLINE If( ::oBrush != nil, ::oBrush:End(),),;


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8375
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

PreviousNext

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 16 guests