热情软件屋

 

如何改变COMMAND按纽上文字的颜色


编号:QA003050
建立日期: 2000年6月15日 最后修改日期:2002年4月22日
所属类别:

Lily:
    应用环境:中文Windows 98
     中文Visual Basic 6.0
    如何改变COMMAND按纽上文字的颜色?按钮没有forecolor属性。

回答:

    在Form上放置一个按钮和Picture。将Picture的Visibel设置为False。将按钮的Style属性设置为1。然后使用下面的语句:
    Private Sub Form_Load()
     Picture1.AutoRedraw = True
     Picture1.ForeColor = vbRed
     Picture1.CurrentX = Command1.Width / 2
     Picture1.CurrentY = Command1.Height / 3
     Picture1.Print "OK"
     Command1.Caption = ""
     Command1.Picture = Picture1.Image
    End Sub
    
    

    uguess的意见:
    Change the ForeColor of the text in a command button.
    
    Option Explicit
    
    Private Type RECT
     Left As Long
     Top As Long
     Right As Long
     Bottom As Long
    End Type
    
    Private Declare Function GetParent Lib "user32" _
     (ByVal hWnd As Long) As Long
    
    Private Declare Function GetWindowLong Lib "user32" Alias _
     "GetWindowLongA" (ByVal hWnd As Long, _
     ByVal nIndex As Long) As Long
    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_WNDPROC = (-4)
    
    Private Declare Function GetProp Lib "user32" Alias "GetPropA" _
     (ByVal hWnd As Long, ByVal lpString As String) As Long
    Private Declare Function SetProp Lib "user32" Alias "SetPropA" _
     (ByVal hWnd As Long, ByVal lpString As String, _
     ByVal hData As Long) As Long
    Private Declare Function RemoveProp Lib "user32" Alias _
     "RemovePropA" (ByVal hWnd As Long, _
     ByVal lpString As String) As Long
    
    Private Declare Function CallWindowProc Lib "user32" Alias _
     "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
     ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, _
     ByVal lParam As Long) As Long
    
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
     (Destination As Any, Source As Any, ByVal Length As Long)
    
    'Owner draw constants
    Private Const ODT_BUTTON = 4
    Private Const ODS_SELECTED = &H1
    'Window messages we're using
    Private Const WM_DESTROY = &H2
    Private Const WM_DRAWITEM = &H2B
    
    Private Type DRAWITEMSTRUCT
     CtlType As Long
     CtlID As Long
     itemID As Long
     itemAction As Long
     itemState As Long
     hwndItem As Long
     hDC As Long
     rcItem As RECT
     itemData As Long
    End Type
    
    Private Declare Function GetWindowText Lib "user32" Alias _
     "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, _
     ByVal cch As Long) As Long
    'Various GDI painting-related functions
    Private 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
    Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, _
     ByVal crColor As Long) As Long
    Private Declare Function SetBkMode Lib "gdi32" (ByVal hDC As Long, _
     ByVal nBkMode As Long) As Long
    Private Const TRANSPARENT = 1
    
    Private Const DT_CENTER = &H1
    Public Enum TextVAligns
     DT_VCENTER = &H4
     DT_BOTTOM = &H8
    End Enum
    Private Const DT_SINGLELINE = &H20
    
    
    Private Sub DrawButton(ByVal hWnd As Long, ByVal hDC As Long, _
    rct As RECT, ByVal nState As Long)
    
     Dim s As String
     Dim va As TextVAligns
    
     va = GetProp(hWnd, "VBTVAlign")
    
     'Prepare DC for drawing
     SetBkMode hDC, TRANSPARENT
     SetTextColor hDC, GetProp(hWnd, "VBTForeColor")
    
     'Prepare a text buffer
     s = String$(255, 0)
     'What should we print on the button?
     GetWindowText hWnd, s, 255
     'Trim off nulls
     s = Left$(s, InStr(s, Chr$(0)) - 1)
    
     If va = DT_BOTTOM Then
     'Adjust specially for VB's CommandButton control
     rct.Bottom = rct.Bottom - 4
     End If
    
     If (nState And ODS_SELECTED) = ODS_SELECTED Then
     'Button is in down state - offset
     'the text
     rct.Left = rct.Left + 1
     rct.Right = rct.Right + 1
     rct.Bottom = rct.Bottom + 1
     rct.Top = rct.Top + 1
     End If
    
     DrawText hDC, s, Len(s), rct, DT_CENTER Or DT_SINGLELINE _
     Or va
    
    End Sub
    
    Public Function ExtButtonProc(ByVal hWnd As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
    
    Dim lOldProc As Long
    Dim di As DRAWITEMSTRUCT
    
    lOldProc = GetProp(hWnd, "ExtBtnProc")
    
    ExtButtonProc = CallWindowProc(lOldProc, hWnd, wMsg, wParam, lParam)
    
    If wMsg = WM_DRAWITEM Then
     CopyMemory di, ByVal lParam, Len(di)
     If di.CtlType = ODT_BUTTON Then
     If GetProp(di.hwndItem, "VBTCustom") = 1 Then
     DrawButton di.hwndItem, di.hDC, di.rcItem, _
     di.itemState
    
     End If
    
     End If
    
    ElseIf wMsg = WM_DESTROY Then
     ExtButtonUnSubclass hWnd
    
    End If
    
    End Function
    
    Public Sub ExtButtonSubclass(hWndForm As Long)
    
    Dim l As Long
    
    l = GetProp(hWndForm, "ExtBtnProc")
    If l <> 0 Then
     'Already subclassed
     Exit Sub
    End If
    
    SetProp hWndForm, "ExtBtnProc", _
     GetWindowLong(hWndForm, GWL_WNDPROC)
    SetWindowLong hWndForm, GWL_WNDPROC, AddressOf ExtButtonProc
    
    End Sub
    
    Public Sub ExtButtonUnSubclass(hWndForm As Long)
    
    Dim l As Long
    
    l = GetProp(hWndForm, "ExtBtnProc")
    If l = 0 Then
     'Isn't subclassed
     Exit Sub
    End If
    
    SetWindowLong hWndForm, GWL_WNDPROC, l
    RemoveProp hWndForm, "ExtBtnProc"
    
    End Sub
    
    Public Sub SetButtonForecolor(ByVal hWnd As Long, _
     ByVal lForeColor As Long, _
     Optional ByVal VAlign As TextVAligns = DT_VCENTER)
    
    Dim hWndParent As Long
    
    hWndParent = GetParent(hWnd)
    If GetProp(hWndParent, "ExtBtnProc") = 0 Then
     ExtButtonSubclass hWndParent
    End If
    
    SetProp hWnd, "VBTCustom", 1
    SetProp hWnd, "VBTForeColor", lForeColor
    SetProp hWnd, "VBTVAlign", VAlign
    
    End Sub
    
    Public Sub RemoveButton(ByVal hWnd As Long)
    
     RemoveProp hWnd, "VBTCustom"
     RemoveProp hWnd, "VBTForeColor"
     RemoveProp hWnd, "VBTVAlign"
    
    End Sub
    
    

    
    To use this, set the target command button's Style property to 1 - Graphical
    
    EXAMPLES:
    
    To set command button forecolor(doesn't have to be in form_load)
    
    Private Sub Form_Load()
     SetButtonForecolor Command1.Hwnd, vbBlue
    End Sub
    
    

    That will set Command1's Forecolor to Blue
    
    To remove the color(can be put anywhere)
    
    Private Sub Command2_Click()
     RemoveButton Command1.Hwnd
     Command1.Refresh
    End Sub
    

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio