熟悉GDI+的朋友请进:如何来标识绘制后图形的选中、拖放和属性编辑等,谢谢。

glboy 2003-05-08 07:05:42
要实现的是类似VISIO的流程图绘制和相关属性定义等,让用户可以象VISIO那样进行类似的定义和操作
我是这几天才初次接触GDI+的,查阅了相关资料,对于绘图的相关基础知识已熟悉,目前已可以实现一般图形的绘制,文本输入等。
但目前有如下问题卡壳,希望能得到各位朋友的指点:
1.用什么如何来标识绘制后图形的选中?如果有一系列的图形,那么一般是采用什么来进行管理?
2.图形的拖放,是否也就是图形的重绘,只要有相关的数据(如坐标等)支撑就成了,其实这个问题主要看在问题1中如何解决的?
3.使用过VISIO的朋友一定都知道其有一个属性编辑窗口(姑且这么称呼,:)),以提供给每个流程节点的注释说明等,对此我有个不太成熟的想法,就是采用类来封装和保存每个结点的信息(比方有工序中有一个结点需要我们给其定义如下信息:名称,大小,规格,备注等),有了这么些类来记录每个流程的结点信息,那么我们接下去就来实现和制定我们流程中的逻辑控制等了
(这个可以采用右键---属性----一窗口来实现)
4.大家一般是采用什么方法来为流程中的连接线做文字注释的?
5.大家一般以什么作为绘图的容器?

不正确或不明白之处欢迎指正。
有好几个月都没提问技术帖子了,希望大家能多给我建议和帮助,谢谢!
...全文
211 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
glboy 2003-05-15
  • 打赏
  • 举报
回复
最近要忙着项目实施,而且还要做好几份方案,这个问题暂时没有太多时间来关注了,希望大家多多讨论。
dewy61786 2003-05-15
  • 打赏
  • 举报
回复
下栽一个Tablet PC SDK或者安装WindowXP Tablet Edit
coda 2003-05-15
  • 打赏
  • 举报
回复
TO cheng_young(古道西风瘦马):
你的东西我已经收到,谢谢,不过我仍然发现速度很慢,可怜的GDI+。
不过你的图元继承的基类是比较轻量级的,而我的还有一个问题就是我的图元是比较重量级的,比如是Control或者是UserControl级别的,当在他们所在的容器中创建画布时,在这个画布中描线的线条会被别的图元覆盖而不可见,比较郁闷。
coda 2003-05-13
  • 打赏
  • 举报
回复
TO cheng_young(古道西风瘦马):
我最近做过这方面的东西,大概是一个模仿IDE的东西(可视设计)吧。主要有两方面的问题,一个是当图形控件太多时速度有点慢,另一个问题是自己画的线会被别的控件覆盖,显得有些不好。不知我能不能看看你的东西?最好有EXE文件和一些你认为可以给我的代码,我们可以讨论讨论。
coda@btamail.net.cn
huweihua 2003-05-13
  • 打赏
  • 举报
回复
TO cheng_young(古道西风瘦马):
我最近也在做这方面的东西,能不能发一份给我参考一下?谢谢了
huweihua78@sina.com
nean 2003-05-13
  • 打赏
  • 举报
回复
TO cheng_young(古道西风瘦马):
我最近也在做这方面的东西,能不能发一份给我参考一下?谢谢了先
nean@vip.sina.com
wuyueyoumu 2003-05-12
  • 打赏
  • 举报
回复
非常感谢,cheng_young(古道西风瘦马),已经收到你的代码了!
glboy 2003-05-09
  • 打赏
  • 举报
回复
TO cheng_young(古道西风瘦马):
也能给我一份参考不?
firefox_gliet@hotmail.com
cheng_young 2003-05-09
  • 打赏
  • 举报
