重绘的标题栏如何防止卡死变色

云满笔记 2013-08-16 04:40:09
本人重绘了标题栏,用的框架是WTL,先不管是MFC还是WTL,我都发现一个问题,就是重绘以后,正常情况下有点闪烁的感觉,就是不大明显,不仔细看瞧不出来,但有一个很致命的问题,就是一旦程序卡死的时候,比如 while(1); 的时候标题栏又会变回原来的,而我看过其它的界面库,它们绘出来的标题栏在卡死的时候不会“被打回原形”,这是为什么呢?我用到的原理就是网上介绍的响应重绘事件,如NC_PAINT,NC_...等,为什么我的程序会跟它们有差别呢?求指教,这回估计真的要高手了,求高手路过
...全文
289 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
云满笔记 2013-08-20
  • 打赏
  • 举报
回复
引用 14 楼 jerry_dqh 的回复:
其实我认为你不需要考虑卡死打回原形的问题,重要的是还是你处理消息的方式。为啥你的程序会卡死,是否需要将卡的地方再起一个线程。还有你说会有点闪烁,这感觉也不正常,正常不应该闪烁,因为windows并不会每时每刻都在发nc_paint消息。只有窗口变化,或者激活窗口,去激活窗口等情况下才应该发消息。所以正常情况下你发现闪烁,你就要看一下你的程序是否有问题了。 对于打回原形,其实在有些你不知道情况下又重新制标题了。windows不仅在收到nc_paint时绘制了标题栏,还有可能在激活,nc_ncactive等消息中也绘制了,可能你没有响应全,windows有时就是这样令人无法讨厌。不过我感觉这些不是重点,重点还是你自己程序是否有响应消息的瓶颈,导致卡死。
谢谢了 老兄
云满笔记 2013-08-20
  • 打赏
  • 举报
回复
引用 14 楼 jerry_dqh 的回复:
其实我认为你不需要考虑卡死打回原形的问题,重要的是还是你处理消息的方式。为啥你的程序会卡死,是否需要将卡的地方再起一个线程。还有你说会有点闪烁,这感觉也不正常,正常不应该闪烁,因为windows并不会每时每刻都在发nc_paint消息。只有窗口变化,或者激活窗口,去激活窗口等情况下才应该发消息。所以正常情况下你发现闪烁,你就要看一下你的程序是否有问题了。 对于打回原形,其实在有些你不知道情况下又重新制标题了。windows不仅在收到nc_paint时绘制了标题栏,还有可能在激活,nc_ncactive等消息中也绘制了,可能你没有响应全,windows有时就是这样令人无法讨厌。不过我感觉这些不是重点,重点还是你自己程序是否有响应消息的瓶颈,导致卡死。
谢谢了 老史
云满笔记 2013-08-20
  • 打赏
  • 举报
回复
好吧 结贴了
碼上道 2013-08-20
  • 打赏
  • 举报
回复
其实我认为你不需要考虑卡死打回原形的问题,重要的是还是你处理消息的方式。为啥你的程序会卡死,是否需要将卡的地方再起一个线程。还有你说会有点闪烁,这感觉也不正常,正常不应该闪烁,因为windows并不会每时每刻都在发nc_paint消息。只有窗口变化,或者激活窗口,去激活窗口等情况下才应该发消息。所以正常情况下你发现闪烁,你就要看一下你的程序是否有问题了。 对于打回原形,其实在有些你不知道情况下又重新制标题了。windows不仅在收到nc_paint时绘制了标题栏,还有可能在激活,nc_ncactive等消息中也绘制了,可能你没有响应全,windows有时就是这样令人无法讨厌。不过我感觉这些不是重点,重点还是你自己程序是否有响应消息的瓶颈,导致卡死。
云满笔记 2013-08-20
  • 打赏
  • 举报
回复
引用 12 楼 jerry_dqh 的回复:
引用 11 楼 wan212000 的回复:
[quote=引用 2 楼 jerry_dqh 的回复:] NC_PAINT消息我估计均是会卡死的感觉,有可能有些界面实际把标题栏隐藏了,实际的标题栏是客户区伪造了一个,你用spy++探看一下
用spy++怎么判断啊 我试过了 是同一个类 这怎么算??
看看窗口属性有没有WS_cation那个属性[/quote]我测试了,测的是PhotoShop CS6 Extended,它有WS_CAPTION属性,但是问题是它在卡死的时候不会出现“打回原形”的情况,不知道它是怎么实现的,你知道吗
碼上道 2013-08-19
  • 打赏
  • 举报
回复
引用 11 楼 wan212000 的回复:
引用 2 楼 jerry_dqh 的回复:
NC_PAINT消息我估计均是会卡死的感觉,有可能有些界面实际把标题栏隐藏了,实际的标题栏是客户区伪造了一个,你用spy++探看一下
用spy++怎么判断啊 我试过了 是同一个类 这怎么算??
看看窗口属性有没有WS_cation那个属性
云满笔记 2013-08-18
  • 打赏
  • 举报
回复
引用 2 楼 jerry_dqh 的回复:
NC_PAINT消息我估计均是会卡死的感觉,有可能有些界面实际把标题栏隐藏了,实际的标题栏是客户区伪造了一个,你用spy++探看一下
用spy++怎么判断啊 我试过了 是同一个类 这怎么算??
gfm688 2013-08-17
  • 打赏
  • 举报
回复
hook DrawCaption 估计可以
qicaofeng 2013-08-17
  • 打赏
  • 举报
回复
引用 2 楼 jerry_dqh 的回复:
NC_PAINT消息我估计均是会卡死的感觉,有可能有些界面实际把标题栏隐藏了,实际的标题栏是客户区伪造了一个,你用spy++探看一下
同意
gfm688 2013-08-17
  • 打赏
  • 举报
回复
ModifyStyle( WS_CAPTION, 0, SWP_FRAMECHANGED );
云满笔记 2013-08-17
  • 打赏
  • 举报
回复
引用 3 楼 zjh824 的回复:
想做好都是不用标题栏,然后自己处理消息做的。
还有,还有,怎么去掉标题栏,是通过代码实现吗,那代码怎么实现,还是直接设置一下对话框属性,如果是MainFrm形式的窗口呢,怎么去掉标题栏
云满笔记 2013-08-17
  • 打赏
  • 举报
回复
引用 3 楼 zjh824 的回复:
想做好都是不用标题栏,然后自己处理消息做的。
去掉了标题栏会对原来的程序造成什么样的影响呢?
云满笔记 2013-08-17
  • 打赏
  • 举报
回复
引用 4 楼 hlk858 的回复:
可能阻塞(卡死)的代码段放在线程里。
你这话是什么意思,看不懂啊,我的问题是为什么标题栏卡死后会“打回原形”显示原来的标题栏颜色
我可以说脏话 2013-08-16
  • 打赏
  • 举报
回复
可能阻塞(卡死)的代码段放在线程里。
zjh824 2013-08-16
  • 打赏
  • 举报
回复
想做好都是不用标题栏,然后自己处理消息做的。
碼上道 2013-08-16
  • 打赏
  • 举报
回复
NC_PAINT消息我估计均是会卡死的感觉,有可能有些界面实际把标题栏隐藏了,实际的标题栏是客户区伪造了一个,你用spy++探看一下
云满笔记 2013-08-16
  • 打赏
  • 举报
回复
求高手路过

15,979

社区成员

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

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