winform 如何修改成GDI混合GDI+绘图 提高绘图效率

薛小坏 2014-01-15 04:50:01
方法如下



//dbPointModulusX X轴上当前刷新到的坐标 dbModulus 根据分辨率算得的一个系数值
dbPointModulusX += dbModulus;

if (dbPointModulusX >= this.panShow.Width)
{
dbPointModulusX = 0;

pLastA.X = (int)dbPointModulusX;
pLastA.Y = this.panShow.Height / 2;

}
Graphics g = Graphics.FromImage(BitBackDraw);
//设置高质量插值法
g.InterpolationMode = InterpolationMode.Default;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.Default;


//断开效果
Rectangle rect1 = new Rectangle((int)dbPointModulusX, 0, 2, this.panShow.Height);
g.FillRectangle(new SolidBrush(Color.Black), rect1);
//将背景图截2个像素的宽度放到画波形的位图上
g.DrawImage(BitBackImage, new Rectangle((int)dbPointModulusX, 0, 2, BitBackDraw.Height), new Rectangle((int)dbPointModulusX, 0, 2, BitBackImage.Height), GraphicsUnit.Pixel);



Point pNewA = new Point();
pNewA.X = (int)dbPointModulusX;
pNewA.Y =this.panShow.Height / 2;
Pen pen = new Pen(Color.Green, 2);
Point[] points = new Point[2] { pLastA, pNewA };
g.DrawLines(pen, points);
pLastA.X = pNewA.X;
pLastA.Y = pNewA.Y;






g = this.panShow.CreateGraphics();
g.DrawImage(BitBackDraw, 0, 0);


g.Dispose();
...全文
534 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tonyzhao23 2016-02-27
  • 打赏
  • 举报
回复
我的项目也是winform 做好之后十分卡顿,最后转成WPF了
shadow_dreamer 2015-08-20
  • 打赏
  • 举报
回复
我也是类似的问题,不知楼主是怎么解决的?
薛小坏 2014-01-21
  • 打赏
  • 举报
回复
薛小坏 2014-01-20
  • 打赏
  • 举报
回复
各位给点好的思路吧
薛小坏 2014-01-20
  • 打赏
  • 举报
回复
为什么c++绘制的可以那么流畅,用c#就这么卡呢 该怎么弄呢 ╮(╯▽╰)╭
智商余额不足 2014-01-17
  • 打赏
  • 举报
回复
引用 7 楼 DABIN0814 的回复:
最后一次顶起 啥都不说了
难道只是想用BitBlt替换DrawImage?
薛小坏 2014-01-17
  • 打赏
  • 举报
回复
最后一次顶起 啥都不说了
dylike 2014-01-17
  • 打赏
  • 举报
回复
性能可以提升,但你的数据量实在太大,即使用最大性能提升法也没太好的效果.
薛小坏 2014-01-17
  • 打赏
  • 举报
回复
引用 8 楼 hwenycocodq520 的回复:
[quote=引用 7 楼 DABIN0814 的回复:] 最后一次顶起 啥都不说了
难道只是想用BitBlt替换DrawImage?[/quote] 不是 现在的问题是 每秒钟从硬件中读到的数据有500多,可是绘制波形图时,绘制的太慢了,时间久了 把硬件关闭后,内存中还有好多数据。 该怎样提高绘图的速度呢?真心请教
BenBenBears 2014-01-16
  • 打赏
  • 举报
回复
先获取窗口或控件的Graphic Grapic gScreen = this.CreateGraphics() 再获取Graphic的DC IntPtr hDC = gScreen.GetHDC(); 利用win32 api创建一个memory DC IntPtr hMemDC = Win32API.CreateCompatibleDC(hDC); 再创建一个memory bitmap,即缓冲位图 IntPtr hMemBitmap = Win32API.CreateCompatibleBitmap(hDC, image.Width, image.Height); 在win32 sdk文档中关于这个函数进行了说明:由于上一步创建的Memory DC中默认select进了一个1x1的单色位图,如果CreateCompatibleBitmap中传递hMemDC作为参数,创建的memory bitmap也将为单色,将彩色位图BitBlt传送至它的时候将会有问题。因此必须用屏幕的DC作为参数。 将memory bitmap选入memory DC Win32API.SelectObject(hMemDC, hMemBitmap); 接下来利用memory dc创建Graphic Graphics gMem = Graphics.FromHDC(hMemDC); 将Image绘制到Memory Graphic gMem.DrawImage(image, rectImage) 这样Image的内容就成功绘制到hBitmap中。另外需记住用完后用了GetHDC()的Graphic必须ReleaseDC(),不再使用的Graphic和DC需要分别Dispose()和Win32API.DeleteDC()。
薛小坏 2014-01-16
  • 打赏
  • 举报
回复
没人吗 帮帮忙啊
薛小坏 2014-01-16
  • 打赏
  • 举报
回复
走过路过的大神 帮忙瞅瞅吧
薛小坏 2014-01-16
  • 打赏
  • 举报
回复
引用 3 楼 BenBenBears 的回复:
先获取窗口或控件的Graphic Grapic gScreen = this.CreateGraphics() 再获取Graphic的DC IntPtr hDC = gScreen.GetHDC(); 利用win32 api创建一个memory DC IntPtr hMemDC = Win32API.CreateCompatibleDC(hDC); 再创建一个memory bitmap,即缓冲位图 IntPtr hMemBitmap = Win32API.CreateCompatibleBitmap(hDC, image.Width, image.Height); 在win32 sdk文档中关于这个函数进行了说明:由于上一步创建的Memory DC中默认select进了一个1x1的单色位图,如果CreateCompatibleBitmap中传递hMemDC作为参数,创建的memory bitmap也将为单色,将彩色位图BitBlt传送至它的时候将会有问题。因此必须用屏幕的DC作为参数。 将memory bitmap选入memory DC Win32API.SelectObject(hMemDC, hMemBitmap); 接下来利用memory dc创建Graphic Graphics gMem = Graphics.FromHDC(hMemDC); 将Image绘制到Memory Graphic gMem.DrawImage(image, rectImage) 这样Image的内容就成功绘制到hBitmap中。另外需记住用完后用了GetHDC()的Graphic必须ReleaseDC(),不再使用的Graphic和DC需要分别Dispose()和Win32API.DeleteDC()。
真的很感谢你帮我搜索答案,但是.......能告诉我怎么在我原有的代码基础上怎么改吗?或者在哪一步改用GDI吗?
薛小坏 2014-01-15
  • 打赏
  • 举报
回复
初始化时 生成两个位图 BitBackImage(背景) BitBackDraw (绘制波形用的)

110,539

社区成员

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

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

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