还是onpaint重绘问题

silentyear 2011-08-01 07:50:05
我建立了一个基于dialog的程序a,为了让程序保持重绘,我将用于在屏幕上进行绘制的功能块a放在对话框的onpaint函数体内,但是我发现有两个问题:
1、程序刚刚启动时,并没有绘制的效果,要动一下对话框才能进行显示。
2、我最大化另一个程序窗口b将a遮盖住,再最小化化窗口b,此时a也不能进行正常的重绘。
请问高手,是什么原因?非常感谢啊,困扰我好久了。。。
...全文
339 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
silentyear 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gz_qmc 的回复:]
http://www.chinahtml.com/0607/csharp-11537062385185.html
百度多了,你就知道了
[/Quote]
谢谢你~
先工作去了,顺便调试
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
http://www.chinahtml.com/0607/csharp-11537062385185.html
百度多了,你就知道了
silentyear 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gz_qmc 的回复:]
在OnPaint里,请保持
CPaintDC dc(this);

但不要用dc绘图,因为dc是带剪裁的,遮盖后有刷新不到的问题
CDC *pDC=GetDC();
用pDC直接绘制到窗口

另外,要检去有效区,去掉控件占的位置(提倡)
或者,OnPaint结束的时候刷新所有控件(不提倡)
[/Quote]

谢谢你,我去试试看,另外,怎么减去有效区(控件占的位置)啊?
silentyear 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
应该是你的操作方式有问题
你OnPaint里怎么处理的
[/Quote]
我的onpaint里代码如下:
if()
{

}
else
{
cpaint dc(this);
dc.textout(20,20,"why ???");
cdialog::onpaint();
}
当我用另一个窗口b进行遮盖此窗口a,再最小化b后a上就没法输出字符串“why???”
silentyear 2011-08-02
  • 打赏
  • 举报
回复
程序在启动到画面呈出来首先肯定是经过OnPaint的,没有绘制的效果,只能说明你没绘制好。==
===
谢谢啊,对话框程序启动时,先执行inital,再执行onpaint么?我刚开始也这么认为,现在我怀疑启动时执行还是不执行onpaint了。。。
求高手解决啊
走好每一步 2011-08-02
  • 打赏
  • 举报
回复
无代码,无真相
向立天 2011-08-02
  • 打赏
  • 举报
回复
应该是你的操作方式有问题
你OnPaint里怎么处理的
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
补充:
去掉OnPain()里的
CDialog::OnPain()
gz_qmc 2011-08-02
  • 打赏
  • 举报
回复
在OnPaint里,请保持
CPaintDC dc(this);

但不要用dc绘图,因为dc是带剪裁的,遮盖后有刷新不到的问题
CDC *pDC=GetDC();
用pDC直接绘制到窗口

另外,要检去有效区,去掉控件占的位置(提倡)
或者,OnPaint结束的时候刷新所有控件(不提倡)
gibsonboy 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 silentyear 的回复:]

程序在启动到画面呈出来首先肯定是经过OnPaint的,没有绘制的效果,只能说明你没绘制好。==
===
谢谢啊,对话框程序启动时,先执行inital,再执行onpaint么?我刚开始也这么认为,现在我怀疑启动时执行还是不执行onpaint了。。。
求高手解决啊
[/Quote]
程序启动时OnInitDlg肯定比OnPaint先执行,问题是,你着重讲的是重绘问题,跟Init有关系,但不大,照你这么说,构造函数比Init先执行这也要强调出来了。你怀疑启动时执行还是不执行onpaint了,你在OnPaint下个断点进去调试不就知道了。我不是高手,但是你没贴码,估计再怎么高的手都够不着你了。
向立天 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 silentyear 的回复:]

引用 11 楼 xianglitian 的回复:
应该是你的操作方式有问题
你OnPaint里怎么处理的

我的onpaint里代码如下:
if()
{

}
else
{
cpaint dc(this);
dc.textout(20,20,"why ???");
cdialog::onpaint();
}
当我用另一个窗口b进行遮盖此窗口a,再最小化……
[/Quote]不要调用基类的OnPaint
gibsonboy 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 silentyear 的回复:]
我建立了一个基于dialog的程序a,为了让程序保持重绘,我将用于在屏幕上进行绘制的功能块a放在对话框的onpaint函数体内,但是我发现有两个问题:
1、程序刚刚启动时,并没有绘制的效果,要动一下对话框才能进行显示。
2、我最大化另一个程序窗口b将a遮盖住,再最小化化窗口b,此时a也不能进行正常的重绘。
请问高手,是什么原因?非常感谢啊,困扰我好久了。。。
[/Quote]
程序在启动到画面呈出来首先肯定是经过OnPaint的,没有绘制的效果,只能说明你没绘制好。
动一下才能显示,实际上触发OnSize,OnSize再MoveWindow,接着再调用OnPaint。将另外一个程序盖住它,再显示,这里只会触发窗口重绘,也就是再次调用OnPaint,但是并没有绘制出来...
因为你没贴代码,所以不知道你是怎么画的,但是希望通过我所说的这两点,能够给你提示些信息...
我才是心翼 2011-08-01
  • 打赏
  • 举报
回复
切换窗口的时候,窗体一样会发生重绘的
我才是心翼 2011-08-01
  • 打赏
  • 举报
回复
oninitialupdate函数是个虚函数吧,要你自己重载的,它是在OnDraw函数以前被调用的,你可以手动加。dialog估计也行吧
silentyear 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 doctorwing 的回复:]
写在OnInitialUpdate()试试
[/Quote]
啊,我的程序是基于dialog的,主窗体应该就是对话框。。。没有oninitialupdate函数。。。
我才是心翼 2011-08-01
  • 打赏
  • 举报
回复
写在OnInitialUpdate()试试
我才是心翼 2011-08-01
  • 打赏
  • 举报
回复
1、动一下就是重绘,刚启动没有。刚启动的OnPaint()是给的对话框么还是主窗体?你动对话框,当然就是对话框响应WM_PAINT消息了
2、这个盖来盖去的问题,应该还是和VIEW类有关,就好像在VIEW上面打字,输入法的框子挡住了,一样出不来汉字是一个道理。

个人意见仅供参考 如有雷同实属巧合

15,979

社区成员

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

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