首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于C#中适用BITBLT的有关问题.

2012-04-14 
关于C#中适用BITBLT的问题...最近在研究GDI+在移动一张贴图的时候发现.drawimage()很卡..后来用了双缓冲,

关于C#中适用BITBLT的问题...
最近在研究GDI+
在移动一张贴图的时候发现.drawimage()很卡..
后来用了双缓冲,感觉好多了,但还是觉得有点慢..
请问怎么使用bitblt把一张图绘到另外一张图中..

弄了好久都找不到可以参考的C#源码...压力大
P.s. 源代码在此,如果有可以改进的地方希望指出,谢谢


C# code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication1{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //默认启动双缓冲            this.SetStyle(ControlStyles.DoubleBuffer, true);            this.SetStyle(ControlStyles.UserPaint, true);            this.SetStyle(ControlStyles.ResizeRedraw, true);            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.            haha = new Bitmap(panel1.Width, panel1.Height);            g = Graphics.FromImage(haha);            pang = panel1.CreateGraphics();        }        Graphics g;        int x = 0;        Image haha;        Graphics pang;//panel1                private void timer1_Tick(object sender, EventArgs e)        {            x += 3;            timer1.Interval = 1;            Invalidate();            Draw();        }        private void Draw()        {            using (Graphics g = Graphics.FromImage(haha))            {                g.Clear(Color.White);                g.DrawImage(Properties.Resources._2, -x, 100);                g.DrawImage(Properties.Resources._2, x, 100);                g.DrawImage(Properties.Resources._2, x, 0);                g.DrawImage(Properties.Resources._2, -x, -x);                g.Dispose();            }        }        protected override void OnPaint(PaintEventArgs e)        {            Draw();            pang.DrawImage(haha, Point.Empty);        }    }}


[解决办法]
BitBlt已经10来年没用过了,忘的差不多了,你的双缓存用的方法不对

不要在OnPaint事件中去Draw,在数据改变时去Draw一个BufferedGraphics(也就是用作缓冲的Graphics),Draw完后调用Invalidate
OnPaint中就写一句:

 m_MemoryDC.Render(e.Graphics);


另外,没必要整一个Image出来配合,直接画MemoryDC就可以了.

窗口声明:
protected BufferedGraphics m_MemoryDC = null;
protected BufferedGraphicsContext m_Context = BufferedGraphicsManager.Current;

窗口构造函数中:
this.m_MemoryDC = m_Context.Allocate(this.CreateGraphics(), this.ClientRectangle);

[解决办法]
你也把这些事当真了,如果追求完美,BitBlt速度肯定快,实际上.Net中也是有解决办法的Graphics不是也有Clip方法么?

如果你刻意用BitBlt去解决,不如复制一段C++代码贴这,让人翻译

如果C#中也能达到你的效果,那么非要转入DLL中就没什么意思了,

另外提高阶的问题也是有学问的,因为别人在回答你的问题时,也需要考虑你的"文化层次",给你扔一段你看不懂的代码,首先是对你的不负责.

我知道用GDI函数,解决你类似的问题很容易,不外乎写一段代码,也挺费时间,示例好写,翻译成C#就比较麻烦了,至少复制许多API),更关键是,未必能说明问题,也就是让你明白,比如你把一个什么类icon的复制了四遍,也许不是icon,不过四遍已经让人很头疼了,无外乎是个擦除么,擦除一个容易吧,VERY,擦四个,坐标运算??

热点排行