FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour A problem with GradientBrush()
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: A problem with GradientBrush()
Posted: Sun Jan 31, 2010 09:19 AM

You da man!!! Many many thanks!

EMG

Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 05: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

FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 08:55 PM

Rao,

Many thanks! :-)

Lets see if we can migrate those changes into FWH classes

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 09:38 PM

Enrico,

Your examples on Windows 7 work fine

Going to test them on XP...

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 10:06 PM
Enrico,

Statements like these should not be used:

Code (fw): Select all Collapse
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
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 10:09 PM
Can I use

Code (fw): Select all Collapse
oDlg:SetBrush( TBrush():New() )


?

EMG
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: A problem with GradientBrush()
Posted: 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 :-)
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.
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 10:51 PM

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

EMG

Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: A problem with GradientBrush()
Posted: 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 (fw): Select all Collapse
#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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 10:54 PM
Enrico,

Yes, you can use:
Code (fw): Select all Collapse
oDlg:SetBrush( TBrush():New() )

but never use:
Code (fw): Select all Collapse
oDlg:oBrush = TBrush():New()

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

Antonio Linares
www.fivetechsoft.com
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: A problem with GradientBrush()
Posted: Mon Feb 01, 2010 10:55 PM

Ok, thank you.

EMG

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: A problem with GradientBrush()
Posted: 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:
Regards



G. N. Rao.

Hyderabad, India
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: A problem with GradientBrush()
Posted: 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 (fw): Select all Collapse
#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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: A problem with GradientBrush()
Posted: 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 (fw): Select all Collapse
#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
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: A problem with GradientBrush()
Posted: Tue Feb 02, 2010 07:47 AM
Antonio Linares wrote:
Code (fw): Select all Collapse
oDlg:oBrush:End()
oDlg:SetBrush( TBrush():New( ,,,, hBmp ) )


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

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


EMG