哪位大哥有完美的重绘标题栏的方案啊!
最近被标题栏搞的很郁闷,自绘的标题栏存在很多问题:1:几个系统按钮,特别是关闭按钮搞不定,XP下老现出原型,去掉系统菜单却去掉了很多想保留的功能,如果去掉了任务栏的右键菜单也没了。2:闪烁的问题,用了双缓存给标题栏贴位图,当调整窗口大小和拖动窗口的时候会闪,2000的系统有虚线框所以不闪烁,xp系统好像就有问题,调整大小的时候由于窗口没虚线框跟着不断调整大小,闪烁的厉害,特别是标题栏上自绘的位图按钮,和视图中的按钮等控件。3:当添加了一个退出判断的,即点击关闭按钮弹出一个对话框提示,此时主窗口失去焦点,标题栏会变灰,因此重绘了一次,标题栏会闪烁一下,单得到焦点时候同样闪烁一下,想拦截是标题栏变灰的消息,然后使之失去焦点时候不变灰,不知道怎么作。哪位大哥有做过类似标题栏自绘的,指点指点迷津,定给高分咯!
最近被标题栏搞的很郁闷,自绘的标题栏存在很多问题:1:几个系统按钮,特别是关闭按钮搞不定,XP下老现出原型,去掉系统菜单却去掉了很多想保留的功能,如果去掉了任务栏的右键菜单也没了。2:闪烁的问题,用了双缓存给标题栏贴位图,当调整窗口大小和拖动窗口的时候会闪,2000的系统有虚线框所以不闪烁,xp系统好像就有问题,调整大小的时候由于窗口没虚线框跟着不断调整大小,闪烁的厉害,特别是标题栏上自绘的位图按钮,和视图中的按钮等控件。3:当添加了一个退出判断的,即点击关闭按钮弹出一个对话框提示,此时主窗口失去焦点,标题栏会变灰,因此重绘了一次,标题栏会闪烁一下,单得到焦点时候同样闪烁一下,想拦截是标题栏变灰的消息,然后使之失去焦点时候不变灰,不知道怎么作。哪位大哥有做过类似标题栏自绘的,指点指点迷津,定给高分咯!
解决方案 »
- IWebBrowser2 navigate同步问题
- 如何获得mfc活动窗口的m_hWnd,不是传值。如获取最顶的模态窗口CDialog的m_hWnd。
- ping的应用-服务器选择
- vc6写dll时dllmain函数在哪里?
- 关于断点续传的一个小疑问
- 要份DDE通信的例程
- 如何加欢迎画面
- 小弟出学VC编程有一事不明,请大家帮忙!
- CEdit设为ES_AUTOHSCROLL后,一卷屏就是10个字,能不能改成1个字?
- 私有成员保护的问题
- 关于vc中读取obj文件的的问题?
- 投递 WSARecv 时,返回错误,WSAGetLastError() 得到6,是 INVALID SOCKET HANDLE!?
1。 你需要处理WM_NC*等一系列的消息和WM_SETCURSOR消息,如果有的消息没有处理好的话,默认的处理就会被调用,就会处理系统默认的画法。
2。窗口调整大小的时候,可以让它跟着鼠标拖动而调整,也可以在鼠标松开的时候再调整。
3。你需要处理WM_NCACTIVE和WM_ACTIVE消息。
http://www.codeproject.com/dialog/skinedcaptionbars.asp
这两篇文章应该能解决你的问题
3。你需要处理WM_NCACTIVE和WM_ACTIVE消息第2条 这个要怎么作,2000的系统是鼠标松开的时候再调整,而xp却是跟着鼠标拖动而调整,
我想让xp也是鼠标松开的时候再调整,怎么办?我主要是因为我自绘了标题栏,如果跟着鼠标拖动而调整的话原先的标题栏会一闪一闪的显示出来。
2:闪烁不是双缓存问题,是在画标题栏时,先CDialog::OnNcPaint然后再画你自己的标题栏引起的,解决办法:把这个函数重写,不要调用CDialog::OnNcPaint这个方法,标题栏就不会闪了。对于那几个按钮,这样处理了也不会觉得闪。
3:光处理WM_NCPAINT不够,还要WM_NCACTIVATE,不然窗口一失去焦点就原形毕露。
综合后两条,可以重写DefWindowProc,然后把WM_NCPAINT,WM_NCACTIVATE一起重写。记得这个时候不要调用CDialog::OnNcPaint和CDialog::OnNcActivate
我这阵子也给这个东西弄得很郁闷。而且这样子做出来的标题栏还会有问题——如果你的标题栏上三个按钮在鼠标指向时会有高亮显示,这个时候要是鼠标移开了,那东西还是高亮的。如果是个普通控件,可以抓取鼠标,但是这回是NC,抓取鼠标后OnNcMouseMove不触发了,怎么办呢?
实际上,我们可以用API函数来解决此问题。首先将下面的代码放入窗体的声明段中:
'为指定窗体设置信息
Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
Private Const WS_SIZEBOX = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
然后在窗体的Load事件过程中添加如下代码:
Private Sub Form_Load()
Dim lStyle As Long
’为任务栏添加图标和系统菜单(仅关闭和移动两个菜单项有效)
lStyle = WS_SYSMENU
’使“大小”有效
lStyle = lStyle Or WS_SIZEBOX
’使“最大化”有效
lStyle = lStyle Or WS_MAXIMIZEBOX
’使“最小化”有效
lStyle = lStyle Or WS_MINIMIZEBOX
’确定以上设置
SetWindowLong hWnd, GWL_STYLE, lStyle
End Sub
运行后就会发现,在任务栏中标题和图标都有了,点击右键也出现了系统菜单,并且其效果与常规的基本一致。与常规窗口不同的有两个地方:一是窗口处于活动状态时,单击不能将其最小化,但用标题栏中的菜单最小化时单击任务栏能恢复。二是“关闭”功能失效,并且当改变了窗体大小时,窗体的效果由原来的平面变为3D,这时可用鼠标调整窗体大小。
急`,,,