FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Resize gradient with Dialog Resize
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Resize gradient with Dialog Resize
Posted: Fri Oct 02, 2015 01:49 PM
To All

I am re-sizing a dialog and am using the SetGradient() function to color my dialog box. When I re-size the dialog .. the gradient just tiles itself ( repeats ) and does not flow with the resize. Any suggestions .. here is the code

Rick Lipkin
Code (fw): Select all Collapse
LightYellow()

DEFINE DIALOG oDlg RESOURCE "TRANSACT";
      TITLE "TRANSACTION History for INVENTORY RECORD  "+ltrim(str(nInventEid))

   REDEFINE xBROWSE oLbx     ;
      ID 111 of oDlg         ;
      RECORDSET oRsTran      ;
      COLUMNS "HISTORY",     ;
              "ENTRYBY",     ;
              "TABLENAME",   ;
              "INVENTEID"    ;
      COLSIZES 370,90,90,110 ;
      HEADERS "History",     ;
              "EntryBy",     ;
              "Table",       ;
              "InventEid"    ;
   AUTOSORT AUTOCOLS LINES CELL

   ADD oCol TO oLbx AT 2 DATA {|x| x := If ( oRsTran:Eof, ,_ChkDate(oRsTran:Fields("EntryDate"):Value)) } HEADER "Date"

   oLbx:aCols[2]:nDataStrAlign := AL_LEFT  //  date
   oLbx:aCols[2]:nHeadStrAlign := AL_LEFT

   WITH OBJECT oLbx
       :lTabLikeExcel := .t.
   END

   oLbx:lRecordSelector := .f.
   oLbx:lFooter   := .t.
   oCol           := oLbx:aCols[ 1 ]
   oCol:bFooter   := { || Ltrim( Str( oLbx:KeyNo() ) ) + " / " + LTrim( Str( oLbx:KeyCount() ) ) }
   oLbx:bChange   := { || oCol:RefreshFooter() }

   oLbx:nStretchCol  := 1

   REDEFINE BTNBMP oBtn1 ID 112 OF oDlg  ;
         RESOURCE "OK", "DOK", "DOK" ;
         PROMPT "&Ok" LEFT 2007;
         ACTION ( oDLG:END() )     ;

   REDEFINE BTNBMP oBtn2 ID 113 OF oDlg  ;
         RESOURCE "MINUS16", "DMINUS16", "DMINUS16" ;
         PROMPT "&Del" LEFT 2007;
         ACTION ( _DelUm( oRsTran, oLbx ) )

    oDlg:bResized = { | nSizeType, nWidth, nHeight | ResizeControls( nSizeType, nWidth, nHeight, oDlg )}

ACTIVATE DIALOG oDlg ;
    ON INIT( oLbx:SetFocus(), IF( (xSUPER = 'Y' .or. xAdmin = "Y"), , oBtn2:Hide() ));
    VALID(!GETKEYSTATE( 27 ))

//-------------------------
Static Func ResizeControls( nSizeType, nWidth, nHeight, oDlg )

                                                          
if nSizeType = 0 //SIZE_MAXIMIZED         
   oDlg:aControls[ 1  ]:SetSize( nWidth - 60, nHeight - 10 ) //txbrowse
endif

Return(nil)

//-----------------
Static Func LightYellow()

SetDlgGradient( { { 0.01,8440801,16777215 },{ 0.75,16777215,8440801 } })

Return(nil)

Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Resize gradient with Dialog Resize
Posted: Fri Oct 02, 2015 01:59 PM

Rick,

I think no problem.
I will use Your source to create a sample.

best regards
Uwe :D

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: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Resize gradient with Dialog Resize
Posted: Fri Oct 02, 2015 04:43 PM
Rick,

keeping controls transparent on resize.
Background adjusted to new dialog-size.
Gradient- and image-test.
Image on Image-background.




Code (fw): Select all Collapse
#include "FiveWin.ch"

STATIC oDlg 

FUNCTION MAIN()
Local oLbx, oBtn1, oBtn2, oImg, oFontMed