回复
图形的保存是通过在链表中保存对象的指针,相关操作也是在链表中进行
IMAGELIST只用于拖放时的操作
to wuyueyoumu(五月游牧):
这是我正在开发的一个项目, 给你所有的原代码有些不妥, 我可以给你一部分原代码及EXE文件
wuyueyoumu 2003-05-09
  • 打赏
  • 举报
回复
cheng_young(古道西风瘦马) 的这一段代码很有参考价值的,实际上没有必要通过“您的设想是否是通过每绘制一个图形,都已一定的图形格式保存在IMAGELIST中,然后再进行相关操作”的方式来实现,因为我们可以通过在Graphics中根据一个区域来创建image的方式来取的图形,然后就可以进行相关的操作了。cheng_young(古道西风瘦马)能提供相应的原代码不?我的邮箱zhuyuanbing@cdtele.com。

我的MSN:zybcn@163.com
glboy 2003-05-09
  • 打赏
  • 举报
回复
TO wuyueyoumu(五月游牧) :
谢谢您的信息共享,正在消化ing...

因为我是GDI+的生手,以前也很少涉及界面方面的设计开发,有些不是很理解的方面可能需要你多给我指点,先谢了。
希望能多交流,同时我已将我的MSN和QQ号发给您了,希望我们能共同帮助,交流。

TO cheng_young(古道西风瘦马) :
谢谢了,您的设想是否是通过每绘制一个图形,都已一定的图形格式保存在IMAGELIST中,然后再进行相关操作吗?

晕,怎么老不能成功回帖啊?是不是斑竹们在整理帖子啊?
cheng_young 2003-05-09
  • 打赏
  • 举报
回复
图形的选中、拖放可通过ImageList达到与资源管理器类似的效果
给你贴一些代码, 不过是VC中使用GDI+的

//产生拖放时的图像
void CDraw::UpdateDragImage()
{
m_imlDrag.DeleteImageList();
CRect r = m_rect;
r.NormalizeRect();
int nScale = GetScale();
r = r.MulDiv(nScale, 100);
r.right += 1;
r.bottom += 1;

Point pts[4];
CDraw::RotateRect(r, GetOrient(), pts);
int x1, y1, x2, y2;
x1 = x2 = pts[0].X;
y1 = y2 = pts[0].Y;
for (int i=0; i<4; i++)
{
x1 = min(x1, pts[i].X);
x2 = max(x2, pts[i].X);
y1 = min(y1, pts[i].Y);
y2 = max(y2, pts[i].Y);
}

int w = max(2, abs(x2-x1));
int h = max(2, abs(y2-y1));
m_imlDrag.Create(w, h, ILC_COLOR16|ILC_MASK, 0, 1);

Bitmap bmp(w, h);
Graphics g(&bmp);
g.ScaleTransform(nScale/100.0f, nScale/100.0f);
g.TranslateTransform(-m_rect.left, -m_rect.top);
//CDraw::RotateRect(m_rect, GetOrient(), pts);
//g.TranslateTransform(-pts[0].X, -pts[0].Y);

COLORREF clrBk = (COLORREF)::SendMessage(m_hwndParent, WM_GET_BKCOLOR, 0, 0);
Color clr;
clr.SetFromCOLORREF(clrBk);
g.Clear(clr);

Draw(g);

HBITMAP hBitmap;
bmp.GetHBITMAP(clr, &hBitmap);
ASSERT(hBitmap);
m_imlDrag.Add(CBitmap::FromHandle(hBitmap), clrBk);
}

//绘制焦点, 可再加上8个小距形
if (!m_imlDrag.IsNull())
{
POINT pt = {m_lLeft, m_lTop};
m_imlDrag.Draw(hdc, 0, pt,ILD_SELECTED);
}

//拖放
OnLButtonDown:
m_imlDrag.BeginDrag(0, CPoint(x-rc.left, y-rc.top));
m_imlDrag.DragEnter(pwnd, CPoint(x-dxOffset, y-dyOffset));

OnMouseMove:
m_imlDrag.DragMove(CPoint(x-dxOffset, y-dyOffset));

