解决拖放是否可以采用类似:
http://expert.csdn.net/Expert/topic/1207/1207219.xml?temp=8.153933E-02
的处理如果是g.DrawEllipse(pen, x0, y0, cx, cy);如此绘制而没有保存为bitmap的对象是否还需要什么中间处理?希望大家帮帮忙,多关注或踢下,谢谢。
http://expert.csdn.net/Expert/topic/1207/1207219.xml?temp=8.153933E-02
的处理如果是g.DrawEllipse(pen, x0, y0, cx, cy);如此绘制而没有保存为bitmap的对象是否还需要什么中间处理?希望大家帮帮忙,多关注或踢下,谢谢。
解决方案 »
- 问一下大家,有谁真正用过Pnrp么?
- 如何实现按字母查汉字
- 初学者的问题,急,想来想去想不通
- C#写配置文件(XML),如法正常输出
- 我想上传200M,500M的大文件,httpRuntime maxRequestLength 怎么设置?
- 异步执行一个方法导致数据错乱,望解析
- serialPort DataReceived事件监听返回值。返回的是乱码
- oracle的存储过程总是(带输出参数)在线等待(附错误代码)
- VS开发环境做了东东,不想用BIN目录,把一对aspx和cs文件挑出来用为什么出错?
- 为什么我不能用C#建立空的Web 项目?
- 为什么WebService 返回的自定义的类方法在客户端不能调用?
- 如何打开浏览器cookie功能?????
我现在也在作一个一样的东西,不过好像最近作这个东西的人比较多,但是还是好像没有看见有什么人提供太好的解决方案。这个问题也是我最近重点解决的问题之一。不过目前我已经想了一个解决方案。目前我正在整理接口。
一个控件无非就是包含了模型数据和图形数据两个部分的组件。如果我们用继承于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事件来模拟实现。只要定义几个对应的函数就可以了。
给你贴一些代码, 不过是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();
}
谢谢您的信息共享,正在消化ing... 因为我是GDI+的生手,以前也很少涉及界面方面的设计开发,有些不是很理解的方面可能需要你多给我指点,先谢了。
希望能多交流,同时我已将我的MSN和QQ号发给您了,希望我们能共同帮助,交流。TO cheng_young(古道西风瘦马) :
谢谢了,您的设想是否是通过每绘制一个图形,都已一定的图形格式保存在IMAGELIST中,然后再进行相关操作吗? 晕,怎么老不能成功回帖啊?是不是斑竹们在整理帖子啊?
IMAGELIST只用于拖放时的操作
to wuyueyoumu(五月游牧):
这是我正在开发的一个项目, 给你所有的原代码有些不妥, 我可以给你一部分原代码及EXE文件
也能给我一份参考不?
[email protected]
已经收到您的邮件,谢谢。
[email protected]
我最近也在做这方面的东西,能不能发一份给我参考一下?谢谢了先
[email protected]
我最近也在做这方面的东西,能不能发一份给我参考一下?谢谢了
[email protected]
我最近做过这方面的东西,大概是一个模仿IDE的东西(可视设计)吧。主要有两方面的问题,一个是当图形控件太多时速度有点慢,另一个问题是自己画的线会被别的控件覆盖,显得有些不好。不知我能不能看看你的东西?最好有EXE文件和一些你认为可以给我的代码,我们可以讨论讨论。
[email protected]
你的东西我已经收到,谢谢,不过我仍然发现速度很慢,可怜的GDI+。
不过你的图元继承的基类是比较轻量级的,而我的还有一个问题就是我的图元是比较重量级的,比如是Control或者是UserControl级别的,当在他们所在的容器中创建画布时,在这个画布中描线的线条会被别的图元覆盖而不可见,比较郁闷。