各位大哥,我是用的MDI的窗口模式,我在首先出现的FormView里面加载了背景图。
加载的方式如下,但是只要出现窗口切换或别的程序窗口覆盖,就闪动历害,应该怎么处理呢?
如果不用Invalidate();,就在窗口切换或别的程序窗口覆盖有破碎的界面在背景图上面。
各位大哥求救了。否则真的是下岗了喔,因为没有达到要求喔。老板不同意呀。BOOL CFormSee::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default Invalidate();
if(m_runFirst)
{
m_bitmap.LoadBitmap(IDB_MAIN);
if(!m_bitmap.m_hObject)
return false;
}
CRect rect;
GetClientRect(&rect);
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dc.SelectObject(&m_bitmap);
int bmw, bmh ;
BITMAP bmap;
m_bitmap.GetBitmap(&bmap);
bmw = bmap.bmWidth;
bmh = bmap.bmHeight;
int xo=0, yo=0;
pDC->GetClipBox(&rect); // 擦除所需的区域
pDC->StretchBlt(xo, yo, rect.Width(),rect.Height(), &dc,0, 0,rect.Width(),rect.Height(), SRCCOPY);
dc.SelectObject(pOldBitmap);
m_runFirst=false; UpdateWindow();
return true;}
加载的方式如下,但是只要出现窗口切换或别的程序窗口覆盖,就闪动历害,应该怎么处理呢?
如果不用Invalidate();,就在窗口切换或别的程序窗口覆盖有破碎的界面在背景图上面。
各位大哥求救了。否则真的是下岗了喔,因为没有达到要求喔。老板不同意呀。BOOL CFormSee::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default Invalidate();
if(m_runFirst)
{
m_bitmap.LoadBitmap(IDB_MAIN);
if(!m_bitmap.m_hObject)
return false;
}
CRect rect;
GetClientRect(&rect);
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dc.SelectObject(&m_bitmap);
int bmw, bmh ;
BITMAP bmap;
m_bitmap.GetBitmap(&bmap);
bmw = bmap.bmWidth;
bmh = bmap.bmHeight;
int xo=0, yo=0;
pDC->GetClipBox(&rect); // 擦除所需的区域
pDC->StretchBlt(xo, yo, rect.Width(),rect.Height(), &dc,0, 0,rect.Width(),rect.Height(), SRCCOPY);
dc.SelectObject(pOldBitmap);
m_runFirst=false; UpdateWindow();
return true;}
而且你的背景画完了又调用UpdateWindows再次把窗口强行刷新了一次,所以......
另外在绘图代码中不要 Invalidate 也不要 UpdateWindow
就会出现拉动滚动条的时候出现重影背景,别的程序窗口在它上面时候再切换就有别的窗口一部分内容在里面,不能够完全刷新。应该怎么处理呢?
to:qrlvls(空 气) 我试着在ONPAINT 里面处理,但是onpaint的函数原型没有CDC* pDC这个参数呀。
我怎么样得到这个PDC呢?谢谢楼上几位大哥了呢。求救!
ShiGang(Sucess)
这个应该怎么处理呢?谢谢,能给详细点吗?谢谢。急。
CRect rcClient;
CDC MemDC,MaskDC;BITMAP Bmp;
CBitmap Bitmap;
GetClientRect(&rcClient);
MaskDC.CreateCompatibleDC(&dc);
MaskDC.SelectObject(&m_BkImage);
m_BkImage.GetObject(sizeof(Bmp),&Bmp); MemDC.CreateCompatibleDC(&dc);
Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
MemDC.SelectObject(&Bitmap);
//..................
//進行畫圖及設置底色.
//..................
MemDC.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MaskDC,0,0,Bmp.bmWidth,Bmp.bmHeight,SRCAND); dc.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
MaskDC.DeleteDC();
MemDC.DeleteDC();
Bitmap.DeleteObject();
1、m_BkImage 是怎么来的呢?是类中就已经定义的吗?
2、这个整段程序代码是放在哪个函数里面呢?
谢谢了。希望就在眼前了。谢谢帮助。
CDC MemDC,MaskDC;BITMAP Bmp;
CBitmap Bitmap;GetClientRect(&rcClient);
MemDC.CreateCompatibleDC(&dc);
Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
MemDC.SelectObject(&Bitmap);
//..................
//進行畫圖及設置底色.
//..................
dc.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
MemDC.DeleteDC();
Bitmap.DeleteObject();
避免闪烁这算是标准解决方案
另外可以在OnPaint() 里使用双缓冲,可以使更复杂的绘图避免闪烁
1、重载 BOOL CFormSee::OnEraseBkgnd(CDC* pDC) ,去掉它的墨认返回值,直接返回true;
2、重载 void CFormSee::OnPaint() ;
添加如下代码:
CPaintDC dc(this); // 这句话本来就存在。
CDC MemDC;//创建内存DC;
CRect rcClient;
GetClientRect(&rcClient);//得到客户区域/
MemDC.CreateCompatibleDC(&dc); /*创建内存DC*/
MemDC.SelectObject(&m_bitmap);
/*m_bitmap是创建的一个图像类。m_bitmap.LoadBitmap(IDB_MAIN);*/
dc.StretchBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);/*COPY内存DC*/
MemDC.DeleteDC();
//基本完成。
//不过还有一个问题,在拖动滚动条的时候就会出现背景图重影的情况,不知有兄弟是否知道。谢谢。