void CGfxOutBarCtrl::OnPaint()//CGfxOutBarCtrl是自定义控件,创建用CreateEx
{
CRect rc;
GetClientRectCurrent(&rc);//获得当前大小
        rc.right+=300;//增大长度
CPaintDC dc(this);//获得PaintDC
dc.m_ps.rcPaint.right+=400;//更改PaintDC区域长度
dc.FillSolidRect(rc,RGB(128,128,128));//填充(Debug到这里时,rc和dc,也都是修改后的大小了,但)
}
为什么绘的大小还是原rc的大小.

解决方案 »

  1.   

    GetClientRect(&rc);
    rc.right += 300;
    CPaintDC dc(this);
    dc.FillSolidRect(rc, RGB(128,128,128));
      

  2.   

    哦,是我写错了,这个是我自定义的函数,再贴一下: 
    void CGfxOutBarCtrl::OnPaint()//CGfxOutBarCtrl是自定义控件,创建用CreateEx
    {
        CRect rc;
        GetClientRect(&rc);//获得当前大小
            rc.right+=300;//增大长度
        CPaintDC dc(this);//获得PaintDC
        dc.m_ps.rcPaint.right+=400;//更改PaintDC区域长度
        dc.FillSolidRect(rc,RGB(128,128,128));//填充(Debug到这里时,rc和dc,也都是修改后的大小了,但)
    }
      

  3.   

    你这样就想改变DC的大小是不行的, DC绘图的区域大小受到窗体的限制,你可以通过使用
    MoveWindow或SetWindowPos来改变当前CGfxOutBarCtrl窗口的大小,然后才能将DC扩展开,不然窗口多大DC就最多有多大。
      

  4.   

    错了 不是DC有多大 而是DC显示的最多有多大
      

  5.   

    void CMQQAppearanceDlg::OnSize(UINT nType, int cx, int cy) 
    {
    if(wndBar)
    {
    CRect rc;
    GetClientRect(&rc);//
    wndBar.MoveWindow(rc,true);
    wndBar.Invalidate(true);//正确,不会有闪烁
                      Invalidate(true);//也正确,但是如果拉伸会狂闪烁

    }
    CDialog::OnSize(nType, cx, cy);
    }
    我Debug了下,拉伸了下,运行如下(wndBar.Invalidate和Invalidate都执行了下面顺序,也都执行一遍):
    1.CMQQAppearanceDlg(父窗口)::OnSize;
    2.CMQQAppearanceDlg::OnPaint
    3.CGfxOutBarCtrl(wndBar的)::OnPaint;都是一样的,为什么会"狂闪烁"呀
      

  6.   

    wndBar.MoveWindow(rc,true); 
    wndBar.Invalidate(true);//正确,不会有闪烁 
                      Invalidate(true);//也正确,但是如果拉伸会狂闪烁 
    ----------------------------------------------------------
    1.wndBar.MoveWindow(rc,true); ------>其中brepaint选项为true,激发wm-paint消息.
    2.Invalidate(true);--->同样,也激发wm-paint消息.
    这是你看到不断闪烁的原因.
    改为以下正确:wndBar.MoveWindow(rc,false); 
    Invalidate(true);
      

  7.   


    我也知道呀,但是,如果
    1.wndBar.MoveWindow(rc,true); //这个只要是True,就肯定会闪,也就是说的激发wm-paint消息.
    (这个激发wm-paint消息是只绘制无效区域吗?还是全部重绘了.)如:(如果为false)
    wndBar.MoveWindow(rc,false); 
    后面加N多个:wndBar.Invalidate(true);//同样,也激发wm-paint消息. 
    这样都不会闪的,也就是说,这个不是因为多激发了个wm-paint消息.也就是说,这里,MoveWindow(rc,true)的 激发wm-paint消息 是不是跟Invalidate(true)的不一样呢
      

  8.   


    忘了说了,这里如果这样写,还是会闪的,你这里的Invalidate(true)是父窗口的,
    而我试了,只有是wndBar.Invalidate(true),即这个自定义的窗口的刷新才可以
    不会闪.