Site hosted by Angelfire.com: Build your free website today!

Home
DelphiZeus
13C. Using GrafCtrls Program
Example code for Graphic Controls,
in the GrafCtrls.pas unit

Home



A Program to use the GrafCtrls.pas unit

Below is the code for a Program that uses the G Controls - GLabel, GButton, GArrow, and GBorder. This has code in it to show you how to use some of the functions in the GrafCtrls.pas unit from the previous page 13B. Graphic Controls.

Code for the UseGrafCtrl.DPR program file -
This uses the MakeApp.pas unit from DelphiZeus Lesson 13. MakeApp Unit

program UseGrafCtrl;

uses
  MakeApp,
  UseGrafU in 'UseGrafU.pas';

{$R *.RES}

begin
if MakeProgram then
  RunMsgLoop;
end.

Code for the UseGrafU.pas Unit file -
There are several examples in this unit for creating and changing the visual controls available in the GrafCtrl unit. All of the G control creation code is in the MakeControls procedure. Please notice that in the hForm1 window message procedure MessageFunc( ) all of the GControl "Draw" procedures are called in the WM_PAINT message handler.
In all of the MakeGButton( ) functions, the GBut1Proc procedure is assigned to the TGButProc parameter, as the procedure to be called for button clicks.

See the comments in the code for more information.

unit UseGrafU;
{this unit will give examples of code to use the functions in the
 GrafCtrls  Unit for GLabels, GButtons, GArrows and GBorders}

interface

function MakeProgram: Boolean;
{the MakeProgram function will call some functions to create the windows
and controls for this Application.
If there is a creation error, it returns False}

implementation

uses
  Windows, Messages, MakeApp, GrafCtrls, SmallUtils;

const
One = 1;
ID_ExitBut = 1000;
GroupColor: Cardinal = $5058EB;

var
hForm1: Integer = Zero;
Font1: Integer = Zero;
Font2: Integer = Zero;
{all of the Graphic Controls in the GrafCtrls unit have Integer ID
 which I use Like a "Handle" in the GrafCtrls  functions}
hButExit, gLabel1, gLabel2, gLabel3, gLabel4, gButArrow,
gButButton, gButLabel, gButBorder, gArrow1, gArrow2, gArrow3,
gBorder1, GroupBorder, FrameBorder: Integer;

procedure ChangeBorders;
begin
// this procedure changes the 3 graphic Borders

{there are 3 Graphic Control Functions
MoveGCtrl
ShowGCtrl
isGCtrlVisible
which will work on the three G Controls
GArrow, GButton, and GBorder}
if isGCtrlVisible(FrameBorder) then
  begin
  ShowGCtrl(FrameBorder, False); // changes the visible for FrameBorder
  ChangeGBorder(gBorder1, -1, bkBump, Zero); // changes the type of Border1
  GBorderColors(gBorder1, $00FFF0, $FF3333); // does special border colors
  MoveGCtrl(gBorder1, 310, 110, 140, 118); // moves Border1
  ChangeGBorder(GroupBorder, $3FD03F, bkGrove, $20);
     // changes the type and Color of GroupBorder
  end else
  begin
  ShowGCtrl(FrameBorder);
  ChangeGBorder(gBorder1, GetSysColor(COLOR_BTNFACE), bkDown, $1A);
  MoveGCtrl(gBorder1, 330, 120, 120, 100);
  ChangeGBorder(GroupBorder, $D030D0, bkNon, $3F);
  // by using bkNon in ChangeGBorder, the border Type is NOT changed
  end;
end;


procedure GBut1Proc(GButton: Integer);
var
ArwPnt: TPoint;
bColor: Integer;
ShowB: Boolean;
ButStr: String;
begin
{This GBut1Proc procedure is a TGButProc type, with a single parameter GButton.
 It has been Assigned to all of the GButtons in their MakeGButton functions.
 the GButton will have the button Identifier for the button that was clicked}
