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的大小.
rc.right += 300;
CPaintDC dc(this);
dc.FillSolidRect(rc, RGB(128,128,128));
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,也都是修改后的大小了,但)
}
MoveWindow或SetWindowPos来改变当前CGfxOutBarCtrl窗口的大小,然后才能将DC扩展开,不然窗口多大DC就最多有多大。
{
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;都是一样的,为什么会"狂闪烁"呀
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);
我也知道呀,但是,如果
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)的不一样呢
忘了说了,这里如果这样写,还是会闪的,你这里的Invalidate(true)是父窗口的,
而我试了,只有是wndBar.Invalidate(true),即这个自定义的窗口的刷新才可以
不会闪.