继承CDialog类
CMyDialog::OnPaint()
{if(...)
{}
else
{
CPaintDC dc(this); // 用于绘制的设备上下文
CDialog::OnPaint();
}
而CDialog::OnPaint的代码为:void CDialog::OnPaint()
{
CPaintDC dc(this);
if (PaintWindowlessControls(&dc))
   return;
Default();
}
我听人说,红色的那句必须去掉,为什么啊?CPaintDC的构造函数就是调用BeginPaint......是不是因为不能多次调用啊?

解决方案 »

  1.   

    应该去掉,多次嵌套调用BeginPaint没有什么意义
    第一次调用BeginPaint后窗口的无效区域已经被清空了,也就是说后续的BeginPaint调用得到的dc根本没有绘制区域,在其上的所有绘制操作都会被裁掉
      

  2.   


     再请教一个问题,如果在这样的情况下去掉,有后果吗?一个主窗口上 create了一个对话框, 此时,我们处理CMyDialog::OnPaint,就相当与子类化 对话框了。对吧 ? 父窗口是父亲,对话框是子。
    else
    {
    CPaintDC dc(this); // 用于绘制的设备上下文
    //CDialog::OnPaint();
    }
    能够绘制对话框?如果可以的话,我猜测也是 某个消息绘制的,而不是wm_paint
      

  3.   


     你说的是0楼的,还是2楼的啊?CDialog::OnPaint里却是有个CPaintDc dc(this);不就重复了BeginPaint 了吗?
      

  4.   

    An application should call the GetUpdateRect function to determine whether the window has an update region. If GetUpdateRect returns zero, the application should not call the BeginPaint and EndPaint functions. 
      

  5.   


    我发代码:
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CDialog::OnPaint() CRect rect;
    GetClientRect(&rect);
    if(GetUpdateRect(rect))
    {
    CDialog::OnPaint();
    }
    加上CDialog::OnPaint这一句,很可能出问题,尽管msdn没有说~!
    还有第2楼,帮忙看看thanks
      

  6.   

    我说的是二楼
    如果不需要绘制父窗口肯定不能去掉OnPaint
    否则窗口不会画出来
      

  7.   

    按照逻辑来,不去掉最终界面调用的就是父类的OnPaint,你之前的画图工作不就白做了么?所以,去掉不去掉按照你想实现的功能来的
      

  8.   


    GetUpdateRect放在CPaintDC或BeginPaint后面,GetUpdateRect总是返回0
      

  9.   


    PaintWindowlessControls? 貌似是DirectUI系统提供的对话框类本来就没在WM_PAINT画出什么来;背景是在WM_ERASEBKGND刷出来的
      

  10.   

    else
    {
    CPaintDC dc(this); // 如果要自绘,就不要 下句
    CDialog::OnPaint();// 如果要 这句,就不要 上句
    }
      

  11.   

    else
    {
    CPaintDC dc(this); // 用于绘制的设备上下文
    //CDialog::OnPaint();
    }
    能够绘制对话框?
    如果可以的话,我猜测也是 某个消息绘制的,而不是wm_paint
    -----------------------
    标准对话框WM_PAINT处理一般的BeginPaint,EndPaint就完了,中间没有其他代码,因为对话框一般通过其上的控件来体现功能的,而控件的绘制那是控件自己的事儿了,不在对话框的WM_PAINT消息处理中
      

  12.   

    CPaintDC dc(this); // 如果要自绘,就不要 下句
    这句的作用是:
    1。擦除背景。
    2。使客户区有效。
    没有这句
    CDialog::OnPaint();
    有也有这句。有这句后CDialog::OnPaint();
    里的CPaintDC dc(this); 蒋没有如何 作用。因为:
    1。背景已擦除。
    2。客户区已有效。