## ...using scroll bars and pixmaps to display COLORS

Here's a program submitted on the Euphoria mailing list by Brian Broker. It makes use of scrollbars to select the three individual RGB color values, and displays the resulting color in a display box.

Since Brian has commented it quite nicely, I won't say too much about it, except for the pixmaps used in this program.

A pixmap is actually an off-screen copy of the pixel data you would normally see on the physical screen. By creating your image information in a pixmap, and then copying the entire pixmap to the screen, you don't see all the individual changes as your program creates them.

Even a tiny program like sysinfo.exw in lesson 16, causes a lot of 'blinking' and 'flickering', even though it's only displaying a few lines of text. A program which uses more text, and some graphical elements as well, would blink even more, and look quite 'hectic' as a result

Using pixmaps provides a much nicer steady display, so much so that I've used a pixmap buffer in lesson 25, which displays much the same information as did sysinfo.exw.

This program is quite handy for visualizing the colors actually created for different RGB values, however you should remember that what a user actually sees will depend on the color resolution on their system, which might be different from yours.

There are a lot of new functions and procedures relating specifically to graphics in this program, so take your time going through it.

...and thanks, Brian, for your contribution.

-- RGBview.exw

    ---------------------------------
    -- RGBview.exw by Brian Broker --
    ---------------------------------
    -- (last revised JAN 2000)
    -- Description: a simple tool for viewing RGB colors
    -- (demonstrates use of scroll bars and pixmaps)

    include win32lib.ew
    without warning

    constant
      Title   = "RGBview",
      Version = "1.0"

    -- these integer values are used to keep track of
    --   the colors defined by the three scroll bars
    integer red, green, blue
      red = 128
      green = 128
      blue = 128

    constant
      BGcolor = getSysColor( COLOR_BTNFACE ),
      RGBWin = create( Window, Title, 0, Default, Default, 470, 200, 0 ),
    -- using a pixmap buffer takes a load off of the repaint routine
      Buffer = create( Pixmap, "", 0, 0, 0, 470, 200, 0 ),
      About = create( DefPushButton, "About", RGBWin, 360, 10, 80, 30, 0 ),

    -- RGB value display buffers
    -- these provide a way to display colored text that can
    --  be easily updated and displayed without a flicker
      RedVal   = create( Pixmap, "", 0, 0, 0, 85, 15, 0 ),
      GreenVal = create( Pixmap, "", 0, 0, 0, 85, 15, 0 ),
      BlueVal  = create( Pixmap, "", 0, 0, 0, 85, 15, 0 ),

    -- create scroll controls
      RedScroll   = create( HScroll, "Red", RGBWin, 10, 50, 305, 16, 0 ),
      GreenScroll = create( HScroll, "Green", RGBWin, 10, 100, 305, 16, 0 ),
      BlueScroll  = create( HScroll, "Blue", RGBWin, 10, 150, 305, 16, 0 )

    ----------------------
    -- Misc. procedures --
    ----------------------
    -- clear Window/Pixmap to specified color
    --  this is a re-usable routine for Windows and Pixmaps;
    --  note that it does not restore the original pen color
    procedure clearWindow( integer id, integer color )
      sequence p

      p = getCtlSize( id )

      setPenColor( id, color )
      drawRectangle( id, 1, 0, 0, p[1], p[2] )
    end procedure

    -- draw a sunken windows-like border
    --  this is a re-usable routine, just use the same x and y values
    --  as the rectangle that wants a border
    procedure draw_Border(integer id,integer x1,integer y1,integer x2,integer y2)
      integer c

      setPenColor( id, Black )
      drawLine( id, (x1-1), (y1-1), (x2+1), (y1-1) )
      drawLine( id, (x1-1), (y1-1), (x1-1), (y2+1) )

      c = rgb( 128, 128, 128 )
      setPenColor( id, c )
      drawLine( id, (x1-2), (y1-2), (x2+2), (y1-2) )
      drawLine( id, (x1-2), (y1-2), (x1-2), (y2+2) )

      c = rgb( 224, 224, 224 )
      setPenColor( id, c )
      drawLine( id, x2, y2, (x1-1), y2 )
      drawLine( id, x2, y2, x2, (y1-1) )

      setPenColor( id, BrightWhite )
      drawLine( id, (x2+1), (y2+1), (x1-2), (y2+1) )
      drawLine( id, (x2+1), (y2+1), (x2+1), (y1-2) )
    end procedure

    -- update the color view 'window'
    procedure update_Color()
      integer color

      color = rgb( red, green, blue )
      -- update both Window and Buffer
      setPenColor( RGBWin, color)
      drawRectangle( RGBWin, 1, 350, 58, 450, 158 )
      setPenColor( Buffer, color)
      drawRectangle( Buffer, 1, 350, 58, 450, 158 )
    end procedure

    -- update a value display buffer
    procedure updateRGBval( integer id, integer color, sequence string )
      -- clear buffer
      clearWindow( id, BGcolor )

      -- print new value in buffer
      setTextColor( id, color )
      wPuts( id, string )
    end procedure

    -- initialize window display buffer
    procedure init_Buffer()
      clearWindow( Buffer, BGcolor )

      draw_Border( Buffer, 350, 58, 450, 158 )
      update_Color()

      setTextColor( RGBWin, Black )

      setFont( Buffer, "Courier", 12, Bold+Underline )
      setPenPos( Buffer, 120, 5 )
      wPrintf( Buffer, "DEC", {} )
      setPenPos( Buffer, 173, 5 )
      wPrintf( Buffer, "HEX", {} )

      setFont( Buffer, "Arial", 14, Bold )

      setTextColor( Buffer, BrightRed )
      setPenPos( Buffer, 10, 25 )
      wPrintf( Buffer, "Red:", {} )
      copyBlt( Buffer, 120, 30, RedVal )

      setTextColor( Buffer, Green )
      setPenPos( Buffer, 10, 75 )
      wPrintf( Buffer, "Green:", {} )
      copyBlt( Buffer, 120, 80, GreenVal )

      setTextColor( Buffer, BrightBlue )
      setPenPos( Buffer, 10, 125 )
      wPrintf( Buffer, "Blue:", {} )
      copyBlt( Buffer, 120, 130, BlueVal )
    end procedure

    -- procedures for handling scroll bars --
    -----------------------------------------

    -- Red scroll bar handler
    procedure onScroll_RedScroll( integer self, integer event, sequence params )
      integer value = params[1]

      red = value - 1
      update_Color()
      updateRGBval(RedVal,BrightRed,sprintf("%3d = #%02x",{red,red}) )
      -- update both Window and Buffer
      copyBlt( RGBWin, 120, 30, RedVal )
      copyBlt( Buffer, 120, 30, RedVal )
    end procedure
    setHandler( RedScroll, w32HScroll, routine_id( "onScroll_RedScroll" ) )

    -- Green scroll bar handler
    procedure onScroll_GreenScroll( integer self, integer event, sequence params )
      integer value = params[1]

      green = value - 1
      update_Color()
      updateRGBval(GreenVal,Green,sprintf("%3d = #%02x",{green,green}) )
      -- update both Window and Buffer
      copyBlt( RGBWin, 120, 80, GreenVal )
      copyBlt( Buffer, 120, 80, GreenVal )
    end procedure
    setHandler( GreenScroll, w32HScroll, routine_id( "onScroll_GreenScroll" ) )

    -- Blue scroll bar handler
    procedure onScroll_BlueScroll( integer self, integer event, sequence params )
      integer value = params[1]

      blue = value - 1
      update_Color()
      updateRGBval(BlueVal,BrightBlue,sprintf("%3d = #%02x",{blue,blue}) )
      -- update both Window and Buffer
      copyBlt( RGBWin, 120, 130, BlueVal )
      copyBlt( Buffer, 120, 130, BlueVal )
    end procedure
    setHandler( BlueScroll, w32HScroll, routine_id( "onScroll_BlueScroll" ) )

    -- display information about the program when 'About' button is clicked --
    procedure aboutButton( integer self, integer event, sequence params )
      integer result

      result = message_box( Title & "  Version " & Version & "\n\n" &
                            "by Brian K. Broker\n\n" &
                            "Developed using David Cuny's Win32Lib",
                            "About...",
                            MB_ICONINFORMATION+MB_APPLMODAL )
    end procedure
    onClick[About] = routine_id( "aboutButton" )

    -- repaint window by copying Buffer to Window
    procedure onPaint_RGBWin( integer self, integer event, sequence params )
      copyBlt( RGBWin, 0, 0, Buffer )
    end procedure
    setHandler( RGBWin, w32HPaint, routine_id( "onPaint_RGBWin" ) )

    -- set up scroll controls
    procedure onOpen_RGBWin( integer self, integer event, sequence params )
      -- set font for RGB value display buffers
      setFont( RedVal, "Courier", 12, 0 )
      setFont( GreenVal, "Courier", 12, 0 )
      setFont( BlueVal, "Courier", 12, 0 )

      -- set range of scroll bars
      setScrollRange( RedScroll, 1, 256 )
      setScrollRange( GreenScroll, 1, 256 )
      setScrollRange( BlueScroll, 1, 256 )

      -- set scroll line/page up/down increments
      setScrollChange( RedScroll, 1, 16 )
      setScrollChange( GreenScroll, 1, 16 )
      setScrollChange( BlueScroll, 1, 16 )

      -- set scroll bars to default color (defined above)
      setScrollPos( RedScroll, red )
      setScrollPos( GreenScroll, green )
      setScrollPos( BlueScroll, blue )

      -- initialize window display buffer
      init_Buffer()
    end procedure
    setHandler( RGBWin, w32HOpen, routine_id( "onOpen_RGBWin" ) )

    -------- start ----------
    -------------------------
    WinMain( RGBWin, Normal )
    -------------------------

...and the obligatory screen shot...

...end...

CONTENTS