C# 曲线进行局部放大的问题

aaa2742 2015-09-16 11:29:57
使用GDI+绘制了曲线,想通过鼠标在图上画个虚线框然后以该部分为中心进行放大,平时很常见的功能。
先别说放大,就说实现矩形框的绘制实现。这个在C++里实现过,通过在MouseMove里获取ClientDC,好像ClientDC是个临时绘图设备句柄,然后画矩形框,擦出上一次绘制的矩形框(InvalidateRect),UpdateWindow等实现了该功能。

现在在C# 中也想实现该功能,但是有问题:
1、如果按照上面的思路整,回发现在绘制矩形框的时候里面的曲线也会跟着重绘,另外在绘制矩形框的过程中,由小到大时能清理上次矩形的痕迹,但由大到小时便由很多上次的痕迹。这相当于采用的局部擦除、重绘的方法,但下面的曲线也会跟着重绘。
2、如果采用的是该控件的refresh,则绘制矩形过程中由大到小时的痕迹没有了,但肯定的下面的曲线会重绘,如下图所示。

如果实现图片中的功能,让下面的曲线在矩形框绘制时不进行重绘就可以了,怎样实现该效果?
...全文
497 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaa2742 2015-09-17
  • 打赏
  • 举报
回复
问题已解决。
tcmakebest 2015-09-16
  • 打赏
  • 举报
回复
GDI绘图最好不要直接画到控件上,而是画到一张图片上,用代码控制什么时候重新画,界面上是显示这张图片.
  • 打赏
  • 举报
