Страница: 1 |
Страница: 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()
 im 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
 ebug.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.
Видимо надо отказаться от сохранения всего ключа и просто переписывать значения параметра, для этого привилегий вроде не нужно.