在对话框程序上放了一个TabCtrl,tab控件用的是vckbase上的CCoolTabControl。在Tab控件内再放了一个子对话框。在子对话框的OnPaint事件中写了一段GDI+的代码,实现子对话框上一个PictureControl内画横、竖几条线。现在问题是画完后没有刷新!要移动一下程序主窗口或被其它程序窗口覆盖一下才会刷新。我试了:
1、画完后,我弹出自已的About窗口盖住picturecontrol再移开,Picture没有刷新。我又在代码中移了旁边一Static控件盖住再移开也没有刷新,但是用其它程序的窗体盖住移开就会刷新!
2、搜了很多关于GDI+、窗体刷新的贴子,并尝试其中提到的Invalidate(),InvalidateRect(),UpdateWindow,RedrawWindow,OnEreaseBkgnd{return 0;}等等方法也无效!
3、应该也不是资源释放引起的没法子了,请大家指点一下,谢谢!

解决方案 »

  1.   

    父窗口有WS_CLIPCHILDREN风格没有呢?
      

  2.   

    获得PictureControl句柄指针,然后在OnPaint中画
      

  3.   

    代码。是不是没有使用CPaintDC dc(this)获取的DC句柄而是自己用GetDC()获取的?
      

  4.   

    谢谢各位的回复1、是在OnPaint中调用的
    2、刚设置了WS_CLIPCHILDREN,但其它窗口移过后只有控件刷新,子对话框不刷新了,要最小化/最大化再能恢复
    3、用的是:Graphics gPic(this->GetDlgItem(IDC_PIC)->GetDC()->m_hDC);获得名柄,也试过CDC * pDC(this->GetDlgItem(IDC_PIC)->GetDC());gPic=pDC->GetSafeHDC();也是不行
      

  5.   

    请问Mackz,使用CPaintDC dc(this)获取的DC句柄和自己用GetDC()获取的有什么区别呢?
      

  6.   

    CPaintDC仅仅用于WM_PAINT消息,通过BeginPaint调用获取并锁住DC,通过EndPaint解锁,解锁后才真正把更新的内容绘制到屏幕等输出设备。
    GetDC仅仅获得DC句柄。
      

  7.   

    有点进展了,在子对话框中加入Timer,Timer中调用this->Invalidate();或this->OnPaint();可以将新图片刷上,但每次都是在旧图片上重叠,为什么不是清空PictureControl再刷出一个新图呢?同样只要移动程序主窗口,或用其它程序窗口覆盖一下就刷成新图了。用Spy++看了子对话框和PictureControl的消息,当其它程序窗口覆盖住并移开时会产生WM_PAINT、WM_ERASEBKGND消息,同样在Timer中调用Invalidate()也产了这两个消息,为什么结果却不同呢?
      

  8.   

    你要在PictureControl上画图,最好重载一个CStatic类,在其中的OnPaint中绘制。
      

  9.   

    "你要在PictureControl上画图,最好重载一个CStatic类,在其中的OnPaint中绘制。"----我也试下看看
      

  10.   

    问题是解决了,主要原因应该是没有收到WM_PAINT消息,加Timer定时发就可以了。其实一般情况下是不会出现这种现象的,可能是因为我用了好几个其它的界面/控件类引起的。好了,结贴