//LightYellow()

// I am re-sizing a dialog and am using the SetGradient() function to color my dialog box. 
// When I re-size the dialog .. the gradient just tiles itself ( repeats ) and does not flow with the resize. 

DEFINE IMAGE oImg FILENAME "Logo4.bmp"
DEFINE FONT oFontMed   NAME "Arial" SIZE 0, -36 BOLD

DEFINE DIALOG oDlg RESOURCE "TRANSACT";
TITLE "Resize - test" 

REDEFINE SAY ID 110 PROMPT "Transparent SAY" FONT oFontMed COLOR 255, NIL OF oDlg TRANSPARENT

oDlg:bResized = { |nSizeType, nWidth, nHeight| ( DLG_BACK( oDlg, 2, 8440801,16777215, .T., 0.01, "Picture8.jpg" ), ;
ResizeControls( nSizeType, nWidth, nHeight, oDlg ) ) }

//oDlg:bResized = { | nSizeType, nWidth, nHeight | ResizeControls( nSizeType, nWidth, nHeight, oDlg )}

ACTIVATE DIALOG oDlg ;
ON PAINT ABPaint( hDC, 50, 30, oImg:hBitmap, 255 ) ;
ON INIT  DLG_BACK( oDlg, 2, 8440801,16777215, .T., 0.01, "Picture8.jpg" )

oImg:End()
oFontMed:End()

RETURN( NIL )

// --------  Background ---------------

FUNCTION DLG_BACK( oDlg, nStyle, nColor1, nColor2, lDirect, nMove, cImage ) 
LOCAL hDC, oBrush, oImage, aGrad
LOCAL aRect := GETCLIENTRECT( oDlg:hWnd ) 

IF nStyle = 1 // GRADIENT
    aGrad := { { nMove, nColor1, nColor2 }, { nMove, nColor2, nColor1 } }
    hDC = CreateCompatibleDC( oDlg:GetDC() )
    hBmp = CreateCompatibleBitMap( oDlg:hDC, aRect[4], aRect[3] )  
    hBmpOld = SelectObject( hDC, hBmp )
    GradientFill( hDC, 0, 0, aRect[3], aRect[4], aGrad, lDirect ) // .T: = Vertical
    oBrush := TBrush():New( ,,,, hBmp )
    oBrush:Cargo  := aGrad
    SelectObject( hDC, hBmpOld )
    ReleaseDC(hDC)
ENDIF
IF nStyle = 2 // Image ADJUSTED
    IF FILE( cImage ) 
        DEFINE IMAGE oImage FILE cImage
        oBrush := TBrush():new( ,,,, ResizeBmp( oImage:hBitmap, aRect[4], aRect[3], .F. ) ) 
        oImage:End()
    ELSE
        IF !EMPTY(cImage)
            MsgAlert( "File  : " + cImage + CRLF + ;
                       "does not exist" + CRLF + ; 
                           "to create Background !", "ATTENTION" ) 
        ENDIF
    ENDIF
ENDIF
oDlg:SetBrush( oBrush )

AEVAL( oDlg:aControls, { | oCtl | IF( oCtl:lTransparent, oCtl:SetBrush( oDlg:oBrush ), ) } )

RELEASE BRUSH oBrush 

RETURN( oBrush )


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: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Resize gradient with Dialog Resize
Posted: Fri Oct 02, 2015 05:01 PM

Uwe

Let me digest this .. thank you for your solution .. I appreciate it !

Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Resize gradient with Dialog Resize
Posted: Sat Oct 03, 2015 06:11 AM
I advise not to complicate extremely simple things.
FWH gradient and image brushes are automatically re-sizable. FWH intends to do all complex UI work leaving the programmers to concentrate on business logic only.

Please try this sample:
Code (fw): Select all Collapse
#include "fivewin.ch"

function main()

   local oDlg, oBrush

   DEFINE BRUSH oBrush GRADIENT { { 1, CLR_BLUE, CLR_WHITE } }
   DEFINE DIALOG oDlg BRUSH oBrush ;
      STYLE nOR( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_THICKFRAME )
       // The style is used for resizing
   ACTIVATE DIALOG oDlg CENTERED
   RELEASE BRUSH oBrush

return nil

You see the gradient gets resized when you resize the dialog.
You can use this with any window or control.
What all needs is just one line of code defining the brush.
Regards



G. N. Rao.

Hyderabad, India
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Resize gradient with Dialog Resize
Posted: Mon Oct 05, 2015 08:29 PM
Mr. Rao,
thank You very much
still the direction must be defined

Rick,

Some improvements testing dialog resizing
A complete sample with style and color change at runtime
Diagonal-gradient added.

To define the gradient-direction
DEFINE BRUSH oBrush GRADIENT aGrad STYLE "HORIZONTAL"
or
DEFINE BRUSH oBrush GRADIENT aGrad STYLE "VERTICAL"
Creating a DIAGONAL-gradient, the solution is different.

I added a INI, to save the values
I noticed a problem with using < GetPvProfString >
and used another solution that works as well.
Maybe it is possible to find out what's wrong with using < GetPvProfString > ?

Download :
http://www.pflegeplus.com/DOWNLOADS/Dlgadjust.zip



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: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Resize gradient with Dialog Resize
Posted: Mon Oct 05, 2015 09:33 PM

Uwe and Rao

Thank you both very much !!

Rick

Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Resize gradient with Dialog Resize
Posted: Wed Oct 07, 2015 04:12 PM
Hello Rick,

I noticed < Gradient CIRCLE > is included now in new FWH-release
before it was included in a sample < gradcirc.prg >
Using a older FWH-release, You must add the function from the sample.

I added circle paintings as a option, to complete the sample.
Maybe it is useful for You

Download :
http://www.pflegeplus.com/DOWNLOADS/Dlgadjust1.zip



Code (fw): Select all Collapse
oBrush := TBrush():New()
IF lDirect = .T.
     nOffX := nGrdPos * 500
     nOffY := nGrdPos * 500
ELSE
     nOffX := - nGrdPos * 500 // change the position using a combination of nOffX and nOffY adding -
     nOffY := - nGrdPos * 500
ENDIF
DeleteObject( oBrush:hBrush )
oBrush:hBrush := CircleGradient( 0, { 0, 0, aRect[3], aRect[4] }, nColor1, nColor2, nOffX, nOffY, 1 )


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: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Resize gradient with Dialog Resize
Posted: Fri Oct 09, 2015 12:58 PM
Uwe, Rao

I looked back on some old code where I used gradients before SetDlgGradient() .. here is my solution, note the ON PAINT ..thank you both for your inspiration !

Rick Lipkin
Code (fw): Select all Collapse
xGrad := { { 0.01,8440801,16777215 },{ 0.75,16777215,8440801 } }     // light yellow

DEFINE DIALOG oDlg RESOURCE "TRANSACT";
      TITLE "TRANSACTION History for INVENTORY RECORD  "+ltrim(str(nInventEid))

   REDEFINE xBROWSE oLbx     ;
      ID 111 of oDlg         ;
      RECORDSET oRsTran      ;
      COLUMNS "HISTORY",     ;
              "ENTRYBY",     ;
              "TABLENAME",   ;
              "INVENTEID"    ;
      COLSIZES 370,90,90,110 ;
      HEADERS "History",     ;
              "EntryBy",     ;
              "Table",       ;
              "InventEid"    ;
   AUTOSORT AUTOCOLS LINES CELL

   ADD oCol TO oLbx AT 2 DATA {|x| x := If ( oRsTran:Eof, ,_ChkDate(oRsTran:Fields("EntryDate"):Value)) } HEADER "Date"

   oLbx:aCols[2]:nDataStrAlign := AL_LEFT  //  date
   oLbx:aCols[2]:nHeadStrAlign := AL_LEFT

   WITH OBJECT oLbx
       :lTabLikeExcel := .t.
   END

   oLbx:lRecordSelector := .f.
   oLbx:lFooter   := .t.
   oCol           := oLbx:aCols[ 1 ]
   oCol:bFooter   := { || Ltrim( Str( oLbx:KeyNo() ) ) + " / " + LTrim( Str( oLbx:KeyCount() ) ) }
   oLbx:bChange   := { || oCol:RefreshFooter() }

   oLbx:nStretchCol  := 1

   REDEFINE BTNBMP oBtn1 ID 112 OF oDlg  ;
         RESOURCE "OK", "DOK", "DOK" ;
         PROMPT "&Ok" LEFT 2007;
         ACTION ( oDLG:END() )     ;

   REDEFINE BTNBMP oBtn2 ID 113 OF oDlg  ;
         RESOURCE "MINUS16", "DMINUS16", "DMINUS16" ;
         PROMPT "&Del" LEFT 2007;
         ACTION ( _DelUm( oRsTran, oLbx ) )

    oDlg:bResized = { | nSizeType, nWidth, nHeight | ResizeControls( nSizeType, nWidth, nHeight, oDlg )}

ACTIVATE DIALOG oDlg ;
    ON INIT( oLbx:SetFocus(), IF( xAdmin = "Y", , oBtn2:Hide() ));
    ON PAINT ( GradientFill( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, xGrad, .T. ));     // note GradientFill
    VALID(!GETKEYSTATE( 27 ))


oRsTran:Close()
oRsTran := nil
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Resize gradient with Dialog Resize
Posted: Fri Oct 09, 2015 03:06 PM
Rick,

Yes, on startup I use ON INIT

ACTIVATE DIALOG oDlg ;
ON PAINT ABPaint( hDC, 100, 20, oImg:hBitmap, 255 ) ;
ON INIT ( DLG_BACK( oDlg, nDStyle, nColor1, nColor2, lDirect, nGrdPos, nCGrdPos, cBrush, cImage ), ;
FLD_BACK( oFld, nTColor, nColor1, nColor2, lDirect, nGrdPos, nCGrdPos, cBrush, cImage ) )

viewing the sample, You can see that all kind of paintings are defined inside these functions.
That makes a quick change to any style possible.
Painting images is different to gradient.
The gradientstyles : horiz., vert., diagonal and circle also needed different solutions.
Changing the background only the functions DLG_BACK and FLD_BACK are needed.

My new extended release is testing any style-combination
and the transparent painting of the different controls.
New I added a FOLDER that behaves like the dialog with all possible
combinations and control-tests

I added the calculation to define the position of a circle gradient

The screenshot shows the same defined circle inside the dialog and the folder



another samples



the calculation to define any circle-position

Code (fw): Select all Collapse
// nCGrdPos = 4 radios to define the position
// nGrdpos = position-finetuning between 0.1 - 0.9
// aRect := GETCLIENTRECT( oDlg:hWnd ) 

ELSEIF nDStyle = 4 // GRADIENT circle
    oBrush := TBrush():New()
    IF nCGrdPos = 1 // bottom / right
        nOffX := nGrdPos * ( aRect[4] / 2 )
        nOffY := nGrdPos * ( aRect[3] / 2 )
    ELSEIF nCGrdPos = 2 // top / left
        nOffX := - nGrdPos * ( aRect[4] / 2 )
        nOffY := - nGrdPos * ( aRect[3] / 2 )
    ELSEIF  nCGrdPos = 3    // bottom / left
        nOffX := - nGrdPos * ( aRect[4] / 2 )
        nOffY :=  nGrdPos * ( aRect[3] / 2 )
    ELSEIF  nCGrdPos = 4    // top / right
        nOffX :=  nGrdPos * ( aRect[4] / 2 )
        nOffY := - nGrdPos * ( aRect[3] / 2 )
    ENDIF
    DeleteObject( oBrush:hBrush )
    oBrush:hBrush = CircleGradient( 0, { 0, 0, aRect[3], aRect[4] } , nColor1, nColor2, nOffX, nOffY, 1 )


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.

Continue the discussion