⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawform.cpp

📁 C++Builder程序员编程手记《配书光盘》
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
#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 + -