if GButton = gButButton then
  begin
  // button Click to Change the G Buttons
  ChangeGButton(gButLabel, '', not isGButEnabled(gButLabel));
     // disable GButLabel
  if isGCtrlVisible(gButArrow) then // returns the visible state of gButArrow
    begin
    ShowB := False; // variables used in the GButton functions below
    bColor := $FF;
    MoveGCtrl(gButBorder,24,214, Zero,Zero);
    ButStr := 'UnDo GButtons';
    end else
    begin
    ShowB := True;
    bColor := $EF00;
    MoveGCtrl(gButBorder,154,214, Zero,Zero);
    ButStr := 'Do GButtons';
    end;
  ShowGCtrl(gButArrow, ShowB); // show and hide gButArrow
  ChangeGButton(gButButton, ButStr);
  setGButtonFont(gButBorder, DEF, bColor); // change color of gButBorder
  end else
  if GButton = gButLabel then
    begin
    { button click for changing GLabels
    GLabels are the only G control that has it's Array of position info
    availible to the user, so there are less functions to use to change
    the control, you will directly change the array values to change
    the display of the G Label}
    RefreshGLabel(gLabel2, AryGLabel[gLabel2].Hide);
      // changes the visibility of Label2
    if AryGLabel[gLabel4].GRect.Left = 160 then
      begin
      // I access the array  AryLabel  to change the properties of a Label
      RefreshGLabel(gLabel4);
        {if I change a Label's Position, I need to call  RefreshLabel  before
        the change, to erase where the Label used to be}
      AryGLabel[gLabel4].GRect.Left := 340;
      // I cahnge the position, font, and color of Label4
      AryGLabel[gLabel4].GRect.Top := 193;
      AryGLabel[gLabel4].FontHnd := Font1;
      AryGLabel[gLabel4].TextColor := $FFAA00;
      DoGLabelRect(gLabel4); // you MUST call DoLabelRect to resize the Bounds Rect
      RefreshGLabel(gLabel4);
        // You MUST call RefreshLabel after to redraw the new Label
      ChangeGLabel(gLabel3, 'Other Text on Label'); // change text for Label3
        // ChangeLabel will call the DoLabelRect and RefreshLabel
      ChangeGLabel(gLabel1, '', Zero); // change Font for Label1
      end else
      begin
      RefreshGLabel(gLabel4);
      AryGLabel[gLabel4].GRect.Left := 160;
      AryGLabel[gLabel4].GRect.Top := 76;
      AryGLabel[gLabel4].TextColor := $FFFFFF;
      DoGLabelRect(gLabel4);
      RefreshGLabel(gLabel4);
      ChangeGLabel(gLabel3, 'Changed Text');
      ChangeGLabel(gLabel1, '', DEF);
      end;
    end else
  if GButton = gButArrow then
    begin
    // button click for changing G Labels
    ArwPnt.x := 0;
  { the GetGArrow will get most of the Arrow properties, I have the Return
    parameters as pointers, so if you do NOT need that property, then
    just have NIL as that parameter}
    bColor := GetGArrow(gArrow1, @ArwPnt, nil, nil);
  {this GetGArrow will retrive only the Arrow Point Position and color, since
I do not need the Arrow Rectangle or Arrow Type , I have a NIL for those parameters}
    if bColor < Zero then Exit;
    // if the index is out of range GetGArrow gives a bColor as -1
    if ArwPnt.x <> 417 then
      begin
      MoveGCtrl(gArrow1, 417, 177, Zero, Zero); // moves Arrow1
      ChangeGArrow(gArrow1, 16, 36, akUp);
      // changes the width and length and Arrow Type

      if bColor = $DF33DF then
        GArrowColor(gArrow1, $00DFFF) // change Arrow1 color
        else
        GArrowColor(gArrow1, $FFFFFF);
      ChangeGArrow(gArrow2, 12, 22, akNon);
    // a ChangeGArrow with atNon will NOT change the Arrow Type
      ChangeGArrow(gArrow3, 12, 69, akRight);
      end else
      begin
      MoveGCtrl(gArrow1, 347, 164, Zero, Zero);
      ChangeGArrow(gArrow1, 16, 36, akDown);
      GArrowColor(gArrow1, $DF33DF);
      ChangeGArrow(gArrow2, 8, 20, akNon);
      ChangeGArrow(gArrow3, 22, 50, akUp);
      end;
    end else

  if GButton = gButBorder then ChangeBorders;
end;



function MessageFunc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
var
PaintS: TPaintStruct;
begin
Result := Zero;
case Msg of
  WM_DESTROY: PostQuitMessage(Zero);
    WM_PAINT:
    begin
    BeginPaint(hWnd, PaintS);
// IMPORTANT, you MUST call the Draw procedure for all of the
// different Graphic Controls you use in their parents WM_PAINT message
// in order to have the controls painted
    DrawGBorder(hWnd, PaintS.hDC, PaintS.rcPaint);
    DrawGLabels(hWnd, PaintS.hDC, PaintS.rcPaint);
    DrawGArrow(hWnd, PaintS.hDC, PaintS.rcPaint);
    DrawGBut(hWnd, PaintS.hDC, PaintS.rcPaint);

// the next code draws text for the Group Border
    SelectObject(PaintS.hdc, VarFont);
    SetBkColor(PaintS.hdc, GetSysColor(COLOR_BTNFACE));
    SetBkMode(PaintS.hdc, OPAQUE);
    SetTextColor(PaintS.hdc, GroupColor);
    TextOut(PaintS.hdc, 24,92,' Group Border ',14);
    
    EndPaint(hWnd,PaintS);
    Exit;
    end;
  WM_COMMAND:
    if LOWORD(wParam) = ID_ExitBut then
      PostMessage(hForm1, WM_CLOSE, Zero, Zero);

