哪位大哥有完美的重绘标题栏的方案啊!
最近被标题栏搞的很郁闷,自绘的标题栏存在很多问题:1:几个系统按钮,特别是关闭按钮搞不定,XP下老现出原型,去掉系统菜单却去掉了很多想保留的功能,如果去掉了任务栏的右键菜单也没了。2:闪烁的问题,用了双缓存给标题栏贴位图,当调整窗口大小和拖动窗口的时候会闪,2000的系统有虚线框所以不闪烁,xp系统好像就有问题,调整大小的时候由于窗口没虚线框跟着不断调整大小,闪烁的厉害,特别是标题栏上自绘的位图按钮,和视图中的按钮等控件。3:当添加了一个退出判断的,即点击关闭按钮弹出一个对话框提示,此时主窗口失去焦点,标题栏会变灰,因此重绘了一次,标题栏会闪烁一下,单得到焦点时候同样闪烁一下,想拦截是标题栏变灰的消息,然后使之失去焦点时候不变灰,不知道怎么作。哪位大哥有做过类似标题栏自绘的,指点指点迷津,定给高分咯!

解决方案 »

  1.   

    补充一点:我是在 SDI 的CMainFrame中重载函数来实现的。
      

  2.   

    http://www.cppblog.com/wlwlxj/archive/2007/03/26/20619.html
      

  3.   

    网上应该有很多这样的例子,简单的回答一下你的问题:
    1。 你需要处理WM_NC*等一系列的消息和WM_SETCURSOR消息,如果有的消息没有处理好的话,默认的处理就会被调用,就会处理系统默认的画法。
    2。窗口调整大小的时候,可以让它跟着鼠标拖动而调整,也可以在鼠标松开的时候再调整。
    3。你需要处理WM_NCACTIVE和WM_ACTIVE消息。
      

  4.   

    http://www.codeproject.com/buttonctrl/CCaptionButton.asp
    http://www.codeproject.com/dialog/skinedcaptionbars.asp
    这两篇文章应该能解决你的问题
      

  5.   

    tszzp(神奇):2。窗口调整大小的时候,可以让它跟着鼠标拖动而调整,也可以在鼠标松开的时候再调整。
    3。你需要处理WM_NCACTIVE和WM_ACTIVE消息第2条 这个要怎么作,2000的系统是鼠标松开的时候再调整,而xp却是跟着鼠标拖动而调整,
          我想让xp也是鼠标松开的时候再调整,怎么办?我主要是因为我自绘了标题栏,如果跟着鼠标拖动而调整的话原先的标题栏会一闪一闪的显示出来。
      

  6.   

    http://m2.tech.topzj.com/thread-11465-1-1.html
      

  7.   

    楼上的,那个网站下载要金币,你有没有直接传我一份  [email protected]
      

  8.   

    DrawMenuBar()这个函数可以对标题栏进行重绘
      

  9.   

    1:去掉系统菜单,至于你想要的那些功能,即使没有系统菜单的窗口也可以弹出系统菜单,代码只有VB的,如下。
    2:闪烁不是双缓存问题,是在画标题栏时,先CDialog::OnNcPaint然后再画你自己的标题栏引起的,解决办法:把这个函数重写,不要调用CDialog::OnNcPaint这个方法,标题栏就不会闪了。对于那几个按钮,这样处理了也不会觉得闪。
    3:光处理WM_NCPAINT不够,还要WM_NCACTIVATE,不然窗口一失去焦点就原形毕露。
    综合后两条,可以重写DefWindowProc,然后把WM_NCPAINT,WM_NCACTIVATE一起重写。记得这个时候不要调用CDialog::OnNcPaint和CDialog::OnNcActivate
    我这阵子也给这个东西弄得很郁闷。而且这样子做出来的标题栏还会有问题——如果你的标题栏上三个按钮在鼠标指向时会有高亮显示,这个时候要是鼠标移开了,那东西还是高亮的。如果是个普通控件,可以抓取鼠标,但是这回是NC,抓取鼠标后OnNcMouseMove不触发了,怎么办呢?
      

  10.   

    默认情况下,无边框窗体不在任务栏中显示图标。一般情况下,要使它能在任务栏中显示,只要将其ShowInTaskbar属性设为True。但此时只有标题没有图标,而且,通常情况下的任务栏中鼠标右键的系统菜单也没有。 
    实际上,我们可以用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,这时可用鼠标调整窗体大小。
      

  11.   

    版主,有你这个程序的源码嘛,有请共享下,发到[email protected].谢谢,
    急`,,,
      

  12.   

    可以看一下vckbase中的一个标题栏重绘的例子,有Dlg版本和SDI版本的http://www.vckbase.com/document/viewdoc/?id=317