64-битные Excel и comdlg32.dll пользовательские цвета - PullRequest
4 голосов
/ 20 апреля 2011

Я пытаюсь адаптировать код в здесь или здесь , чтобы открыть пользовательскую цветовую палитру в 64-разрядной версии Excel 2010, но не могу заставить ее работать. Код на обоих сайтах отлично работает в Excel 2003

Одна попытка

 Option Explicit

 Private Type CHOOSECOLOR
 lStructSize As Long
 hwndOwner As Long
 hInstance As Long
 rgbResult As Long
 lpCustColors As String
 flags As Long
 lCustData As Long
 lpfnHook As Long
 lpTemplateName As String
 End Type

 Private Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _
 "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long

 Dim CustomColors() As Byte

 Private Sub Command1_Click()
   Dim cc As CHOOSECOLOR
   Dim Custcolor(16) As Long
   Dim lReturn As Long
   cc.lStructSize = Len(cc)
   cc.hwndOwner = Application.Hwnd
   cc.hInstance = 0
   cc.lpCustColors = StrConv(CustomColors, vbUnicode)
   cc.flags = 0
   lReturn = ChooseColorAPI(cc)
   If lReturn <> 0 Then
       Application.Caption = "RGB Value User Chose: " & Str$(cc.rgbResult)
       Application.BackColor = cc.rgbResult            ' Visual Basic only ****
       Application.Section(0).BackColor = cc.rgbResult ' Access only **********
       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

Это работает нормально, но не показывает диалог. Я также попытался изменить некоторые типы LONG на LONGPTR безуспешно. Кто-нибудь знает, как заставить это работать на 64-битной машине; или если это вообще возможно? Возможно, есть новая библиотека?

Спасибо

Редактировать: Небольшое изменение формулировки с предложением щедрости ... Как получить доступ к этой пользовательской программе выбора цвета (изображение ниже) в 64-разрядной версии Excel 2010 и использовать ее (ДОЛЖНА работать на 64-разрядной!), Чтобы задать ячейки в Excel 2010 с выбранным цветом и сохранить цвет? Изображение взято из Excel 2010 64-bit, выбрав кнопку заливки> больше цветов> Пользовательский

Действительный XHTML http://img851.imageshack.us/img851/2057/unlednvn.png

Ответы [ 2 ]

6 голосов
/ 28 апреля 2011

Я бы попробовал две вещи.Сначала замените каждое использование Long на LongPtr.

Private Type CHOOSECOLOR
    lStructSize As LongPtr
    hwndOwner As LongPtr
    hInstance As LongPtr
    rgbResult As LongPtr
    lpCustColors As String
    flags As LongPtr
    lCustData As LongPtr
    lpfnHook As LongPtr
    lpTemplateName As String
End Type

Private Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _
    "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr

Во-вторых, замените использование Len на LenB.

Private Sub Command1_Click()
    Dim cc As CHOOSECOLOR
    Dim Custcolor(16) As LongPtr
    Dim lReturn As LongPtr

    cc.lStructSize = LenB(cc)
    cc.hwndOwner = Application.Hwnd
    cc.hInstance = 0
    cc.lpCustColors = StrConv(CustomColors, vbUnicode)
    cc.flags = 0
    lReturn = ChooseColorAPI(cc)

    If lReturn <> 0 Then
       Application.Caption = "RGB Value User Chose: " & Str$(cc.rgbResult)
       Application.BackColor = cc.rgbResult            ' Visual Basic only ****
       Application.Section(0).BackColor = cc.rgbResult ' Access only **********
       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

Подробнее

LongPtrТип данных

Функция LenB

1 голос
/ 23 апреля 2011

AFAIK 32-разрядные библиотеки DLL не могут использоваться 64-разрядными приложениями.
Вместо этого используйте comdlg64.dll (если такая библиотека существует).

Использование Google показывает, что существует множество вирусовплавает в сети под этим именем.
Так что, если comdlg64.dll не на вашем компьютере не загружайте его из сети!
(Если вы не хотите испытать зомби).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...