Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Проблемище с ChooseColor Добавлено: 21.09.04 15:04  

Автор вопроса:  Lister | ICQ: 298621256 
Следующий код приводит к вылету IDE:
В чем здесь может быть проблема?
Пример взят из API-Guide...
Пробовал менять флаги... безрезультатно

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 Function ChooseColorA Lib "comdlg32.dll" (pChoosecolor As CHOOSECOLOR) As Long

Private Sub Command1_Click()
  Dim cc As CHOOSECOLOR

  cc.lStructSize = Len(cc)
  cc.hwndOwner = Me.hWnd
  cc.hInstance = App.hInstance
  cc.flags = &H2

  If ChooseColorA(cc) <> 0 Then
      Debug.Print cc.rgbResult
  End If

End Sub

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #1 Добавлено: 21.09.04 15:32
Попробуй так:
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 Function ChooseColorA Lib "comdlg32.dll" (pChoosecolor As CHOOSECOLOR) As Long

Private Sub Command1_Click()
  ;Dim cc As CHOOSECOLOR

  cc.lStructSize = Len(cc)
  cc.hwndOwner = Me.hWnd
  cc.hInstance = App.hInstance
  cc.flags = &H2
  cc.lpCustColors = String$(16 * 4, 0)
  If ChooseColorA(cc) <> 0 Then
      ;Debug.Print cc.rgbResult
  End If
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #2 Добавлено: 21.09.04 15:37
Ура! Пашет :))

А я и забыл, что lpCustColors является обязательным параметром


Ответить

Номер ответа: 3
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #3 Добавлено: 21.09.04 15:45
А теперь новая проблема - диалог не хочет быть модальным :(


Ответить

Номер ответа: 4
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #4
Добавлено: 21.09.04 21:57
Lister, у меня есть целый класс по работе со многими диалогами Windows (шрифт, выбор папок, о проге, ..., цвет). Хочешь перекачаю? Только дай Емелю

Ответить

Номер ответа: 5
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #5 Добавлено: 21.09.04 22:06
У меня такой прикол: я сам создал класс именно для работы с диалогом
выбора цвета. Так вот, вызывая функцию ShowColor этого класса, я
получаю немодальное окно. Как только переношу весь код в модуль - окно
получается модальным...

Пришли пожалуйста твой класс - я посмотрю. Может у меня с системой проблы...
:(
Lister <lister@softsale.ru>

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 22.09.04 01:34
Lister

Я тебе посылал dll, BrowseDLG.dll, там теперь ещё одну ф-цию добавил - ChooseColour
- диалог выбора цвета. Просто делаешь
Col = ChooseColour(ByVal 0, CC_FULLOPEN)

И получаешь готовый цвет.
Хочешь модальный, хочешь - немодальный.

Ответить

Номер ответа: 7
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #7 Добавлено: 22.09.04 20:48
2 cresta

Смена кнопок в примере что-то не работала :(

Не могу я твой диалог выбора цвета использовать - мне диалог нужно модифицировать (добавлять элементы, центрировать и пр.)...

Ответить

Номер ответа: 8
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #8 Добавлено: 22.09.04 20:59
Смена кнопок в примере что-то не работала


А что делает и что говорит? И ехе-файл тоже не хочет?

Ответить

Номер ответа: 9
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #9 Добавлено: 22.09.04 21:15
Мои действия:
1)Запускаю экзешник
2)Выбираю Путь к папке
3)Выбираю иконку
4)Нажимаю заменить кнопку
5)Нажимаю Вызов диалога

Ничего :(

А что делает и что говорит? И ехе-файл тоже не хочет?


Ничего не делает

Говорит "Предохраняйтесь, ребята и сохраняйте разделы реестра" :))

Ответить

Номер ответа: 10
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #10 Добавлено: 22.09.04 21:56
Ничего не делает... Если не выскакивает msgbox с именем папки, которую ты указал, значит dll не найдена, т.к. MsgBox - первая инструкция в dll.

Ответить

Номер ответа: 11
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #11 Добавлено: 22.09.04 22:06
Ну как это не найдена?? Если не найдена, то IDE про это говорит - только
что проверил.


Ответить

Номер ответа: 12
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #12 Добавлено: 22.09.04 23:11
Алгоритм замены кнопки такой:

1.Получаешь привелегии на сохранение ключа
HKEY_CURRENT_USER "Software\Microsoft\Windows\CurrentVersion\Policies\comdlg32\PlacesBar" через EnablePrivilege
2.Сохраняешь его в файл .reg при помощи RegSaveKey (чтобы потом можно было восстановить)
3.В ключе у параметра с именем Place0 заменяешь значение с REG_DWORD на REG_SZ, и новое значение Place0 должно быть "C:\MyDir"
4.При помощи PathMakeSystemFolder устанавливаешь для C:\MyDir аттрибут "системная папка"
5.Создаёшь в папке C:\MyDir файл desktop.ini с указанием иконки, ассоциируемой с этой папкой.
6. Открываешь CommonDialog - на месте первой кнопки должна стоять указанная тобой MyDir.

Ну и потом все в обратном порядке на место.

Видимо не получилось привилегии установить. Можно без привилегий, но тогда надо не весь ключ целиком сохранять в .reg - файл, а просто запомнить значение для Place0 и изменить его выше описаным способом. И при завершении программы не импортировать обратно весь ключ, а просто восстановить исходное значение параметра Place0.
Видимо надо отказаться от сохранения всего ключа и просто переписывать значения параметра, для этого привилегий вроде не нужно.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам