响应WM_SIZE的时候界面刷新出问题,会有重影的现象由于附件的项目用vs2008+feature pack创建,所以低版本打不开说说具体问题背景还原
1、新建单文档项目
2、将CControlWnd类文件包含进单文档项目中
3、在view类中建该类的指针对象
CControlWnd* m_controlWnd;
初始化:
wm_create消息中,
CRect rect(0,0,0,0);
m_controlWnd = new CControlWnd;
BOOL status = m_controlWnd->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect,
this, 1002);
if ( !status )
return -1;响应wm_size消息,if ( m_controlWnd != NULL && ::IsWindow(m_controlWnd->m_hWnd) )
{
CRect rect;
GetClientRect(&rect);
m_controlWnd->SetWindowPos(NULL, rect.left, rect.top,
rect.Width(), rect.Height(), SWP_NOZORDER | SWP_NOACTIVATE);
}build,run调整文档尺寸的时候,界面刷新就出问题了谢谢~
该帖包含附件:http://d.download.csdn.net/down/731984/soliddream66

解决方案 »

  1.   

    WM_SIZE里面 应该刷新界面 调用invalidate();不过这可能会闪烁 如果不想闪烁 你要计算好刷新区域 invalidaterect即可
      

  2.   

    restore.rar
    为了保险,再添加个纳米盘的附件下载吧
      

  3.   

    重影?是闪烁吧?给CControlWnd的父窗口加上WS_CLIPCHILDREN风格。
      

  4.   


    在视图类的PreCreateWindow中添加
    cs.dwExStyle |= WS_CLIPCHILDREN;
    发现现在效果变成这样了
      

  5.   

    你的CControlWnd是背景透明的?那就调用父窗口的Invalidate函数,不要WS_CLIPCHILDREN风格。
      

  6.   

    1. CControlWnd 的 OnPaint, 画上点东西,如一个圆。
    2. CControlWnd 的 OnEraseBkgnd, 画上点东西,或者仅仅是用单色填充整个区域。  
      

  7.   

    我在vc6+xp上按照楼主的方法做,一切正常,并没有出现重影问题,但是在vs2008+vista下面运行还是有上面的问题。这是vc6跟vs2008的问题呢,还是xp跟vista的问题呢?
      

  8.   

    把你的具体情况再描述一下,CControlWnd是不是透明的?我提的方法你是怎么试的?相关代码。
      

  9.   

    1.wm_size中不要使用SetWindowPos,使用MoveWindow,这个函数会自动刷新界面。如果显示坐标和逻辑坐标不符合你的要求,可以通过下面代码实现转换.
    CDC* pDC = GetDC();
    pDC->LPtoDP(&rect);
    ReleaseDC(pDC);2.如果还有问题,你可以写一个强制刷新函数,自己直接填充窗口背景色。或者在wm_size中直接调用Invalidate函数。
      

  10.   

    背景没有刷新导致的。处理 WM_ERASEBKGND 消息,写如下代码:
    BOOL CControlWnd::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: Add your message handler code here and/or call default
    CRect rc;
    GetClientRect(rc);
    pDC->FillRect(rc, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
    return TRUE;
    return CWnd::OnEraseBkgnd(pDC);
    }
      

  11.   


    在onSize最后添加Invalidate();CControlWnd创建的时候是用WS_CHILD和WS_VISIBLE,没有设置透明选项
    BOOL status = m_controlWnd->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect,
    this, 1002); 
      

  12.   


    MoveWindow和在wm_size中直接调用Invalidate函数没有用强制刷新函数,自己直接填充窗口背景色有效果
      

  13.   

    OnEraseBkgndCRect rc;
    GetClientRect(rc);
    pDC->FillRect(rc, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
    OnPaint//创建画笔C++对象
    CPen* pPenBlue = new CPen;
    //创建画笔
    pPenBlue->CreatePen(PS_SOLID,5,RGB(0,150,0));
    //选中当前画笔,并保存以前的画笔
    CPen* pOldPen = dc.SelectObject(pPenBlue);
    //画圆
    dc.Ellipse(400,400,200,200);
    //恢复旧画笔
    dc.SelectObject(pOldPen);
    //删除新建的画笔对象
    delete pPenBlue;
    之后拖拽改变尺寸后,图中画的椭圆没有受到影响,应该没有问题了谢谢各位大大了~