...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