OnLButtonUp:
if (m_bDraging)
{
int dx = point.x - m_ptOldMouse.x;
int dy = point.y - m_ptOldMouse.y;

if (dx || dy)
{
InvalidateDraw();
m_rect.OffsetRect(dx, dy);
InvalidateDraw();
}
CWnd *pwnd = CWnd::FromHandle(m_hwndParent);
m_imlDrag.DragLeave(pwnd);
m_imlDrag.EndDrag();
}


tuzi98 2003-05-09
  • 打赏
  • 举报
回复
gz
wuyueyoumu 2003-05-09
  • 打赏
  • 举报
回复
这样的问题一些专题问题我已经问了很多个了,不过得到的答案都不是很满意。
我现在也在作一个一样的东西,不过好像最近作这个东西的人比较多,但是还是好像没有看见有什么人提供太好的解决方案。这个问题也是我最近重点解决的问题之一。不过目前我已经想了一个解决方案。目前我正在整理接口。
一个控件无非就是包含了模型数据和图形数据两个部分的组件。如果我们用继承于Contorl的控件来实现,当然是可以做到移动、选择的,但是个人认为管理起来不方便。原因如下:
一、图形之间的相互操作困难。因为控件之间的图形都是由自己来控制的。当几个图形之间互相协作计算的时候就比较的复杂。
二、事件管理困难。同样控件的事件也是自己来管理的,这样有时候一些事件当控件获得之后它的container就没有办法获得。这样互相通信比较麻烦。当然也可以通过所有控件或者需要事件管理的控件实现一个委托接口来实现。
三、线型控件非常难以实现。特别是曲线的情况下。应为控件的Region不支持线的情况。

所以我采用了非Control控件的方式来作。

一、panel仍然采用继承于Contorl的控件。
二、点和线都不用Contorl控件来实现。采用非可视组件和它的图形信息相加的方式来实现。它的图形信息(主要包括Rect和path两种信息)保存在自己中,实现由panel来画。
三、多个服务相结合。Vs的ide它的Designer采用了不少的服务,包括Selection等等都可以作为我们组织系统的参考方式。
四、多个集合来管理组件。其中包括线集合,点集合,选择集合,注释集合等等的情况都可以。
五、辅助模拟实现Form和控件的关系。当鼠标在panel上移动或者点击的时候我们可以判断鼠标点的位置是否存在一个组件。这个很好办,只要轮循集合中的那个组件的path或者rectangle包含了这个点(isvisible(Point p,Graphics g))就可以返回这个控件同时可以对它进行通知相应的操作。比如选中、双击、单击、移动等等都可以。

六、控件的拖动操作都由panel来实现。用五的方法选择一个组件之后就可以进行移动的操作了。拖动的操作个人建议不要在drag事件里面来实现,而是通过Mouse事件来模拟实现。只要定义几个对应的函数就可以了。
glboy 2003-05-09
  • 打赏
  • 举报
回复
不是吧,就没人关注我的问题?我倒,:(
ggg_nj 2003-05-09
  • 打赏
  • 举报
回复
是ggg_nj@yahoo.com.cn
ggg_nj 2003-05-09
  • 打赏
  • 举报
回复
给我一份吧,我也在为这个东西伤神呢!非常感谢
ggg_nj@yahoo.com
glboy 2003-05-09
  • 打赏
  • 举报
回复
TO cheng_young(古道西风瘦马):
已经收到您的邮件,谢谢。
glboy 2003-05-08
  • 打赏
  • 举报
回复
晕,没人帮我???
glboy 2003-05-08
  • 打赏
  • 举报
回复
解决拖放是否可以采用类似:
http://expert.csdn.net/Expert/topic/1207/1207219.xml?temp=8.153933E-02
的处理

如果是g.DrawEllipse(pen, x0, y0, cx, cy);如此绘制而没有保存为bitmap的对象是否还需要什么中间处理?

希望大家帮帮忙,多关注或踢下,谢谢。

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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