C#下实现双缓冲描画高频曲线(GDI+结合GDI)
由于项目需要,要使用c#描画高频实时曲线.
但是在C#下由于描画图像使用的是GDI+,描画效率很有问题.一旦曲线太多,就会造成CPU使用率直线上升,马上飙升到100%.
在GDI+下使用双缓冲也无济于事,双缓冲本身只会解决曲线多的时候全屏闪烁问题,但描画效率还是严重低下.
其间用过多种解决方案:DRECT3D,DRIRECT2D,GDI,,,,,等等等等
最后从效率出发,最终解决方案如下:
前台显示使用GDI,而后台描画则采用GDI+
后台采用10倍于前台窗口的BUFFER,每次向其中画一条线.然后通过一个RECT视口,每次向前台显示视口里的内容.否则每次重绘的代价太高.
这个方法实现的难点主要在于GDI和GDI+的结合部分,主要代码如下:
1.函数库:using 和 WIN32API函数
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
[DllImport("gdi32")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);
[DllImport("GDI32.dll")]
public static extern long BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
[DllImport("GDI32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
2.声明对象
public PictureBox _backgroundGraph;//被描画的控件对象
//public Form _backgroundGraph;
public Graphics _backgroundGraphic = null; // 背景Graphic
public Graphics _backgroundRenderGraphic = null; // 双缓冲Graphic
private Graphics _backgroundMemoryGraphic = null; // 内存Graphic
public Graphics _backgroundDrawGraphic = null; // 描画Graphic
private Bitmap _backgroundMemoryBitmap = null; // 内存Bitmap
public BufferedGraphics _graphicsBuffer = null; // 双缓冲BufferedGraphics
private IntPtr _memoryGraphicHdc; // 内存Graphic适用的引用
private IntPtr _memoryBitmapHdc; // 内存Bitmap适用的引用
3.初始化对象
public void InitDraw()
{
_backgroundGraph = pictu
相关文档:
C#与Flash交互 (转自小磊在线)
C#与Flash交互
前段日子公司要求做一个C#与Flash交互的东西,用来C#与短信猫通讯将数据传到Flash上显示与操作的应用。
第一步C#添加组件
打开VS2005-工具-选择工具箱项-COM组件-选择Shockwave Flash Object-确定
添加好组件往场景上拖放,如果提示注册需求注册
c# 注册控件-在运行输 ......
以下参考 :http://msdn.microsoft.com/zh-cn/library/87d83y5b.aspx
接口(C# 参考)
更新:2007 年 11 月
接口只包含方法、属性、事件或索引器的签名。成员的实现是在实现接口的类或结构中完成的,如下面的示例所示:
示例
interface ISampleInterface
{
void SampleMethod();
}
class Implem ......
在C#3.0中增加了一个变量声明var,这个声明和JavaScript的var类似,蛋也不同。(*^__^*) 嘻嘻……
1.相同点,它可以用var来声明任何类型的局部变量。
2.不同点 它仅仅告诉编译器,该变量需要根据初始化表达式来确定变量的类型,而且只能是局部变量。 ......
本章为接口课程的综合练习。
本次练习展示了一个简化的银行业务流程,体现了银行和用户数个角色的关系。看下图:
账户类(Account)对象存储在数据库类(Database)对象中;计算机(Computer)类对象连接到数据库类对象上;银行柜台(BankCounter)类对象拥有一台计算机对象作为私有成员,利用该对象对数据库进行操作;AT ......
通过一个实际的例子来介绍。其中重载==,!=,Equal,GetHashCode函数。
public class Record
{
public string[] arr = null;
public bool hasEqual = false;
//重载一个下标运算符号
public string this[int index]
{
get
{
return arr[index];
}
set
{
arr[index] = value;
}
}
public override int GetHas ......