Option Explicit
'VBA Windows API https://vbaplanet.com/winapi.php
Private Const CC_RGBINIT = &H1
Private Const CC_FULLOPEN = &H2
Private Const CC_PREVENTFULLOPEN = &H4
Private Const CC_SHOWHELP = &H8
Private Const CC_ENABLEHOOK = &H10
Private Const CC_ENABLETEMPLATE = &H20
Private Const CC_ENABLETEMPLATEHANDLE = &H40
Private Const CC_SOLIDCOLOR = &H80
Private Const CC_ANYCOLOR = &H100
Private Type CHOOSECOLOR
lStructSize As LongPtr
hwndOwner As LongPtr
hInstance As LongPtr
rgbResult As Long
lpCustColors As String
flags As LongPtr
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
End Type
'comdlg32.dll自定义颜色 ChooseColorA vba
Private Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _
"ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr
Dim CustomColors() As Byte
Private Sub CommandButton1_Click()
Dim cc As CHOOSECOLOR
Dim Custcolor(16) As LongPtr
Dim oRGB As Variant
Dim lReturn As LongPtr
cc.lStructSize = LenB(cc)
cc.hwndOwner = 0
cc.hInstance = 0
cc.lpCustColors = 0
cc.flags = CC_ANYCOLOR Or CC_FULLOPEN Or CC_PREVENTFULLOPEN Or CC_RGBINIT
lReturn = ChooseColorAPI(cc)
If lReturn <> 0 Then
Me.Caption = "RGB Value User Chose: " & Str$(cc.rgbResult)
oRGB = VbToRGB(cc.rgbResult)
MsgBox oRGB(0)
MsgBox oRGB(1)
MsgBox oRGB(2)
CustomColors = StrConv(cc.lpCustColors, vbFromUnicode)
Else
MsgBox "User chose the Cancel Button"
End If
End Sub
Private Sub Form_Load()
ReDim CustomColors(0 To 16 * 4 - 1) As Byte
Dim i As Integer
For i = LBound(CustomColors) To UBound(CustomColors)
CustomColors(i) = 0
Next i
End Sub
Private Function VbToRGB(ByVal mColor As Long) As Variant
Dim Blue&, Red&, Green&
Blue = 0: Red = 0: Green = 0
Blue = mColor \ 65536
Green = (mColor - 65536 * Blue) \ 256
Red = mColor - 65536 * Blue - Green * 256
VbToRGB = Array(Red, Green, Blue)
End Function
comdlg32.dll自定义颜色 ChooseColorA vba x64 PtrSafe
于 2024-03-15 23:53:06 首次发布