Bueno, tal vez tu puedas integrarlo al gran trabajo que has hecho con Graficas y Bos Taurus
-------------------------------------------------------------------------------------------------------------
Well, maybe you can integrate the great work you've done with Bos Taurus and Graphics
Code: Select all
#include "hmg.ch"
FUNCTION MAIN
DEFINE WINDOW Win1 AT 0,0 WIDTH 600 HEIGHT 400 MAIN ON PAINT Proc_ON_PAINT () BACKCOLOR { 47, 79, 79 } TITLE "Gráfica de Barras Horizontal - By AndyGlezL"
END WINDOW
CENTER WINDOW Win1
ACTIVATE WINDOW Win1
RETURN Nil
PROCEDURE Proc_ON_PAINT
LOCAL nTypeText, cText
LOCAL hDC, BTstruct
LOCAL i1, nRen := 0, nCol := 0
PRIVATE aCols := { { 255, 204, 0 } , { 254, 133, 0 } , { 255, 39, 0 } , { 255, 111, 159 } , {255, 0, 254 } , {82, 0, 82 }, ;
{ 183, 0, 132 } , { 82, 1, 254 } , { 0, 133, 255 } , { 0, 0, 255 } , { 0, 133, 0 } , { 102, 102, 51 } }
PRIVATE aAyos := { "2010", "2011", "2012", "2013", "2014", "2015" }
PRIVATE aSerVal := { 20280, 15420, 12870, 8347, 6540, 4056 }
hDC = BT_CreateDC( "Win1", BT_HDC_INVALIDCLIENTAREA, @BTstruct)
*-------- GRAFICO DE BARRAS HORIZONTAL ----------------------------------------------------------------
nRen += 120 ; nCol := 150
FOR i1 = 1 TO LEN( aSerVal )
nShadow := ClrShadow( aCols[ i1 ], 40 )
nShadow2 := { GetRed( nShadow ), GetGreen( nShadow ), GetBlue( nShadow ) }
BT_DrawGradientFillHorizontal( hDC, nRen, nCol, aSerVal[ i1 ] / 100, 30, nShadow2, aCols[ i1 ] ) // Barra con Gradiente
BT_DrawLine( hDC, nRen+3 , nCol+1, nRen+3, nCol+( aSerVal[ i1 ] / 100 )-1, WHITE , 2 ) // Linea Brillo
BT_DrawLine( hDC, nRen+28, nCol+1, nRen+28, nCol+( aSerVal[ i1 ] / 100 )-1, { 105, 105, 105 } , 1 ) // Linea Sombra
nTypeText := BT_TEXT_TRANSPARENT + BT_TEXT_BOLD // + BT_TEXT_ITALIC + BT_TEXT_UNDERLINE // nAlingText := BT_TEXT_CENTER + BT_TEXT_BASELINE
BT_DrawText( hDC, nRen+4, nCol+5, aAyos[ i1 ], "Verdana", 8, BLUE, WHITE, nTypeText, BT_TEXT_LEFT ) // Titulos
BT_DrawText( hDC, nRen+13, nCol+( aSerVal[ i1 ] / 100 ), TRANSFORM( aSerVal[ i1 ], "99,999" )+" ", ; // Valores
"Verdana", 8, BLACK, WHITE, nTypeText, BT_TEXT_RIGHT )
*------------ BARRAS NEGATIVAS ---------------------------------------
nCol2 := nCol + aSerVal[ i1 ] / 100
IF i1 > 1 // Primer Barra sin negativos
BT_DrawGradientFillHorizontal( hDC, nRen, nCol2+3, ( ( aSerVal[ 1 ] - aSerVal[ i1 ] ) / 100 )-3, 30, { 250, 128, 114 }, RED ) // Barra con Gradiente
BT_DrawLine( hDC, nRen+3 , nCol2+1, nRen+3, nCol2+( ( aSerVal[ 1 ] - aSerVal[ i1 ] ) / 100 )-3, WHITE , 2 ) // Linea Brillo
BT_DrawLine( hDC, nRen+28, nCol2+1, nRen+28, nCol2+( ( aSerVal[ 1 ] - aSerVal[ i1 ] ) / 100 )-3, { 105, 105, 105 } , 1 ) // Linea Sombra
nTypeText := BT_TEXT_TRANSPARENT + BT_TEXT_BOLD // + BT_TEXT_ITALIC + BT_TEXT_UNDERLINE // nAlingText := BT_TEXT_CENTER + BT_TEXT_BASELINE
BT_DrawText( hDC, nRen+13, nCol2+( ( aSerVal[ 1 ] - aSerVal[ i1 ] ) / 100 ), TRANSFORM( aSerVal[ 1 ] - aSerVal[ i1 ], "-99,999" )+" ", ; // Valores
"Verdana", 8, WHITE, WHITE, BT_TEXT_TRANSPARENT, BT_TEXT_RIGHT )
ENDIF
*---------------------------------------------------
nRen += 37
NEXT
BT_DeleteDC (BTstruct)
RETURN
STATIC FUNCTION ClrShadow( nColor, nFactor )
LOCAL aHSL, aRGB
aHSL := RGB2HSL( GetRed(nColor), GetGreen(nColor), GetBlue(nColor) )
aHSL[3] -= nFactor
aRGB := HSL2RGB( aHSL[1], aHSL[2], aHSL[3] )
RETURN RGB( aRGB[1], aRGB[2], aRGB[3] )
STATIC FUNCTION RGB2HSL( nR, nG, nB )
LOCAL nMax, nMin
LOCAL nH, nS, nL
IF nR < 0
nR := Abs( nR )
nG := GetGreen( nR )
nB := GetBlue( nR )
nR := GetRed( nR )
ENDIF
nR := nR / 255
nG := nG / 255
nB := nB / 255
nMax := Max( nR, Max( nG, nB ) )
nMin := Min( nR, Min( nG, nB ) )
nL := ( nMax + nMin ) / 2
IF nMax = nMin
nH := 0
nS := 0
ELSE
IF nL < 0.5
nS := ( nMax - nMin ) / ( nMax + nMin )
ELSE
nS := ( nMax - nMin ) / ( 2.0 - nMax - nMin )
ENDIF
DO CASE
CASE nR = nMax
nH := ( nG - nB ) / ( nMax - nMin )
CASE nG = nMax
nH := 2.0 + ( nB - nR ) / ( nMax - nMin )
CASE nB = nMax
nH := 4.0 + ( nR - nG ) / ( nMax - nMin )
ENDCASE
ENDIF
nH := Int( (nH * 239) / 6 )
IF nH < 0 ; nH += 240 ; ENDIF
nS := Int( nS * 239 )
nL := Int( nL * 239 )
RETURN { nH, nS, nL }
STATIC FUNCTION HSL2RGB( nH, nS, nL )
LOCAL nFor
LOCAL nR, nG, nB
LOCAL nTmp1, nTmp2, aTmp3 := { 0, 0, 0 }
nH /= 239
nS /= 239
nL /= 239
IF nS == 0
nR := nL
nG := nL
nB := nL
ELSE
IF nL < 0.5
nTmp2 := nL * ( 1 + nS )
ELSE
nTmp2 := nL + nS - ( nL * nS )
ENDIF
nTmp1 := 2 * nL - nTmp2
aTmp3[1] := nH + 1 / 3
aTmp3[2] := nH
aTmp3[3] := nH - 1 / 3
FOR nFor := 1 TO 3
IF aTmp3[nFor] < 0
aTmp3[nFor] += 1
ENDIF
IF aTmp3[nFor] > 1
aTmp3[nFor] -= 1
ENDIF
IF 6 * aTmp3[nFor] < 1
aTmp3[nFor] := nTmp1 + ( nTmp2 - nTmp1 ) * 6 * aTmp3[nFor]
ELSE
IF 2 * aTmp3[nFor] < 1
aTmp3[nFor] := nTmp2
ELSE
IF 3 * aTmp3[nFor] < 2
aTmp3[nFor] := nTmp1 + ( nTmp2 - nTmp1 ) * ( ( 2 / 3 ) - aTmp3[nFor] ) * 6
ELSE
aTmp3[nFor] := nTmp1
ENDIF
ENDIF
ENDIF
NEXT nFor
nR := aTmp3[1]
nG := aTmp3[2]
nB := aTmp3[3]
ENDIF
RETURN { Int( nR * 255 ), Int( nG * 255 ), Int( nB * 255 ) }