A pen is an instrument used to draw a line or a curve.
In Microsoft Windows, a pen is represented by a structure called HPEN. The
VCL simplifies the creation of a pen through a class call TPen. The
following example shows how to use a VCL's TPen and how to use a Win32
API's HPEN in a VCL project.
|
|
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
const TPenStyle pStyle[] = { psSolid, psDash, psDot, psDashDot,
psDashDotDot, psClear, psInsideFrame };
const UINT pHatch[] = { HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS,
HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL };
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TLabel *Label1;
TComboBox *ComboBox1;
TComboBox *ComboBox2;
TLabel *Label2;
void __fastcall FormCreate(TObject *Sender);
void __fastcall ComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State);
void __fastcall ComboBox2DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State);
void __fastcall FormPaint(TObject *Sender);
private:
HPEN hPen;
LOGBRUSH LBrush; // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
|
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i = 0; i < 8; i++)
ComboBox1->Items->Add(pStyle[i]);
for(int j = 0; j < 6; j++)
ComboBox2->Items->Add(pHatch[j]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
if( State.Contains(odSelected) )
ComboBox1->Canvas->Brush->Color = clHighlight;
else
ComboBox1->Canvas->Brush->Color = clWhite;
ComboBox1->Canvas->FillRect(Rect);
ComboBox1->Canvas->Pen->Style = pStyle[Index];
ComboBox1->Canvas->Pen->Width = 1;
ComboBox1->Canvas->MoveTo(0, Rect.Top + 8);
ComboBox1->Canvas->LineTo(Rect.Width(), Rect.Top + 8);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
if( State.Contains(odSelected) )
ComboBox2->Canvas->Brush->Color = clHighlight;
else
ComboBox2->Canvas->Brush->Color = clWhite;
ComboBox2->Canvas->FillRect(Rect);
LBrush.lbStyle = BS_HATCHED;
LBrush.lbColor = RGB(0, 0, 0);
LBrush.lbHatch = pHatch[Index];
hPen = ExtCreatePen(PS_GEOMETRIC, 8, &LBrush, 0, NULL);
ComboBox2->Canvas->Pen->Handle = hPen;
ComboBox2->Canvas->MoveTo(0, Rect.Top + 9);
ComboBox2->Canvas->LineTo(Rect.Width(), Rect.Top + 9);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
TRect rc;
HDC hdc;
int i;
rc = GetClientRect();
rc.left = 220;
rc.top = 24;
rc.right = rc.left + 140;
LBrush.lbStyle = BS_SOLID;
LBrush.lbColor = RGB(0,0,0);
LBrush.lbHatch = 0;
for (i = 0; i < 7; i++)
{
Canvas->Pen->Style = pStyle[i];
Canvas->Pen->Width = 1;
Canvas->MoveTo(rc.left, rc.top + (i * 20));
Canvas->LineTo(rc.right, rc.top + (i * 20));
}
rc.left = 380;
rc.right = rc.left + 140;
for (i = 0; i < 6; i++)
{
LBrush.lbStyle = BS_HATCHED;
LBrush.lbColor = RGB(0, 0, 0);
LBrush.lbHatch = pHatch[i];
hPen = ExtCreatePen(PS_GEOMETRIC, 12, &LBrush, 0, NULL);
this->Canvas->Pen->Handle = hPen;
Canvas->MoveTo(rc.left, rc.top + (i * 20));
Canvas->LineTo(rc.right, rc.top + (i * 20));
}
}
//---------------------------------------------------------------------------
|
Example: Using the ExtCreatePen() function:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
DWORD pStyle = PS_GEOMETRIC | PS_DASHDOTDOT |
PS_ENDCAP_SQUARE | PS_JOIN_BEVEL;
DWORD pWidth = 16;
LOGBRUSH lBrush;
lBrush.lbStyle = BS_HATCHED;
lBrush.lbColor = clBlue;
lBrush.lbHatch = HS_DIAGCROSS;
HPEN hPen = ExtCreatePen(pStyle, pWidth, &lBrush, NULL, NULL);
Canvas->Pen->Handle = hPen;
Canvas->MoveTo(100, 200);
Canvas->LineTo(540, 200);
}
//---------------------------------------------------------------------------
|
|
|