重画标题栏问题

「已注销」 2012-08-24 05:17:06
我需要重绘标题栏,从网上找了些资料,找到一个比较好的,并且有源码。我看上面的效果不错,如下图:

但是我运行完是下面这样:

我发现就是在我重绘的标题栏的上面,系统又绘制了一个默认的标题栏,把我原来的给覆盖了。但是我点击最大化最小化关闭按钮那没有完全覆盖的地方,就是我重绘的,功能是可以实现的。
我调过窗体的标题栏的情况,就是border属性,如果把标题栏调为none,也就是没有边框,我绘制的边框就会出来,但是点击上面,不反映了,也就是虽然我的重绘函数是成功了,但是系统dialog的边框是没有的,所以我仅仅是在标题栏的地方绘制了一个图片,并没有实际功能。
我看了一下这个重绘工程的构造,就是在dialog cpp里面又重构了DefWindowProc,调用了自己写的画标题栏的函数
请问大神是哪里出了问题。
...全文
331 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
行走在时间里 2015-02-18
  • 打赏
  • 举报
回复
将自带的标题栏去掉,然后在客户区绘制关闭,最大化,最小化按钮,生成一个假象的标题栏,在按钮里添加相应的响应函数就可以了,最后记得让窗口可移动
「已注销」 2012-08-27
  • 打赏
  • 举报
回复
在在win7更高版本下,窗口的绘制的逻辑和xp有差别,所以在xp下可以重绘标题栏,到win7下就会加一层win7的半透明边框。具体解决方法不知道。所以改方法,去掉标题栏,自己用控件模拟一个。
yangwen0953 2012-08-27
  • 打赏
  • 举报
回复
要覆盖标题栏(非隐藏),得把标题栏上面分成三个部分的图,左边圆角部分,中间部分(用于变换对话大小),右边按钮部分
重载WINDOWPROC(HWND hWnd ,UINT Msg ,WPARAM wParam ,LPARAM lParam)
{
switch(Msg)
{
case WM_PAINT://绘制客户区
case WM_NCACTIVAVE://处理窗口激活 OR !激活消息
case WM_MOUSEMOVE://客户区鼠标移动消息
case WM_NCMOUSEMOVE://非户区(标题栏、菜单栏)鼠标移动消息
case WM_NCLBUTTONDOWN://同上,单击消息
case WM_NCPAINT://非客户区
case WM_SIZE://窗口变话大小消息
default:
}

}
最大化窗口后重绘时,得重新计算出标题栏图片中间部分的宽度,也就是GetWindowRect出来的宽,再减去左部分和右部分,改变中间部的宽度再画。
「已注销」 2012-08-26
  • 打赏
  • 举报
回复
还有人能帮帮我吗,给个小例子也行
sumos 2012-08-26
  • 打赏
  • 举报
回复
大多数人觉得标题栏不好绘制的原因在于拖动caption时控制比较麻烦。因为我们的这个caption是虚拟的。其实可以这么做,响应NCHITTEST消息,返回HTCAPTION,这样整个窗口都可以拖动了。
schlafenhamster 2012-08-25
  • 打赏
  • 举报
回复
WM_NCPAINT ?
schlafenhamster 2012-08-25
  • 打赏
  • 举报
回复
WM_NCPAINT ?
傻X 2012-08-25
  • 打赏
  • 举报
回复
我前阵子刚实现了BCG的效果的Dialog,楼主有兴趣可以讨论下,私信我。
我就是把标题栏重绘的。当然像QQ那种把标题栏隐藏,在View中重绘一部分标题栏的也大有人在,原因就是好控制。
傻X 2012-08-25
  • 打赏
  • 举报
回复
我前阵子刚实现了BCG的效果的Dialog,楼主有兴趣可以讨论下,私信我。
我就是把标题栏重绘的。当然像QQ那种把标题栏隐藏,在View中重绘一部分标题栏的也大有人在,原因就是好控制。
「已注销」 2012-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

不要border,不要标题栏,只剩下一块布了。
看看QQ登录界面,根本不是重绘标题栏。
[/Quote]
你的意思是直接用剩下的部分模拟标题栏的效果?
sumos 2012-08-24
  • 打赏
  • 举报
回复
不要border,不要标题栏,只剩下一块布了。
看看QQ登录界面,根本不是重绘标题栏。
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

对话框默认是不重绘的,最简单的就是用timer你可以在initdlg后面加个settimer(1,50,NULL);然后添加个消息WM_TIMER 在这个消息里面调用Onpaint();就会每50毫秒刷新一次你绘制的东西,你只需要在你的Draw函数里操作该画哪个哪个了
[/Quote]
你那方法不行。我试了,还是被覆盖了,不是你说的那样。其实我是重写了绘制标题栏的函数,调用的就是我那个。被覆盖估计是别的原因
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
哪位大神知道如何重绘标题栏
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

对话框默认是不重绘的,最简单的就是用timer你可以在initdlg后面加个settimer(1,50,NULL);然后添加个消息WM_TIMER 在这个消息里面调用Onpaint();就会每50毫秒刷新一次你绘制的东西,你只需要在你的Draw函数里操作该画哪个哪个了
[/Quote]
要这么麻烦?那如果我要的dialog的风格比较炫一点,那只能在timer里面不断的重画?那不太影响性能了吗
liuandsky 2012-08-24
  • 打赏
  • 举报
回复
对话框默认是不重绘的,最简单的就是用timer你可以在initdlg后面加个settimer(1,50,NULL);然后添加个消息WM_TIMER 在这个消息里面调用Onpaint();就会每50毫秒刷新一次你绘制的东西,你只需要在你的Draw函数里操作该画哪个哪个了
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
郁闷怎么上传图片,这是第一个连接
http://my.csdn.net/my/album/detail/1266450

这是第二个连接
http://my.csdn.net/my/album/detail/1266450#1266449

我用的环境是win7 vs2010

15,979

社区成员

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

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