{for the Graphic Buttons to have an OnClick event, you will need to
 pass their parent's WM_LBUTTONDOWN and WM_LBUTTONUP message to the
 GButLDown and GButLUp procedures}
  WM_LBUTTONDOWN: GButLDown(hWnd, lParam);
  WM_LBUTTONUP: GButLUp(hWnd);
  end;
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;


procedure MakeControls;
var
CRect: TRect;
begin
Font1 := MakeFont(-15, 10, 'Arial');
Font2 := MakeFont(-17, 10, 'Comic Sans MS');

hButExit := MakeButton(382,238,84, 24, 'E X I T', hForm1, ID_ExitBut, Font1);
// there is only One system window control, the Exit button above

{Graphic Labels are created with the MakeLabel function, the Color and Font
 parameters are optional, there are no width and height parameters, because
 they are automatically calculated and placed in the AryGLabel GRect}
gLabel1 := MakeGLabel(hForm1, 8, 5, 'Label One');
gLabel2 := MakeGLabel(hForm1, 68, 106, 'Label In Group', GroupColor, Font1);
gLabel3 := MakeGLabel(hForm1, 210, 5, 'Label Three', Zero, Font2);
gLabel4 := MakeGLabel(hForm1, 160, 66, 'Label Four', $AF00, Zero);
MakeGLabel(hForm1, 137, 132, 'Click to change Labels', GroupColor);


{Graphic Buttons are made with the MakeGButton function, it has the standard
 Left, Top, Width and Height parameters, and the Button Caption. In order to
 get a button Click event for a Graphic Button you will need to include a
 TGButProc procedure, I use the  GBut1Proc procedure for all of these
 GButtons, but you could use separate TGButProc for a GButton}
gButButton := MakeGButton(hForm1, 41,36, 168,28, 'Do Buttons', GBut1Proc);
{the setGButtonFont will change the Font and Text color for a G button}
setGButtonFont(GButButton, Font1, $FF33C7);

gButLabel := MakeGButton(hForm1, 24,128, 84,24, 'Change Labels', GBut1Proc);
setGButtonFont(GButLabel, VarFont, GroupColor);

gButArrow := MakeGButton(hForm1, 74,174, 112,26, 'Change Arrows', GBut1Proc);

gButBorder := MakeGButton(hForm1, 154,214, 94,24, 'Change Borders', GBut1Proc);
setGButtonFont(GButBorder, VarFont);

{Graphic Arrows are created with the MakeGArrow function, this does NOT have the
 Top or Left parameters, instead it's position is from the PointX and PointY,
 setting the position of the Arrow's Point, NOT the arrow bounds rectangle}
gArrow1 := MakeGArrow(hForm1, 377, 167, 16, 36, akDown, $FF00);
gArrow2 := MakeGArrow(hForm1, 112, 138, 8, 20, akLeft, GroupColor);
gArrow3 := MakeGArrow(hForm1, 326, 41, 20, 50, akUp, $C86870);

{Borders are created with the  MakeGBorder  function, it has the standard
 Left, Top, Width, and Height parameters. You set the Kind parameter to the
 TBorderKind you want the border to be. The Color parameter will be changed
 by the HiLoOff parameter (a Byte value) for the difference between the
 HighLight and Shadow (Dark) colors}
gBorder1 := MakeGBorder(hForm1, 330, 120, 120, 101, bkOut,
               GetSysColor(COLOR_BTNFACE), $1A);
GroupBorder := MakeGBorder(hForm1, 16, 98, 248, 150, bkBump, GroupColor, $48);
GetClientRect(hForm1, CRect);
FrameBorder := MakeGBorder(hForm1, 1, 1, CRect.Right -2, CRect.Bottom-2,
                           bkGrove, $EF6F7F, $58);
SetFocus(hButExit);
end;


function MakeProgram: Boolean;
begin
Result := False;
if SetWinClass('GrafCtrl'#9'Class', @MessageFunc) = Zero then Exit;

hForm1 := MakeForm(DEF, DEF, 480, 281, 'Use GrafCtrls',
                   WS_TILEDWINDOW or WS_CLIPCHILDREN);
if hForm1 = Zero then Exit;
Result := True;
MakeControls; // control creation
end;

initialization

finalization
DeleteObject(Font1);
DeleteObject(Font2);

end.
 

This should give you some ideas about using the GControls in the GrafCtrl.pas Unit.


                           

Next
The following lesson shows you how to create the system Open and Save Dialog Boxes.
  14. Open and Save Dialogs


       

Lesson -     One  Two  Three  Four  Five  Six  Seven  Eight  Nine  Ten  Eleven  Twelve  Thirteen  Fourteen




H O M E