Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long还是用这个函数改标题吧
以前曾经制作过一个类似最小化按钮之类的例子,现找出代码贴出来包含一个模块文件 & 一个窗体文件 模块文件如下: ''''*********************************************** '''制造一个自己的标题栏类按钮(重画效果显示).... '''2003/09/09, by spyway[落叶谍]........Option ExplicitPublic Const WM_NCPAINT = &H85Public Const BDR_SUNKEN = &HA Public Const BDR_SUNKENINNER = &H8 Public Const BDR_SUNKENOUTER = &H2 Public Const BDR_RAISEDOUTER = &H1 Public Const BDR_RAISEDINNER = &H4 Public Const BDR_RAISED = &H5 Public Const BDR_OUTER = &H3 Public Const BDR_INNER = &HC Public Const EDGE_BUMP& = &H9& Public Const EDGE_ETCHED& = &H6& Public Const EDGE_RAISED& = &H5& Public Const EDGE_SUNKEN& = &HA&Public Const BF_LEFT = &H1 Public Const BF_TOP = &H2 Public Const BF_BOTTOM = &H8 Public Const BF_RIGHT = &H4 Public Const BF_DIAGONAL = &H10 Public Const BF_MIDDLE = &H800 Public Const BF_SOFT = &H1000 Public Const BF_ADJUST = &H2000 Public Const BF_FLAT = &H4000 Public Const BF_MONO = &H8000 Public Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) Public Const BF_TOPLEFT = (BF_TOP Or BF_LEFT) Public Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT) Public Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT) Public Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT) Public Const BF_DIAGONAL_ENDBOTTOMLEFT = (BF_DIAGONAL Or BF_BOTTOM Or BF_LEFT) Public Const BF_DIAGONAL_ENDBOTTOMRIGHT = (BF_DIAGONAL Or BF_BOTTOM Or BF_RIGHT) Public Const BF_DIAGONAL_ENDTOPRIGHT = (BF_DIAGONAL Or BF_TOP Or BF_RIGHT)Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePublic Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long Public Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long Public Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As LongPrivate varShowText() ''标题栏显示字符数组变量''重画标题栏函数: PaintRect() 参数如下() ''intRectW,intRectH : 按钮宽度&按钮高度 ''intStartPos :从关闭按钮右边到最小化按钮左边的距离(不好理解,自己试几次就知道了) ''intT%, intB% :按钮上部,按钮下部 ''intFormWidth :要画按钮的窗体宽度 ''HndForm: :要画按钮的窗体句柄变量 ''LngCaptionDc: 标题栏的场景变量Public Sub PaintRect(blnIsRect As Boolean, intRectW%, intRectH%, intStartPos%, _ intTop%, intFormWidth%, HndForm&, RectStyle&) Dim objPaintRect As RECT ''标题栏按钮的矩形对象 Dim lngCaptiondc As Long Dim lngShowFlag As Long Dim iloop%, intRectNum%: intRectNum = UBound(varShowText) - 1
lngShowFlag = BF_RECT Or BF_SOFT Or BF_MIDDLE lngShowFlag = IIf(blnIsRect, lngShowFlag Or BF_FLAT, lngShowFlag) lngCaptiondc = GetWindowDC(HndForm)
For iloop = 0 To intRectNum With objPaintRect .Right = intFormWidth / Screen.TwipsPerPixelX - intStartPos - iloop * intRectW .Left = .Right - intRectW .Top = intTop .Bottom = intTop + intRectH End With SetBkMode lngCaptiondc, 1 DrawEdge lngCaptiondc, objPaintRect, &H9, lngShowFlag DrawText lngCaptiondc, varShowText(intRectNum - iloop), -1, objPaintRect, &H1 Next End Sub''将一个字符串分解成单个字符,这些字符将在标题栏上的按钮上显示, Public Sub ShowTextConversion(blnPureDigital As Boolean, strShowText As String) Dim iloop%, intLen As Integer Dim douDigital As Double Dim intTextLength As Long ''要显示的字符串的长度 intTextLength = Len(strShowText) intLen = intTextLength - 1 ReDim varShowText(intTextLength) If blnPureDigital Then douDigital = Val(strShowText) For iloop = 0 To intLen varShowText(iloop) = Int((douDigital Mod (10 ^ (intTextLength - iloop))) / (10 ^ (intLen - iloop))) ''其实没有什么作用,我怀疑这样做不会带来性能上更多的优化... ''建议简单的用下面的.也好省掉blnpureDigital这个参数 ''2004/12/14 ..ADD Next Else For iloop = 0 To intTextLength varShowText(iloop) = Mid$(strShowText, iloop + 1, 1) Next End If End Sub ''///此函数必需重新修改,,做到简单,透明和直观''外界接口: ''显示文字,按钮数量,按钮大小,按钮位置,按钮风格,显示窗体句柄,窗体宽度 ''标题栏场景可用Getwindowdc(hndform)获得 窗体文件测试如下:窗体加入一个计时器Private Sub Timer1_Timer() CallPaintRect End SubPrivate Sub CallPaintRect() On Error Resume Next Dim i& ShowTextConversion False, "spyway" PaintRect False, 16, 14, 65, 6.5, Me.Width, Me.hwnd, GetWindowDC(hwnd) End Sub 'PS:这个模块中有二个函数,你可以自己加以修改... 'PS:没有用到的函数定义,常量,你可以删除 'PS:在此基础上你可以自己扩展其它功能,如左键按下时"按钮"的状态.图像 'PS:左键弹起里显示的图像...etc..
//你说的这种效果,我估计是这个窗体的标题拦是自己画的,呵呵,然后在上面增加了别针,最小化按钮等图片按钮的效果,如果不是这样的话估计很难做到弹出菜单后.怎样动态改变菜单文字?注意改变文字时,菜单不能消失掉.要动态的显示出来....
(比如就像显示进度条样的效果 OR Win2000启动时的效果)
//不怎么理解你的意思,不过要动态改变菜单文字还是好做的,可以使用下面的办法。首先假定你的菜单中有一项mnuItems,要在它的下面增加新的菜单项。你可以在菜单设计窗口中设定Index属性为0。然后,在程序中使用下面的代码就可以增加菜单项了:
Load mnuItems(1)
mnuItems(1).Caption = "Item 1"
mnuItems(1).Visible = True
理论上,也可以使用Windows API中的InsertMenu等函数添加菜单,但由于当用户选择菜单时,难以获得相应的消息(可以使用Message Blaster、MsgHook等控件或子类技术),所以很少使用。
至于动态改变文字..我是这个意思...我用了个计时器.想改变菜单上的文字.比如每0.1秒钟改变一次,就以显示时间为例吧可是不能直接显示出的菜单上文字,没有任何变化...就是不能及时刷新...菜单消失后,再次显示菜单..文字已经改变为现在的...当然还是不能及时改变...不过,我现在试了一下.发现可以改变的...以前在win98系统下确实没有变化...不知什么原因...
模块文件如下:
''''***********************************************
'''制造一个自己的标题栏类按钮(重画效果显示)....
'''2003/09/09, by spyway[落叶谍]........Option ExplicitPublic Const WM_NCPAINT = &H85Public Const BDR_SUNKEN = &HA
Public Const BDR_SUNKENINNER = &H8
Public Const BDR_SUNKENOUTER = &H2
Public Const BDR_RAISEDOUTER = &H1
Public Const BDR_RAISEDINNER = &H4
Public Const BDR_RAISED = &H5
Public Const BDR_OUTER = &H3
Public Const BDR_INNER = &HC
Public Const EDGE_BUMP& = &H9&
Public Const EDGE_ETCHED& = &H6&
Public Const EDGE_RAISED& = &H5&
Public Const EDGE_SUNKEN& = &HA&Public Const BF_LEFT = &H1
Public Const BF_TOP = &H2
Public Const BF_BOTTOM = &H8
Public Const BF_RIGHT = &H4
Public Const BF_DIAGONAL = &H10
Public Const BF_MIDDLE = &H800
Public Const BF_SOFT = &H1000
Public Const BF_ADJUST = &H2000
Public Const BF_FLAT = &H4000
Public Const BF_MONO = &H8000
Public Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
Public Const BF_TOPLEFT = (BF_TOP Or BF_LEFT)
Public Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT)
Public Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT)
Public Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT)
Public Const BF_DIAGONAL_ENDBOTTOMLEFT = (BF_DIAGONAL Or BF_BOTTOM Or BF_LEFT)
Public Const BF_DIAGONAL_ENDBOTTOMRIGHT = (BF_DIAGONAL Or BF_BOTTOM Or BF_RIGHT)
Public Const BF_DIAGONAL_ENDTOPRIGHT = (BF_DIAGONAL Or BF_TOP Or BF_RIGHT)Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePublic Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Public Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long
Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Public Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As LongPrivate varShowText() ''标题栏显示字符数组变量''重画标题栏函数: PaintRect() 参数如下()
''intRectW,intRectH : 按钮宽度&按钮高度
''intStartPos :从关闭按钮右边到最小化按钮左边的距离(不好理解,自己试几次就知道了)
''intT%, intB% :按钮上部,按钮下部
''intFormWidth :要画按钮的窗体宽度
''HndForm: :要画按钮的窗体句柄变量
''LngCaptionDc: 标题栏的场景变量Public Sub PaintRect(blnIsRect As Boolean, intRectW%, intRectH%, intStartPos%, _
intTop%, intFormWidth%, HndForm&, RectStyle&)
Dim objPaintRect As RECT ''标题栏按钮的矩形对象
Dim lngCaptiondc As Long
Dim lngShowFlag As Long
Dim iloop%, intRectNum%: intRectNum = UBound(varShowText) - 1
lngShowFlag = BF_RECT Or BF_SOFT Or BF_MIDDLE
lngShowFlag = IIf(blnIsRect, lngShowFlag Or BF_FLAT, lngShowFlag)
lngCaptiondc = GetWindowDC(HndForm)
For iloop = 0 To intRectNum
With objPaintRect
.Right = intFormWidth / Screen.TwipsPerPixelX - intStartPos - iloop * intRectW
.Left = .Right - intRectW
.Top = intTop
.Bottom = intTop + intRectH
End With
SetBkMode lngCaptiondc, 1
DrawEdge lngCaptiondc, objPaintRect, &H9, lngShowFlag
DrawText lngCaptiondc, varShowText(intRectNum - iloop), -1, objPaintRect, &H1
Next
End Sub''将一个字符串分解成单个字符,这些字符将在标题栏上的按钮上显示,
Public Sub ShowTextConversion(blnPureDigital As Boolean, strShowText As String)
Dim iloop%, intLen As Integer
Dim douDigital As Double
Dim intTextLength As Long ''要显示的字符串的长度
intTextLength = Len(strShowText)
intLen = intTextLength - 1
ReDim varShowText(intTextLength) If blnPureDigital Then
douDigital = Val(strShowText)
For iloop = 0 To intLen
varShowText(iloop) = Int((douDigital Mod (10 ^ (intTextLength - iloop))) / (10 ^ (intLen - iloop)))
''其实没有什么作用,我怀疑这样做不会带来性能上更多的优化...
''建议简单的用下面的.也好省掉blnpureDigital这个参数
''2004/12/14 ..ADD
Next
Else
For iloop = 0 To intTextLength
varShowText(iloop) = Mid$(strShowText, iloop + 1, 1)
Next
End If
End Sub
''///此函数必需重新修改,,做到简单,透明和直观''外界接口:
''显示文字,按钮数量,按钮大小,按钮位置,按钮风格,显示窗体句柄,窗体宽度
''标题栏场景可用Getwindowdc(hndform)获得
窗体文件测试如下:窗体加入一个计时器Private Sub Timer1_Timer()
CallPaintRect
End SubPrivate Sub CallPaintRect()
On Error Resume Next
Dim i&
ShowTextConversion False, "spyway"
PaintRect False, 16, 14, 65, 6.5, Me.Width, Me.hwnd, GetWindowDC(hwnd)
End Sub
'PS:这个模块中有二个函数,你可以自己加以修改...
'PS:没有用到的函数定义,常量,你可以删除
'PS:在此基础上你可以自己扩展其它功能,如左键按下时"按钮"的状态.图像
'PS:左键弹起里显示的图像...etc..