📄 drawform.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdlib.h>
#pragma hdrstop
#include "drawform.h"
#include "about.h"
#include "newimage.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma resource "mycursor.res"
Tmainform *mainform;
const mycursor=30;
//---------------------------------------------------------------------------
__fastcall Tmainform::Tmainform(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::FileExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::FormClose(TObject *Sender, TCloseAction &Action)
{
if(Selected)
{
Image1->Canvas->DrawFocusRect(SelectRect);
Selected=false;
}
Action=caFree;
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::ButtonClick(TObject *Sender)
{
if(dynamic_cast<TSpeedButton *>(Sender)!=0)
switch(dynamic_cast<TSpeedButton *>(Sender)->Tag)
{
case dtLine:
DrawingTool=dtLine;
break;
case dtPolyLine:
DrawingTool=dtPolyLine;
PolyCount=0;
break;
case dtEllipse:
DrawingTool=dtEllipse;
break;
case dtRectangle:
DrawingTool=dtRectangle;
break;
case dtRoundRect:
DrawingTool=dtRoundRect;
break;
case dtText:
DrawingTool=dtText;
OutText=true;
break;
case dtSelect:
DrawingTool=dtSelect;
break;
case dtPencil:
DrawingTool=dtPencil;
break;
case dtBezier:
DrawingTool=dtBezier;
BezierEnd=0;
break;
case dtRubber:
DrawingTool=dtRubber;
Image1->Cursor=(TCursor)mycursor;
break;
default:
break;
}
if(Edit->Visible)
Edit->Visible=false;
if(Selected)
{
Image1->Canvas->DrawFocusRect(SelectRect);
Selected=false;
}
if(DrawingTool!=dtRubber)
Image1->Cursor=crCross;
Drawing=false;
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::Image1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{ TRect Rect;
if(Drawing)
switch(DrawingTool)
{
case dtLine:
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->LineTo(X,Y);
Drawing=false;
break;
case dtPolyLine:
if(PolyCount<99&&Button!=mbRight)
{
if(PolyCount!=0)
{
Image1->Canvas->MoveTo(PolyPt[PolyCount-1].x,PolyPt[PolyCount-1].y);
Image1->Canvas->LineTo(PolyPt[PolyCount].x,PolyPt[PolyCount].y);
}
PolyCount++;
}
else if(PolyCount>=99)
{
Application->MessageBox("多义线不能超过100个节点","",MB_ICONINFORMATION+MB_OK);
PolyCount=0;
}
else
PolyCount=0;
Drawing=false;
break;
case dtEllipse:
Image1->Canvas->Ellipse(Origin.x,Origin.y,X,Y);
Drawing=false;
break;
case dtRectangle:
Image1->Canvas->Rectangle(Origin.x,Origin.y,X,Y);
Drawing=false;
case dtRoundRect:
Image1->Canvas->RoundRect(Origin.x,Origin.y,X,Y,20,20);
Drawing=false;
break;
case dtSelect:
Rect=GetRect(Origin,Point(X,Y));//取得当前拉出的一个矩形
if(Rect.Width()==0||Rect.Height()==0)
{
SelectRect.Top=Rect.Top;
SelectRect.Left=Rect.Left;
SelectRect.Right=Rect.Left+1;
SelectRect.Bottom=Rect.Top+1;
}
else
SelectRect=Rect;//将所拉出的矩形赋值给全局变量SelectRect
GetSelImage(SelectRect);//将拉出矩形和选择图形框匹配并将图形拷贝到其中
Selected=true; //已经选择了图形
Drawing=false; //不可再执行移动动作
break;
case dtPencil:
Drawing=false;
break;
case dtBezier:
switch(BezierEnd)
{
case 0:
if(Origin.x==X&&Origin.y==Y)
{
BezierPt[0].x=X;
BezierPt[0].y=Y;
BezierPt[1]=BezierPt[2]=BezierPt[3]=BezierPt[0];
}
else
{
BezierPt[3].x=X;
BezierPt[3].y=Y;
}
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->PolyBezier(BezierPt,3);
BezierEnd++;
break;
case 1:
BezierPt[1].x=X;
BezierPt[1].y=Y;
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->PolyBezier(BezierPt,3);
BezierEnd++;
break;
case 2:
BezierPt[2].x=X;
BezierPt[2].y=Y;
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->PolyBezier(BezierPt,3);
BezierEnd=0;
break;
default:
break;
}
Drawing=false;
break;
case dtRubber:
Image1->Canvas->Brush->Style=PreFill;
Drawing=false;
break;
default:
break;
}
StatusBar1->Panels->Items[1]->Text="X:"+AnsiString(X)+" Y:"+AnsiString(Y);
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TRect Rect;
Drawing=true;
switch (DrawingTool)
{
case dtPolyLine:
if(Button!=mbRight)
PolyPt[PolyCount]=Point(X,Y);
break;
case dtLine:
Image1->Canvas->MoveTo(X,Y);
Origin=Point(X,Y);
MovePt=Point(X,Y);
break;
case dtEllipse:
case dtRectangle:
case dtRoundRect:
Origin=Point(X,Y);
break;
case dtSelect:
if(Selected)//如果已经存在一个选择
{
Origin=Point(X,Y);//取得当前光标所在点
MovePt=Point(X,Y);
Image1->Canvas->DrawFocusRect(SelectRect);//屏蔽选择虚框
}
else//否则
{
Origin=Point(X,Y);//只取得当前光标所在点
MovePt=Point(X,Y);
}
break;
case dtText:
Edit->Font->Color=PenColor->Color;
Image1->Canvas->Font->Color=PenColor->Color;
if(OutText)
Origin=Point(X,Y);
break;
case dtPencil:
Image1->Canvas->MoveTo(X,Y);
break;
case dtBezier:
Origin=Point(X,Y);
break;
case dtRubber:
if(Image1->Canvas->Brush->Style!=bsSolid)
{
PreFill=Image1->Canvas->Brush->Style;
Image1->Canvas->Brush->Style=bsSolid;
}
RubberFill(X,Y,11,10);
break;
default:
break;
}
StatusBar1->Panels->Items[1]->Text="X:"+AnsiString(X)+" Y:"+AnsiString(Y);
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::Image1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
TRect Rect;
if(Drawing)
{
Image1->Canvas->Pen->Mode=pmNotXor;
switch(DrawingTool)
{
case dtLine:
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->LineTo(MovePt.x,MovePt.y);
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->LineTo(X,Y);
break;
case dtEllipse:
Image1->Canvas->Ellipse(Origin.x,Origin.y,MovePt.x,MovePt.y);
Image1->Canvas->Ellipse(Origin.x,Origin.y,X,Y);
break;
case dtRectangle:
Image1->Canvas->Rectangle(Origin.x,Origin.y,MovePt.x,MovePt.y);
Image1->Canvas->Rectangle(Origin.x,Origin.y,X,Y);
break;
case dtRoundRect:
Image1->Canvas->RoundRect(Origin.x,Origin.y,MovePt.x,MovePt.y,20,20);
Image1->Canvas->RoundRect(Origin.x,Origin.y,X,Y,20,20);
break;
case dtSelect:
Rect=GetRect(Origin,MovePt);
Image1->Canvas->DrawFocusRect(Rect);
Rect=GetRect(Origin,Point(X,Y));
Image1->Canvas->DrawFocusRect(Rect);
break;
case dtPencil:
Image1->Canvas->LineTo(X,Y);
Image1->Canvas->MoveTo(X,Y);
break;
case dtBezier:
switch(BezierEnd)
{
case 0:
Image1->Canvas->MoveTo(Origin.x,Origin.y);
BezierPt[0].x=Origin.x;BezierPt[0].y=Origin.y;
BezierPt[3].x=MovePt.x;BezierPt[3].y=MovePt.y;
BezierPt[1]=BezierPt[0];
BezierPt[2]=BezierPt[3];
Image1->Canvas->PolyBezier(BezierPt,3);
Image1->Canvas->MoveTo(Origin.x,Origin.y);
BezierPt[3].x=X;BezierPt[3].y=Y;
BezierPt[2]=BezierPt[3];
Image1->Canvas->PolyBezier(BezierPt,3);
break;
case 1:
Image1->Canvas->PolyBezier(BezierPt,3);
BezierPt[1].x=X;
BezierPt[1].y=Y;
Image1->Canvas->PolyBezier(BezierPt,3);
break;
case 2:
Image1->Canvas->PolyBezier(BezierPt,3);
BezierPt[2].x=X;
BezierPt[2].y=Y;
Image1->Canvas->PolyBezier(BezierPt,3);
break;
default:
break;
}
break;
case dtRubber:
RubberFill(X,Y,11,10);
break;
default:
break;
}
Image1->Canvas->Pen->Mode=pmCopy;
}
MovePt=Point(X,Y);
StatusBar1->Panels->Items[2]->Text="X:"+AnsiString(X)+" Y:"+AnsiString(Y);
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::Image1Click(TObject *Sender)
{
if(DrawingTool==dtText)
if(OutText)
{
Edit->Top=Origin.y;
Edit->Left=Origin.x;
Edit->Visible=true;
Edit->SetFocus();
OutText=false;
}
else
{
Image1->Canvas->Brush->Style=bsClear;
Image1->Canvas->TextOut(Origin.x,Origin.y,Edit->Text);
Edit->Visible=false;
Edit->Text="";
OutText=true;
Image1->Canvas->Brush->Style=bsSolid;
}
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::PenColorClick(TObject *Sender)
{
if(ColorDialog->Execute())
{
PenColor->Color=ColorDialog->Color;
Image1->Canvas->Pen->Color=PenColor->Color;
}
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::FormCreate(TObject *Sender)
{
int i;
AnsiString PenStyleName[7]={"实线","虚线","点划线","点划线变形一","点划线变形二","清除边框","抖动色线"},
BrushStyleName[8]={"实心填充","无填充","水平线","垂直线","左斜线","右斜线","垂直交叉","斜线交叉"};
Screen->Cursors[mycursor] = LoadCursor(HInstance, "RUBBER1");
Application->OnHint = &ShowHint;
for(i=0;i<=6;i++)
PenStyle->Items->Add(PenStyleName[i]);
PenStyle->Text=PenStyleName[0];
for(i=0;i<=7;i++)
BrushStyle->Items->Add(BrushStyleName[i]);
BrushStyle->Text=BrushStyleName[0];
GetFontNames();
CurrentFile="未命名.BMP";
Caption=CurrentFile;
SelectImage=new Graphics::TBitmap;
sSide=30;dSide=45;
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::PenStyleChange(TObject *Sender)
{
Image1->Canvas->Pen->Style=(TPenStyle)PenStyle->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall Tmainform::BrushStyleChange(TObject *Sender)
{
Image1->Canvas->Brush->Style=(TBrushStyle)BrushStyle->ItemIndex;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -