关于TImage控件的画图问题

jone7319 2017-06-21 05:32:22
在Form1上放个Image1.想法是通过按下鼠标右键确定线条的起点A,继续按着右键不放拖动鼠标确定线条的终点B,放开鼠标右键画一条从A到B的线段。
以下是我的代码:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool rmd=false;
TPoint a,b;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if( rmd )
{
Image1->Canvas->MoveTo(a.x,a.y);
Image1->Canvas->LineTo(b.x,b.y);
b.x=X;
b.y=Y;
Image1->Canvas->MoveTo(a.x,a.y);
Image1->Canvas->LineTo(b.x,b.y);
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==1)
{
rmd=true;
a.x=X;
a.y=Y;
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
rmd=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Canvas->Pen->Color=clRed;
Image1->Canvas->Pen->Width=3;
Image1->Canvas->Pen->Style<<psDot;
Image1->Canvas->Pen->Mode=pmXor;
}
//---------------------------------------------------------------------------

以上代码的运行结果,是每次按下鼠标会从之前的位置多画一条到当前位置的线条,结果变成画折线了,而不是多条线段,达不到要求的效果。

通过修改代码,在void __fastcall TForm1::Image1MouseDown事件中加入
Image1->Canvas->MoveTo(a.x,a.y);
Image1->Canvas->LineTo(b.x,b.y);
效果有所改观,但不理想。


修改后的完整代码如下:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool rmd=false;
TPoint a,b;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if( rmd )
{
Image1->Canvas->MoveTo(a.x,a.y);
Image1->Canvas->LineTo(b.x,b.y);
b.x=X;
b.y=Y;
Image1->Canvas->MoveTo(a.x,a.y);
Image1->Canvas->LineTo(b.x,b.y);
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button==1)
{
rmd=true;
a.x=X;
a.y=Y;
Image1->Canvas->MoveTo(a.x,a.y);
Image1->Canvas->LineTo(b.x,b.y);
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
rmd=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Canvas->Pen->Color=clRed;
Image1->Canvas->Pen->Width=3;
Image1->Canvas->Pen->Style<<psDot;
Image1->Canvas->Pen->Mode=pmXor;
}
//---------------------------------------------------------------------------


结果是得到了不同的线段,但是之前的线条还是会闪现,不是想要的结果,希望各位给个算法代码。我是弄不明白,我已用MoveTo移动了位置,为什么还会从前一个位置开始画线?
...全文
736 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jone7319 2017-06-22
  • 打赏
  • 举报
回复
还是弄不明白,感觉这个MouseMove事件有bug,加了个Sleep(100)延时效果好了些。 //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button==1) { Sleep(100); rmd=true; a.x=X; a.y=Y; Image1->Canvas->MoveTo(a.x,a.y); Image1->Canvas->LineTo(b.x,b.y); } }
jone7319 2017-06-22
  • 打赏
  • 举报
回复
引用 1 楼 u010165006 的回复:
鼠标拖动过程你需要显示不断随鼠标移动的线吗?
是的,但是我目前得到的效果不理想、
ooolinux 2017-06-22
  • 打赏
  • 举报
回复
你是用什么版本的C++ Builder?如果用C++ Builder 6.0,参考: F:\Program Files (x86)\Borland\CBuilder6\Examples\Apps\Doodle 这个自带的画图程序,你的C++ Builder 6.0可能安装在C盘,而不是像我在F盘。 __fastcall TDoodleForm::TDoodleForm(TComponent* Owner) : TForm(Owner) { DoubleBuffered=true; //原代码加一句这个可以避免闪烁 }
ooolinux 2017-06-21
  • 打赏
  • 举报
回复
鼠标拖动过程你需要显示不断随鼠标移动的线吗?

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