请教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、应该也不是资源释放引起的

没法子了,请大家指点一下,谢谢!
...全文
551 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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中画
回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2008-06-11 11:59
社区公告
暂无公告