VB按钮如何设置颜色和按钮文字设置颜色

VB按钮如何设置颜色和按钮文字设置颜色
2024-11-02 09:20:41
有2个网友回答
网友(1):

首先command的style要设为1,否则无法改变

然后在backcolor设置颜色

按钮的字体颜色不能改
如果想改字体颜色,简单点可以用image做按钮。

如果一定要,请看:

在工程中添加以下模块(Module): 
Module modExtButton.bas 

Option Explicit 

'================================================================== 
' modExtButton.bas 

' 本模块可让你改变命令按钮的文本颜色。 
' 使用方法: 

' - 在设计时将文本的Style设为Graphical. 

' - 随意设定背景色和图象属性. 

' - 在Form_Load中调用 SetButton : 
' SetButton Command1.hWnd, vbBlue 
' (你可以任意次的调用该过程甚至不必先调用 RemoveButton.) 

' - 在Form_Unload中调用 RemoveButton : 
' RemoveButton Command1.hWnd 

'================================================================== 

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 SetButton(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 


'然后回到FORM中: 
'添加CommandButton,不必更改它们的名称,将它们的Style设为Graphical,给第3个按钮设置一幅图片。 
'CommandButton也可以放置在一个容器如PictureBox或Frame中,模块会判断,如果需要的话将CommandButton的容器也子类化。 

'在Form中的代码: 
Private Sub Form_Load() 

'Initialize each button color. 
SetButton Command1.hWnd, vbRed 
SetButton Command2.hWnd, &H8000& '深绿色 
'Assign this one a DT_BOTTOM alignment because 
SetButton Command3.hWnd, vbBlue, DT_BOTTOM '含有图片,将文本放置在按钮底部 
SetButton Command4.hWnd, &H8080& '暗棕黄色 

End Sub 

Private Sub Form_Unload(Cancel As Integer) 

'手动解除按钮的子类化 
'这并不是必须的 
RemoveButton Command1.hWnd 
RemoveButton Command2.hWnd 
RemoveButton Command3.hWnd 
RemoveButton Command4.hWnd 

End Sub 

For m = 0 To 9 
SetButton CmdNum(m).hWnd, vbBlue 
Next 
For n = 1 To 4 
SetButton CmdCal(n).hWnd, vbRed 
Next 
For l = 2 To 4 
SetButton CmdOth(l).hWnd, vbRed 
Next

网友(2):

右边该按钮的属性设置里都有。