请问各位高手:怎样在FORM上当点击某按钮后,就可控制鼠标在FORM上画任意大小的矩形?新年的第一个问题。还请各位多多指教!

danna 2003-02-24 07:14:25
谢了!
...全文
148 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
danna 2003-02-28
  • 打赏
  • 举报
回复
谢了。好痛苦。今年要在网吧上网了。

要等下借同学的机子才能试了。
danna 2003-02-28
  • 打赏
  • 举报
回复
Lewolf(李狼) 我想另外开贴给分。
danna 2003-02-28
  • 打赏
  • 举报
回复
再一次谢谢大家。结帐了。
Lewolf 2003-02-27
  • 打赏
  • 举报
回复
将你的邮箱告诉我,我给你一个矢量绘图的简单例子,包括图形的绘制,移动,改变大小,改变颜色,改变填充方式,线型,线宽,保存,剪贴板使用等基本功能。绝对是原创作品。
lewolf@163.net
jishiping 2003-02-27
  • 打赏
  • 举报
回复
下面是一个例子,包括修改矩形大小(当用户选择ResizeBox时为修改大小):

TPoint sp, ep;
bool IsDraw;
int nResize=-1;
DynamicArray<TRect> Array;

TRect NormalRect(TRect Rect)
{
TRect R;

R.left = min(Rect.left, Rect.right);
R.right = max(Rect.left, Rect.right);
R.top = min(Rect.top, Rect.bottom);
R.bottom = max(Rect.top, Rect.bottom);
return R;
}
//---------------------------------------------------------------------------
__fastcall TfmMain::TfmMain(TComponent* Owner)
: TForm(Owner)
{
Canvas->Pen->Color = clBlue; //矩形的颜色为蓝色
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button != mbLeft)
return;

if (ResizeBox->Checked) {
for(int n=0; n<Array.Length; n++)
{
TRect Rect = Array[n];
if (PtInRect(&NormalRect(
Rect),TPoint(X,Y))) {
nResize = n;
Repaint(); Update();
sp = *(TPoint*)▭
ep = *((TPoint*)&Rect+1);
Mouse->CursorPos =
ClientToScreen(ep);
IsDraw = true; break;
}
}
}
else {
IsDraw = true;
nResize = -1;
sp = ep = TPoint(X,Y);
}
Canvas->Pen->Mode = pmNotXor;
Canvas->Brush->Style = bsClear;
}
//------------------------------------------------------------------
void __fastcall TfmMain::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (IsDraw)
{
Canvas->Rectangle(TRect(sp,ep));
ep = TPoint(X, Y);
Canvas->Rectangle(TRect(sp,ep));
}
}
//------------------------------------------------------------------
void __fastcall TfmMain::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (IsDraw)
{
IsDraw = false;
Canvas->Pen->Mode = pmCopy;
Canvas->Rectangle(TRect(sp,ep));
if (nResize != -1) {
Array[nResize] = TRect(sp, ep);
nResize = -1;
}
else {
Array.Length = Array.Length + 1;
Array[Array.Length-1] = TRect(sp, ep);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TfmMain::FormPaint(TObject *Sender)
{
Canvas->Pen->Mode = pmCopy;
Canvas->Brush->Style = bsClear;
for(int n=0; n<Array.Length; n++)
{
if (nResize == n) {
Canvas->Pen->Mode = pmNotXor;
Canvas->Rectangle(Array[n]);
Canvas->Pen->Mode = pmCopy;
}
else
Canvas->Rectangle(Array[n]);
}
}
danna 2003-02-25
  • 打赏
  • 举报
回复
现在不知道怎么去对那些矩形进行修改大小与颜色了?
danna 2003-02-24
  • 打赏
  • 举报
回复
唆呀!真于知道前面为什么交差就会消失了。

myy 说的对,是pen->mode的问题把它改为pmMask就没事了!
danna 2003-02-24
  • 打赏
  • 举报
回复
是的,就是不好选中。
whitelion 2003-02-24
  • 打赏
  • 举报
回复
选中再修改颜色的过程比较复杂
以前有一个贴子讨论过这个问题的,你查一下
danna 2003-02-24
  • 打赏
  • 举报
回复
还有一个问题就是我我将怎样对画的矩形能够自由改变颜色呢?

改变颜色的一个麻烦问题就是要对这些矩形改变颜色不好对它去选中操作?

哪位知道的请多多指点!
whitelion 2003-02-24
  • 打赏
  • 举报
回复
pmBlack Always black
pmWhite Always white
pmNop Unchanged
pmNot Inverse of canvas background color
pmCopy Pen color specified in Color property
pmNotCopy Inverse of pen color
pmMergePenNot Combination of pen color and inverse of canvas background
pmMaskPenNot Combination of colors common to both pen and inverse of canvas background.
pmMergeNotPen Combination of canvas background color and inverse of pen color
pmMaskNotPen Combination of colors common to both canvas background and inverse of pen

pmMerge Combination of pen color and canvas background color
pmNotMerge Inverse of pmMerge: combination of pen color and canvas background color
pmMask Combination of colors common to both pen and canvas background
pmNotMask Inverse of pmMask: combination of colors common to both pen and canvas background
pmXor Combination of colors in either pen or canvas background, but not both
pmNotXor Inverse of pmXor: combination of colors in either pen or canvas background, but not both
danna 2003-02-24
  • 打赏
  • 举报
回复
我在HELP里找不到这方面的资料。
myy 2003-02-24
  • 打赏
  • 举报
回复
跟 Canvas->Pen->Mode 有关,好好看看 Help.
danna 2003-02-24
  • 打赏
  • 举报
回复
为什么我在画矩形时,当两个矩形有交界的时候,中间的交界部分被消掉了?
whitelion 2003-02-24
  • 打赏
  • 举报
回复
tpoint变量也可以这样赋值
ep.x=X
ep.y=Y
myy 2003-02-24
  • 打赏
  • 举报
回复
因为 ep 是 TPoint 类型的,Point(X,Y) 的返回类型也是 TPoint,
你也可以:
ep.x=X;
ep.y=Y;
whitelion 2003-02-24
  • 打赏
  • 举报
回复
canvas->color=clBlue; //蓝色
danna 2003-02-24
  • 打赏
  • 举报
回复
请问myy:
if(IsDraw==true)
{
MakeRect(sp,ep);
ep=Point(X,Y);这ep为什么要这样赋值呀?
MakeRect(sp,ep);
}
danna 2003-02-24
  • 打赏
  • 举报
回复
用myy的方法我已经画出矩形了。
但是我想把FORM上画的任意矩形能够改变颜色,那又该怎样做呢?
danna 2003-02-24
  • 打赏
  • 举报
回复
高手!
非常谢谢!
加载更多回复(2)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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