void CPlatform::OnPaint() //已经定义了消息映射!
{
/************************************************************************/
/* 正式代码开始! */
/************************************************************************/
//定义变量!
//CDC* pDC=this->GetDC();
CPaintDC MainPaint(this); //用CDC就会变得很快!因为不受定时器的作用了!// device context for painting
CBitmap m_Canvas;//画布!
CDC MemoryDC;//内存缓冲!
GetClientRect (&m_PlatformArea);
// 获得控件区域!
MainPaint.SelectObject(&m_PlatformArea);
//创建内存缓冲!
MemoryDC.CreateCompatibleDC(&MainPaint);
m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
MemoryDC.SelectObject(&m_Canvas); //绘制边框和底色!
PaintBackground(&MemoryDC);
//绘制运动图!
DynamicPaint(&MemoryDC);
MainPaint.BitBlt(0, 0, m_PlatformArea.Width(), m_PlatformArea.Height(), &MemoryDC, 0, 0, SRCCOPY);
MemoryDC.DeleteDC();
m_Canvas.DeleteObject();
}已经用了双缓冲怎么还是闪烁呢?请问怎么解决啊?
谢谢!还有重载了,OnErabkgnd();return TURE!怎么就没有背景了啊?
{
/************************************************************************/
/* 正式代码开始! */
/************************************************************************/
//定义变量!
//CDC* pDC=this->GetDC();
CPaintDC MainPaint(this); //用CDC就会变得很快!因为不受定时器的作用了!// device context for painting
CBitmap m_Canvas;//画布!
CDC MemoryDC;//内存缓冲!
GetClientRect (&m_PlatformArea);
// 获得控件区域!
MainPaint.SelectObject(&m_PlatformArea);
//创建内存缓冲!
MemoryDC.CreateCompatibleDC(&MainPaint);
m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
MemoryDC.SelectObject(&m_Canvas); //绘制边框和底色!
PaintBackground(&MemoryDC);
//绘制运动图!
DynamicPaint(&MemoryDC);
MainPaint.BitBlt(0, 0, m_PlatformArea.Width(), m_PlatformArea.Height(), &MemoryDC, 0, 0, SRCCOPY);
MemoryDC.DeleteDC();
m_Canvas.DeleteObject();
}已经用了双缓冲怎么还是闪烁呢?请问怎么解决啊?
谢谢!还有重载了,OnErabkgnd();return TURE!怎么就没有背景了啊?
Onpaint 里 只放 1个 bitblt DC在外面就处理好 要不每次都要处理能不闪
CDC MemoryDC;//内存缓冲!
GetClientRect (&m_PlatformArea);
// 获得控件区域!
MainPaint.SelectObject(&m_PlatformArea);
//创建内存缓冲!
MemoryDC.CreateCompatibleDC(&MainPaint);
m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
MemoryDC.SelectObject(&m_Canvas);
这些要提出来吧
OnErabkgnd();return TURE!怎么就没有背景了啊?
/////////////////////////////////////////////////////
当然没有背景了,看看MSDN吧!~~~~返回TRUE系统就不擦除背景了!~~~其实每次窗口过程收到WM_PAINT消息前一定会收到WM_ERASEBKGND消息,现假设默认画刷是白的,系统首先用它擦除背景然后才是你的OnPaint再在上面绘制!想一想如果你绘制的颜色和白色色差很大,不闪才怪呢!~~`1、重载OnErabkgnd();然后return TURE; 不让系统擦除背景,然后在//绘制边框和底色!
PaintBackground(&MemoryDC);代码上面加入MemoryDC.FillRect(...),这下就有背景了,颜色还可以自定.2、上面的方法效率比较低,如果还不能满足的话,那你只有确定你绘制的区域由OnPaint来处理,没有绘制的区域由OnErabkgnd()来处理并返回TRUE;这样比较烦一点,但效果很好!~
你可能还没有明白我说的是什么意思。那就是默认的话OnErabkgnd先擦除背景再由OnPaint来绘制,也就是说每个像素点其实被绘制了两次,这也是闪烁的根本原因!如果你能控制让每个像素点只绘制一次那也就不会闪了!
如果你绘制的图行是规则那就很好办(FillRect),否则的话就用区域!(注意:就是区域要记算准确了,否则的话你也不知道你的屏幕上是什么东西了!)还有一点,并不是什么时候都一定要用内存绘图(双缓冲),用的不好也可能使效率下降的!~~~
一般的话图果图形之间没有多大的色差变化的话完全可以不用双缓冲的!总之要视具体情况而定的!
怎么办呢?谢谢!
其它的背景可以在OnErabkgnd()中绘制!(但不要绘制全部客户区了,不然还是闪的)然后返回TRUE;还有我说的第一种办法,就是在你的位图选进内存设备描述表后这时候可以先填充背景!这样的话不是在屏幕上话,一般也不会闪的!
PaintBackground(&MemoryDC);
DynamicPaint(&MemoryDC);
代码贴上来看看,不然不好说的!~~~~
发表于:2008-01-03 19:09:40 楼主
C/C++ codevoid CPlatform::OnPaint() //已经定义了消息映射!
{
/************************************************************************/
/* 正式代码开始! */
/************************************************************************/
//定义变量!
//CDC* pDC=this->GetDC();
CPaintDC MainPaint(this); //用CDC就会变得很快!因为不受定时器的作用了!// device context for painting
CBitmap m_Canvas;//画布!
CDC MemoryDC;//内存缓冲!
GetClientRect (&m_PlatformArea);
// 获得控件区域!
//MainPaint.SelectObject(&m_PlatformArea); 不知道你把矩形选进设备描述表做什么??
//创建内存缓冲!
MemoryDC.CreateCompatibleDC(&MainPaint);
m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
MemoryDC.SelectObject(&m_Canvas);
//加入的代码
CBrush brush (RGB(255,255,255));
MemoryDC.FillRect (&m_PlatformArea, &brush); //这样没有背景??
//绘制边框和底色!
PaintBackground(&MemoryDC);
//绘制运动图!
DynamicPaint(&MemoryDC);
MainPaint.BitBlt(0, 0, m_PlatformArea.Width(), m_PlatformArea.Height(), &MemoryDC, 0, 0, SRCCOPY);
MemoryDC.DeleteDC();
m_Canvas.DeleteObject();
}
http://blog.csdn.net/ringphone/archive/2007/12/03/1914052.aspx