如何在GroupBox中实现不同控件之间的连线? (C++ Builder),运行时画的线能随控件的移动而移动,并且线还能被删除!

upcqiyou 2011-09-28 07:57:39
如何在GroupBox中实现不同控件之间的连线? (C++ Builder),运行时画的线能随控件的移动而移动,并且线还能被删除!
...全文
218 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2011-10-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zzbinfo 的回复:]

我仔细考虑了一下,用shap实现不了.不好意思误导你了.
[/Quote]

楼主的需求,需要斜线的功能。Shape肯定是不行的。
zzbinfo 2011-10-03
  • 打赏
  • 举报
回复
我仔细考虑了一下,用shap实现不了.不好意思误导你了.
upcqiyou 2011-10-03
  • 打赏
  • 举报
回复
有人提醒我:
全部用类来实现,各处理各的事;对象有多个连接点,连接线也有多个连接点;连接点是对象,连接线也是对象 ;各个图形对象(控件、连接线)都是不同的类,连接关系(连接点)为这些相关对象的内部属性, 根据用例来完成相应的设计处理,各完成各的事的方法来做,但说的太笼统了,具体怎么来实现还是一大难题?
upcqiyou 2011-10-03
  • 打赏
  • 举报
回复
谢谢!
两个控件的连接与随便拖动一个控件,连线跟着变的功能我已经实现了(虽然做的很粗糙,但功能可以达到),包括斜线的功能。
现在主要问题是如果面板上有七八个控件,怎么随机连接其中两个控件,然后把七八个控件连接成流程图后,拖动其中一个控件,跟它连接(如果有2条或3条)的线也随之移动。我邮箱qiy898@163.com,欢迎交流。
upcqiyou 2011-10-01
  • 打赏
  • 举报
回复
控件的移动我已经做出来了,代码见下。我主要问的是:运行时实现不同控件之间的连线,且画的线能随控件的移动而移动,并且线还能被删除!

控件的移动我已经做出来了,代码见下:


unit.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
bool bMouseDown = false;
int iX,iY;
Boolean Start;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{


Graphics::TBitmap *BmpTree = new Graphics::TBitmap(); //创建装载元素的位图



//装载元素图片,这里是一颗树的图片,除了叶子和树干外,其它地方都背填充为黑色了。
BmpTree->LoadFromFile("c:\\1.bmp");


// 或则指定图片的某个位置的颜色为透明色
// BmpTree->TransparentColor =BmpTree->Canvas->Pixels[50][50];



Image1->Canvas->Draw(10,10,BmpTree ); //把树的位图画到背景上面,树是透明的

delete BmpTree; //释放对象



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






void __fastcall TForm1::closeClick(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------






void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
iX = X;
iY = Y;
bMouseDown = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
bMouseDown = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(bMouseDown)
{
DoubleBuffered = True; //使用双缓冲

Image1->Left = Image1->Left + X - iX;
Image1->Top = Image1->Top + Y - iY;
}
}
//---------------------------------------------------------------------------











void __fastcall TForm1::BitBtn2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Graphics::TBitmap *Bmpm = new Graphics::TBitmap(); //创建装载元素的位图



//装载元素图片,这里是一颗树的图片,除了叶子和树干外,其它地方都背填充为黑色了。
Bmpm->LoadFromFile("c:\\2.bmp");


// 或则指定图片的某个位置的颜色为透明色
// Bmpm->TransparentColor =Bmpm->Canvas->Pixels[50][50];



Image1->Canvas->Draw(100,100,Bmpm ); //把树的位图画到背景上面,树是透明的

delete Bmpm; //释放对象

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


void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Graphics::TBitmap *BmpTree = new Graphics::TBitmap(); //创建装载元素的位图



//装载元素图片,这里是一颗树的图片,除了叶子和树干外,其它地方都背填充为黑色了。
BmpTree->LoadFromFile("c:\\2.bmp");


// 或则指定图片的某个位置的颜色为透明色
// BmpTree->TransparentColor =BmpTree->Canvas->Pixels[50][50];



Image2->Canvas->Draw(10,10,BmpTree ); //把树的位图画到背景上面,树是透明的

delete BmpTree; //释放对象


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

void __fastcall TForm1::Image2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
iX = X;
iY = Y;
bMouseDown = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image2MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
bMouseDown = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image2MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(bMouseDown)
{
DoubleBuffered = True; //使用双缓冲

Image2->Left = Image2->Left + X - iX;
Image2->Top = Image2->Top + Y - iY;
}
}
//---------------------------------------------------------------------------







void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Start=true;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
Start = True;
Form1->Canvas->MoveTo(X, Y);




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


void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
Form1->Canvas->LineTo(X, Y);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Image1Click(TObject *Sender)
{
HDC hDC=GetWindowDC(this-> Handle);
TCanvas *mCanvas=new TCanvas;
mCanvas-> Handle=hDC;
int left,top,width,heigth,yCaption;
left=Image1-> Left;
top=Image1-> Top;
width=Image1-> Width;
heigth=Image1-> Height;
mCanvas-> Brush-> Color=clBlack;

yCaption=::GetSystemMetrics(SM_CYCAPTION);

//注意这里的画矩形的,我没有计算窗体的边框的宽度,所以left实际上不是Button的了left
mCanvas-> Rectangle(left,top+yCaption,left+10,top+10+yCaption);
ReleaseDC(this-> Handle,hDC);

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

void __fastcall TForm1::FormCreate(TObject *Sender)
{

}
//---------------------------------------------------------------------------
upcqiyou 2011-10-01
  • 打赏
  • 举报
回复
麻烦你花两分钟,能否说的具体一点
upcqiyou 2011-10-01
  • 打赏
  • 举报
回复
谢谢(zzbinfo) 的建议。

请问如何实现运行时,用鼠标来实现不同控件之间的连线,且控件连线完成后,连线能随控件的移动而移动,并且连线还能被删除!


zzbinfo 2011-09-30
  • 打赏
  • 举报
回复
你用个shape模拟实现吧,实现删除和移动可能简单些

13,825

社区成员

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

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