📄 c13_4f.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "C13_4f.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ // 构造函数
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExitClick(TObject *Sender)
{
Close(); // 关闭当前窗体
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LStyle2Click(TObject *Sender)
{
TMenuItem *p = (TMenuItem*)Sender;
LineStyle = psDash; // 该设置只有在线宽(Width)
// 为“1”时有效,
// 如果Pen->Width>1,将忽略该设置
// 并使用缺省的实线。
p->Checked = true;
OneClick(Sender); // 设置线宽
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LStyle1Click(TObject *Sender)
{
TMenuItem *p = (TMenuItem*)Sender; // 指针类型转换
LineStyle = psSolid; // 实线
p->Checked = true; // 设置菜单选择
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LStyle3Click(TObject *Sender)
{
TMenuItem *p = (TMenuItem*)Sender; // 指针类型转换
LineStyle = psDashDot; // 点划线,
// 该设置只有在Pen->Width=1时有效。
p->Checked = true; // 设置菜单
OneClick(Sender); // 设置线宽(为1)
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LStyle4Click(TObject *Sender)
{
TMenuItem *p = (TMenuItem*)Sender; // 指针类型转换
LineStyle = psDashDotDot; // 双点划线
// 该设置只有在Pen->Width=1时有效。
p->Checked = true; //设置菜单选择
OneClick(Sender); // 设置线宽
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OneClick(TObject *Sender)
{
LineWidth = 1; // 设置线宽
One->Checked = true; // “选择”菜单
sOne->Down = true; // “按下”按钮
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TwoClick(TObject *Sender)
{
LineWidth = 2; // 设置线宽
Two->Checked = true; // “选择”菜单
sTwo->Down = true; // “按下”按钮
LineStyle = psSolid; // 设置线形(为实线)。
LStyle1->Checked = true; // 设置线形菜单显示
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ThreeClick(TObject *Sender)
{
LineWidth = 3; // 设置线宽
Three->Checked = true; // “选择”菜单
sThree->Down = true; // “按下”按钮
Image1->Canvas->Pen->Style = psSolid; // 设置线形(为实线)。
LStyle1->Checked = true; // 设置线形菜单显示
LineStyle = psSolid; // 设置线形(为实线)。
LStyle1->Checked = true; // 设置线形菜单显示
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FiveClick(TObject *Sender)
{
LineWidth = 5; // 设置线宽
Five->Checked = true; // “选择”菜单
sFive->Down = true; // “按下”按钮
LineStyle = psSolid; // 设置线形(为实线)。
LStyle1->Checked = true; // 设置线形菜单显示
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
Image1->Canvas->Refresh(); // 强制刷新画布
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BlackClick(TObject *Sender)
{
Black->Checked = true; // “选择”菜单
sBlack->Down = true; // “按下”按钮
LineColor = clBlack; // 设置笔颜色为黑色
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RedClick(TObject *Sender)
{
Red->Checked = true; // “选择”菜单
sRed->Down = true; // “按下”按钮
LineColor = clRed; // 设置笔颜色为红色
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BlueClick(TObject *Sender)
{
Blue->Checked = true; // “选择”菜单
sBlue->Down = true; // “按下”按钮
LineColor = clBlue; // 设置笔颜色为蓝色
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GreenClick(TObject *Sender)
{
Green->Checked = true; // “选择”菜单
sGreen->Down = true; // “按下”按钮
LineColor = clGreen; // 设置笔颜色为绿色
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(!Step)
{ // 输入第一个点
Step = 1;
X1 = X; // 保存端点位置
Y1 = Y;
SetXor(); // 设置异或状态
DrawCross(Image1->Canvas, X1, Y1);
}
else if(Step == 1)
{ // 输入第二个点
Step = 2;
X2 = X3 = X;
Y2 = Y3 = Y;
DrawCross(Image1->Canvas, X2, Y2);
DrawArc();
}
else
{ // 输入第三个点
Step = 0;
DrawArc();
DrawCross(Image1->Canvas, X1, Y1);
DrawCross(Image1->Canvas, X2, Y2);
X3 = X;
Y3 = Y;
RestoreSet();
DrawArc();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Step = 0; // 初始化
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(Step == 2) // 判断输入点状态
{ // 等于2为动态画线状态
DrawArc(); // 擦
X3 = X; // 修改点位置
Y3 = Y;
DrawArc(); // 画
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetXor()
{
// 设置异或状态
Image1->Canvas->Pen->Color = clWhite; // 设置笔为白色,
// 缺省时为黑色,黑色不能用于异或色。
// 因为黑色为全零,异或后画布不变色,
// 不能看到绘图结果。
Image1->Canvas->Pen->Style = psSolid;
Image1->Canvas->Pen->Width = 1;
Image1->Canvas->Pen->Mode = pmXor;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RestoreSet()
{
// 恢复设置
Image1->Canvas->Pen->Color = LineColor;
Image1->Canvas->Pen->Style = LineStyle;
Image1->Canvas->Pen->Width = LineWidth;
Image1->Canvas->Pen->Mode = pmCopy;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawArc()
{
long xx1 = X1*X1; // X1的平方
long yy1 = Y1*Y1; // ...
long xx2 = X2*X2; // ...
long yy2 = Y2*Y2; // ...
long xx3 = X3*X3; // ...
long yy3 = Y3*Y3; // ...
long A = xx3+yy3-xx1-yy1;
long B = xx2+yy2-xx1-yy1;
long A1 = (X3-X1)*(Y1-Y2);
long B1 = (X2-X1)*(Y1-Y3);
float A_B= A1==B1?0.0001:A1-B1;
float x0, y0; // 圆心坐标
float r; // 半径
if((X1 != X2 || Y1 != Y2) &&
(X1 != X3 || Y1 != Y3) &&
(X2 != X3 || Y2 != Y3)) // 输入点不重合
{
x0 = (A*(Y1-Y2)-B*(Y1-Y3)) /
(2*A_B); // 计算圆心的X坐标
y0 = (A*(X2-X1)-B*(X3-X1)) /
(2*A_B); // 计算圆心的Y坐标
r = sqrt((X1-x0)*(X1-x0)+(Y1-y0)*(Y1-y0));
float k1 = (X2-X1)==0?0.1:(X2-X1);
float k2 = (X3-X2)==0?0.1:(X3-X2);
if((((Y3-Y2)/k2)-((Y2-Y1)/k1))*(X3-X2)*(X2-X1) <0)
{ // 判断起始点和终止点
Image1->Canvas->Arc(x0-r, y0-r, x0+r, y0+r,
X1, Y1, X3, Y3);
}else
{
Image1->Canvas->Arc(x0-r, y0-r, x0+r, y0+r,
X3, Y3, X1, Y1);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawCross(TCanvas *p, long X, long Y)
{// 绘制箭头
p->MoveTo(X-10, Y);
p->LineTo(X+10, Y);
p->MoveTo(X, Y-10);
p->LineTo(X, Y+10);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -