大家好,
    我做了一个小对话框程序,Border的属性设置的是Resizing,就是可以最大化,拉伸等等的.
对话框上面有一个picture控件,上面贴了一幅图片.当拉伸对话框的时候,图片闪烁地比较厉害.
贴图相关的代码:
void OnPaint()
{
 if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
CPaintDC dc(this);
CDC* md;
CBitmap* bitmap;

CWnd* pwnd;
CRect rect;

md = new CDC;
bitmap = new CBitmap;


                  /* IDC_SCREEN 为picture控件的ID */
pwnd = GetDlgItem( IDC_SCREEN );
pwnd->GetWindowRect( &rect );
ScreenToClient( &rect );

md->CreateCompatibleDC(&dc);//将md转换成与dc兼容的DC

                  /* playerapple.bmp就是picture控件上贴的位图 */
bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"./res/playerapple.bmp",IMAGE_BITMAP,
                                                         rect.Width(),rect.Height(),LR_LOADFROMFILE);

md->FillSolidRect( rect.left, rect.top,rect.Width(),rect.Height(),m_DlgColorref );
//md->FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));  md->SelectObject(bitmap);
dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),md,0,0,SRCCOPY);
//dc.BitBlt(left,top,178,151,md,0,0,SRCCOPY);

if(md)
delete md;
if(bitmap)
delete bitmap;
    }
}BOOL OnEraseBkgnd(CDC* pDC)
{
return TRUE; 
}
双缓存也用了, OnEraseBkgnd()里面也返回TRUE了,还要怎么改啊?
请高手帮忙看看,谢谢!

解决方案 »

  1.   


    用双缓存
    WM_ERASEBKGND直接返回TRUE
      

  2.   

    设置对话框具有WS_CLIPCHILDREN的样式
      

  3.   

    大家帮我看看,OnPaint()函数里面有没有什么问题.
      

  4.   


    看来你对双缓冲的用法不是很了解
    建议你看看这篇文章http://hi.csdn.net/link.php?url=http://blog.csdn.net%2FFireway2008
      

  5.   


    bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"./res/playerapple.bmp",IMAGE_BITMAP, 
                                                            rect.Width(),rect.Height(),LR_LOADFROMFILE); 每次重绘都要load一边,硬盘读取比较慢啊。
    你把这个过程放到初始化里面去行不行?
    或者建立bitmap resource,然后直接CBitmap bitmap; bitmap.LoadBitmap(IDB_XXX);
      

  6.   

    其实楼主以为创建一个内存DC就是以为使用了双缓冲;
    1》其实你只对picture控件进行双缓冲,也就是说,如果单单对picture控件改变大小了,图片并不会闪烁!2》而您改变窗口大小时,是整个主窗体都在进行,控件与主窗体之间背景与图片还是存在反差,所以仍然出现闪烁!如果你还不信的,可以试试,直接在一个窗体上面画面,然后改变大小,看看似乎会闪烁?
    我想这就是6楼高手所说的没有使用双缓冲的原因吧!
      

  7.   

    把绘制代码 放在OnEraseBkgnd()里试试
      

  8.   

     映射wm_size,在里面INVALIDATE(false);看下行不
      

  9.   

    dlg
    没有onerase()在哪里设置双缓冲???