回复
首先我并不确定你说的“c++里实现过”是否能够跟一个复杂的真正的应用绘图系统在一起使用(如果可用,为什么还要折腾什么c#呢?),至少在 .net 中,一般来说,不需要搞这个低级的编程。用鼠标拖拉一个矩形框,那么写2、3行代码去拖拉一个 wpf Rectangle控件或者 Border 控件就行了。顶多写3行代码而已,而且在鼠标拖拉过程中,还无什么“擦除、重绘”方面的毛病。 低级的东西看上去是“万能的”,其实对于99%的开发人员来说,其开发效率低得根本就只能在家里“玩儿”而已而几乎无法解决问题。
  • 打赏
  • 举报
回复
而几乎无法解决问题 --> 而几乎无法解决当你的成百上千个不同的控件的层叠加在一起的问题
Poopaye 2015-09-16
  • 打赏
  • 举报
回复
你别在一个控件上画啊,再叠加一层控件上画不就好了
bdmh 2015-09-16
  • 打赏
  • 举报
回复
曲线有间距和线宽,还有起始索引,拟定一个scale变量,开始是1,放大就是增大scale,缩小就减小scale,画的时候,线宽和间距都和scale做个乘法
aaa2742 2015-09-16
  • 打赏
  • 举报
回复
引用 5 楼 tcmakebest 的回复:
GDI绘图最好不要直接画到控件上,而是画到一张图片上,用代码控制什么时候重新画,界面上是显示这张图片.
你说的时双缓冲,在绘制曲线时已经用上了。
引用 11 楼 diaodiaop 的回复:
够灵活 不知道LZ需要的是有多"灵活"的控件? 毫秒级实时上百万个点 可拖动计算放大缩小 行不行呢?
不要乱扯,如有高招请指教。
Poopaye 2015-09-16
  • 打赏
  • 举报
回复
引用 10 楼 aaa2742 的回复:
[quote=引用 2 楼 shingoscar 的回复:] 你别在一个控件上画啊,再叠加一层控件上画不就好了
虽然也不失为一个办法,但用的着这么复杂么,只是实现一个较为使用常见的功能。C++上的这一套我已经实现了,想在C#平台上实现。难不成我在GDI+里在导入GDI的库吧,这也太扯了。[/quote] c#的System.Drawing用的就是gdi+ 你说你在c++已经实现了,那在c#里也是一样的
by_封爱 版主 2015-09-16
  • 打赏
  • 举报
回复
够灵活 不知道LZ需要的是有多"灵活"的控件? 毫秒级实时上百万个点 可拖动计算放大缩小 行不行呢?
aaa2742 2015-09-16
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
你别在一个控件上画啊,再叠加一层控件上画不就好了
虽然也不失为一个办法,但用的着这么复杂么,只是实现一个较为使用常见的功能。C++上的这一套我已经实现了,想在C#平台上实现。难不成我在GDI+里在导入GDI的库吧,这也太扯了。
aaa2742 2015-09-16
  • 打赏
  • 举报
回复
引用 6 楼 diaodiaop 的回复:
看到这样的帖子 我也就呵呵了 难道你们都不懂 "前人栽树后人乘凉"这个道理吗? 你们这样做是图什么呢? 为了解锁新姿势吗? 人家做过的不管是企业级还是工业级 完全可以满足你们任何愿望.. 但是你们非得用你们所谓的"GDI+"自己写,你觉得你这2年的GDI+的经验是不是要高于人家做10几年的控件还厉害? 或者为了给别人演示"你看这是我手写的,可不是用的什么控件噢!"之后得到短暂的高潮?
图想修改的时候能够灵活些,如果只是想显示之类的随便找一个控件就行了,但控件不是万能的。 控件有许多时商业的,是有版权的。
aaa2742 2015-09-16
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
曲线有间距和线宽,还有起始索引,拟定一个scale变量,开始是1,放大就是增大scale,缩小就减小scale,画的时候,线宽和间距都和scale做个乘法
缩放这个知道,主要问题在画矩形框上,也是为了人机界面交互友好。
by_封爱 版主 2015-09-16
  • 打赏
  • 举报
回复
c#实现这个功能很简单... 设置一个属性XXXXXX.OOOOOOO=true;就行了
by_封爱 版主 2015-09-16
  • 打赏
  • 举报
回复
看到这样的帖子 我也就呵呵了 难道你们都不懂 "前人栽树后人乘凉"这个道理吗? 你们这样做是图什么呢? 为了解锁新姿势吗? 人家做过的不管是企业级还是工业级 完全可以满足你们任何愿望.. 但是你们非得用你们所谓的"GDI+"自己写,你觉得你这2年的GDI+的经验是不是要高于人家做10几年的控件还厉害? 或者为了给别人演示"你看这是我手写的,可不是用的什么控件噢!"之后得到短暂的高潮?
基于C#的波形显示控件的实现源码 计算机技术的飞速发展使得其在自动化系统中的应用日益增强。大量监控、图像数据显示软件活跃在自动化工业及自动化教学领域。同时,软件系统的日益复杂化使得模块化开发变得尤为重要。本课题所设计的基于C#的波形显示控件就可在微软.NET平台下进行代码功能重用,达到模块化开发和快速开发的目的,使得程序员能够集中精力设计软件的具体业务流程,而不必担心波形呈现的问题。 本文先介绍了.NET平台下用户控件开发的基本方法,以及用C#描述的GDI+图形开发技术,然后提出一种基于C#的波形显示控件的设计思路,并对波形坐标值转换、坐标标尺、工具栏、局部放大等具体的设计细节进行详细解析。 本课题设计的波形显示控件实现了同时显示多条数据曲线局部放大查看、波形显示自动调整最佳坐标范围、动态显示波形等功能。创新之处在于设计了一种方法,使得波形显示控件的坐标轴的起点值和终点值能够以浮点数显示,并自动根据当前波形显示控件的大小,描绘出符合用户视觉的坐标标尺。 波形显示控件实现的功能 (1) 多条波形数据的显示。 该波形显示控件能够同时显示多条波形数据,用户能够控制每条波形数据的显示颜色、线宽、线帽、以及线转折的样式。并且提供了三种波形数据显示的方式:连续数据线、离散点、条形图。 (2) 友好坐标标尺的显示。 该波形显示控件能够根据当前显示数据的坐标范围,友好地显示坐标标尺。例如X轴坐标起始值为34.2,结束坐标值为100.7,则控件不是简单得将坐标10等分并显示并不友好的坐标值,而是通过计算当前波形显示控件的大小,显示40、50……这样的友好的坐标值,并判断是否需要继续在40到50的坐标值之间显示更小分度的坐标值。 (3) 波形显示区域网格的显示。 该波形显示控件可以显示同坐标标尺的坐标线相对应的网格,使得用户能够更直观地观察波形数据。 (4) 波形的局部放大。 该波形显示控件提供了波形局部放大的功能。并根据实际使用和测试,控制了波形放大的精度,以免产生数据溢出的问题。 (5) 坐标自动调整。 该波形显示控件能够根据当前要显示的波形数据的值,自动选择最佳的坐标范围,来直观地在控件的波形显示区域显示完整的波形曲线。 (6) 外观颜色方案的修改。 该波形显示控件能够修改外观样式,诸如背景色、网格颜色、坐标线颜色、坐标值颜色等都可以进行调整,以使控件外观能够符合软件整体风格。 (7) 其他细节。 该波形显示控件还设计了一个工具栏,可以方面地使用网格显示、局部放大、坐标自动调整、恢复默认坐标功能。另外还设计右键菜单,能够显示当前鼠标位置的具体坐标值,以及工具栏按钮的快捷按钮。

110,536

社区成员

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

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

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