请教GDI+在PictureControl上画图不刷新的问题

xmxjh 2008-06-11 11:59:08
在对话框程序上放了一个TabCtrl,tab控件用的是vckbase上的CCoolTabControl。在Tab控件内再放了一个子对话框。在子对话框的OnPaint事件中写了一段GDI+的代码,实现子对话框上一个PictureControl内画横、竖几条线。现在问题是画完后没有刷新!要移动一下程序主窗口或被其它程序窗口覆盖一下才会刷新。

我试了:
1、画完后,我弹出自已的About窗口盖住picturecontrol再移开,Picture没有刷新。我又在代码中移了旁边一Static控件盖住再移开也没有刷新,但是用其它程序的窗体盖住移开就会刷新!
2、搜了很多关于GDI+、窗体刷新的贴子,并尝试其中提到的Invalidate(),InvalidateRect(),UpdateWindow,RedrawWindow,OnEreaseBkgnd{return 0;}等等方法也无效!
3、应该也不是资源释放引起的

没法子了,请大家指点一下,谢谢!
...全文
690 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmxjh 2008-06-13
  • 打赏
  • 举报
回复
问题是解决了,主要原因应该是没有收到WM_PAINT消息,加Timer定时发就可以了。

其实一般情况下是不会出现这种现象的,可能是因为我用了好几个其它的界面/控件类引起的。

好了,结贴
菜牛 2008-06-12
  • 打赏
  • 举报
回复
你要在PictureControl上画图,最好重载一个CStatic类,在其中的OnPaint中绘制。
xmxjh 2008-06-12
  • 打赏
  • 举报
回复
有点进展了,在子对话框中加入Timer,Timer中调用this->Invalidate();或this->OnPaint();可以将新图片刷上,但每次都是在旧图片上重叠,为什么不是清空PictureControl再刷出一个新图呢?

同样只要移动程序主窗口,或用其它程序窗口覆盖一下就刷成新图了。

用Spy++看了子对话框和PictureControl的消息,当其它程序窗口覆盖住并移开时会产生WM_PAINT、WM_ERASEBKGND消息,同样在Timer中调用Invalidate()也产了这两个消息,为什么结果却不同呢?
xmxjh 2008-06-12
  • 打赏
  • 举报
回复
"你要在PictureControl上画图,最好重载一个CStatic类,在其中的OnPaint中绘制。"

----我也试下看看
jameshooo 2008-06-11
  • 打赏
  • 举报
回复
绘制操作是在绘制消息里面调用的吗?
pomelowu 2008-06-11
  • 打赏
  • 举报
回复
父窗口有WS_CLIPCHILDREN风格没有呢?
jameshooo 2008-06-11
  • 打赏
  • 举报
回复
CPaintDC仅仅用于WM_PAINT消息,通过BeginPaint调用获取并锁住DC,通过EndPaint解锁,解锁后才真正把更新的内容绘制到屏幕等输出设备。
GetDC仅仅获得DC句柄。
xmxjh 2008-06-11
  • 打赏
  • 举报
回复
请问Mackz,使用CPaintDC dc(this)获取的DC句柄和自己用GetDC()获取的有什么区别呢?
xmxjh 2008-06-11
  • 打赏
  • 举报
回复
谢谢各位的回复

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();也是不行
菜牛 2008-06-11
  • 打赏
  • 举报
回复
代码。是不是没有使用CPaintDC dc(this)获取的DC句柄而是自己用GetDC()获取的?
scq2099yt 2008-06-11
  • 打赏
  • 举报
回复
获得PictureControl句柄指针,然后在OnPaint中画

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