One
of the simplest of the Common Dialog APIs to call, the ChooseColor dialog
presents the standard Windows color-picker just like the Common Dialog
OCX's ShowColor method.
Although the API uses a structure to pass parameters to the ChooseColor
API, the dialog can be shown by providing just the flags, hwndOwner,
lStructSize and lpCustColors members completed. Other options, such as a
hook, can be added to provide additional functionality such as
positioning, custom captions, renaming and / or reorganizing the
controls. VB does not easily support the use of Templates, so the
lpTemplateName member will not be discussed.
This is just about the simplest code to demo the ChooseColor API. Code
populates an array of longs with a series of gray values used as the
Custom Colors when initially displaying the dialog. With the array
declared at form level its values remain persistent between calls. (A
simple Binary file save would write the array to disk to provide for
persistence between sessions.) Flags specified by the option and
check boxes are OR'd, a pointer to the custom colour array is assigned to
lpCustColors, and the API is called.
To complete the demo, the return value from the call is assigned as the
form's BackColor. To enable the demo to maintain readability regardless
of color selected, some additional code is tossed in to extract the
constituent R, G, and B values from the color and based on the values,
toggle the text color of the option/check buttons to a contrasting color.
|
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
' applications, but you may not reproduce
' or publish this code on any web site,
' online service, or distribute as source
' on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'static array to contain the custom
'colours selected by the user
Private dwCustClrs(0 To 15) As Long
'ChooseColor structure flag constants
Private Const CC_RGBINIT As Long = &H1
Private Const CC_FULLOPEN As Long = &H2
Private Const CC_PREVENTFULLOPEN As Long = &H4
Private Const CC_SOLIDCOLOR As Long = &H80
Private Const CC_ANYCOLOR As Long = &H100
Private Type CHOOSECOLORSTRUCT
lStructSize As Long
hwndOwner As Long
hInstance As Long
rgbResult As Long
lpCustColors As Long
flags As Long
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Private Declare Function ChooseColor Lib "comdlg32.dll" _
Alias "ChooseColorA" _
(lpcc As CHOOSECOLORSTRUCT) As Long
Private Sub Form_Load()
'initialize the custom colours
'with a series of gray shades
Dim cnt As Long
For cnt = 240 To 15 Step -15
dwCustClrs((cnt \ 15) - 1) = RGB(cnt, cnt, cnt)
Next
'initialize controls
Option1.Caption = "Display normally"
Option1.Value = True
Option2.Caption = "Display with Define Custom Colors open"
Option3.Caption = "Disable Define Custom Colors button"
Check1.Caption = "Specify initial colour is form BackColor"
Command1.Caption = "Choose Color"
End Sub
Private Sub Command1_Click()
Dim cc As CHOOSECOLORSTRUCT
Dim r As Long
Dim g As Long
Dim b As Long
With cc
'set the flags based on the
'check and option buttons
.flags = CC_ANYCOLOR
If Option2.Value = True Then .flags = .flags Or CC_FULLOPEN
If Option3.Value = True Then .flags = .flags Or CC_PREVENTFULLOPEN
If Check1.Value = 1 Then
.flags = .flags Or CC_RGBINIT
.rgbResult = Form1.BackColor
End If
'size of structure
.lStructSize = Len(cc)
'owner of the dialog
.hwndOwner = Me.hWnd
'assign the custom colour selections
.lpCustColors = VarPtr(dwCustClrs(0))
End With
If ChooseColor(cc) = 1 Then
'assign the selected colour
'as the form background
Me.BackColor = cc.rgbResult
'bonus .. assure the text remains
'readable regardless of colour
'by splitting out the respective
'RGB values, and adjusting the text
'colour to contrast
Call GetRBGFromCLRREF(cc.rgbResult, r, g, b)
Call UpdateControlShadeSelection(r, g, b)
End If
End Sub
Private Sub UpdateControlShadeSelection(r As Long, g As Long, b As Long)
Dim ctlcolor As Long
Dim ctl As Control
'if the value of the colour passed
'(representing the current colour)
'is less than 128, show white text
'otherwise show black text
If (r < 128) And (g < 128) Or _
(g < 128) And (b < 128) Or _
(r < 128) And (b < 128) Then
ctlcolor = vbWhite
Else
ctlcolor = vbWindowText
End If
'set the option and check backcolor
'to the form backcolor, and the
'control's text to the contrasting
'shade
For Each ctl In Controls
If TypeOf ctl Is OptionButton Or _
TypeOf ctl Is CheckBox Then
ctl.BackColor = RGB(r, g, b)
ctl.ForeColor = ctlcolor
End If
Next
End Sub
Private Sub GetRBGFromCLRREF(ByVal clrref As Long, _
r As Long, g As Long, b As Long)
'pass a hex colour, return the rgb components
b = (clrref \ 65536) And &HFF
g = (clrref \ 256) And &HFF
r = clrref And &HFF
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
|