Вопрос
Использую в проге Common Dialog для выбора цвета, и прога требует Comdlg32.ocx. Можно ли API'шками вызвать это окно для выбора цвета?
Ответ
В API-Guide есть пример.
Запускай, иди в "Common Dialogs\CHOOSECOLOR".
Хвастунов Михаил
Option Explicit
Private Type CHOOSECOLOR
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 ChooseColorDlg Lib "comdlg32.dll" Alias "ChooseColorA" _
(pChoosecolor As CHOOSECOLOR) As Long
Private Const CC_RGBINIT = &H1
Private Const CC_FULLOPEN = &H2 'показ опред цвета сразу
Private Const CC_PREVENTFULLOPEN = &H4 'блокир опред цвета
Private Const CC_SHOWHELP = &H8 'показ help
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 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GlobalAlloc Lib "kernel32" _
(ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Sub Command1_Click()
Dim rgbResult As Long, arr(16) As Long, i As Long
' цвет по умолчанию
rgbResult = 255
' инициализируем набор цветов (16 квадратиков внизу диалога)
For i = 0 To 16
arr(i) = (Rnd * 65535)
Next i
ShowChooseColorDlg Me.hWnd, rgbResult, arr(0)
End Sub
Private Function ShowChooseColorDlg(hWnd As Long, ByRef rgbResult As Long, ByRef
arr As Long) As Boolean
Dim cc As CHOOSECOLOR
Dim lpArr As Long
ShowChooseColorDlg = False
' выделяем память для хранения массива цветов (16 клеток снизу диалога)
' этот параметр обязательно должен указывать на область памяти, в которую
' можно посать и читать; 64 потому что: 64 = 4*16 = sizeof(LONG)*16
lpArr = GlobalAlloc(0, 64)
If lpArr Then
'память успешно выделена
' кируем туда значеня из массива (цета клеток)
CopyMemory ByVal lpArr, arr, 64
' инициализируем структуру
cc.lStructSize = Len(cc)
cc.hwndOwner = hWnd
cc.hInstance = 0
cc.rgbResult = rgbResult
cc.lpCustColors = lpArr
cc.flags = (CC_ANYCOLOR Or CC_FULLOPEN Or CC_PREVENTFULLOPEN _
OR CC_RGBINIT)
cc.lCustData = 0
cc.lpfnHook = 0
cc.lpTemplateName = 0
' вызываем АПИ функцю диалога выбора цвета
If ChooseColorDlg(cc) Then
' пользователь поработав с диалогом нажал =ОК=
' возвращаем все что выбрал пользователь
rgbResult = cc.rgbResult
CopyMemory arr, ByVal lpArr, 64
ShowChooseColorDlg = True
End If
' освобождаем выделенную память
GlobalFree lpArr
End If
End Function
Ivan Rozhuk
Copyright 2000-2004 Сообщество Чайников
Контактная информация