СообЧа > База Знаний > Программирование > Visual Basic

Вопрос

Использую в проге 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 Сообщество Чайников
Контактная информация