Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Вопрос: Позиционирование диалогов CommonDialog
Добавлено: 04.07.04 16:20
Автор вопроса: Lister | ICQ: 298621256
Может кто-нибудь знает о том, как позиционировать эти диалоги?
Ответы
Всего ответов: 80
Номер ответа: 1
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #1
Добавлено: 04.07.04 17:21
Для этого нужно сабклассить окно CommonDialog, и при получении в CallBack процедуре сообщения WM_NOTIFY проверять, получено ли при этом CDN_INITDONE. Вот принцип, свои конкретные действия впиши где надо, что-нибудь вроде MoveWindow hWnd, 123, 456, 222, 333, 1:
Public Function OFNProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 im hdr As NMHDR, lOFN As OPENFILENAME
 im buff As String, ret As Long
Select Case uMsg
Case WM_NOTIFY
Call CopyMemory(hdr, ByVal lParam, Len(hdr))
Select Case hdr.Code
Case CDN_SELCHANGE
EnumChildWindows hdr.hWndFrom, AddressOf FindChildNameProc, ByVal 0&
Case CDN_TYPECHANGE
EnumChildWindows hdr.hWndFrom, AddressOf FindChildNameProc, ByVal 0&
Case CDN_INITDONE
' вот тут и вписывай свой код позиционирования
End Select
End Select
End Function
------------------------------
При этом не забудь установить соответствующие флаги в структуре pOpenfilename.flags, позволяющие сабклассить окно, и указать адрес Callback процедуры pOpenfilename.lpfnHook. Ну и конечно, объяви все типы, константы и т.п.
Номер ответа: 2
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #2
Добавлено: 04.07.04 18:04
А можно находить хэндл окна диалога и двигать через MoveWindow()
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 04.07.04 20:59
To hammer:
Ага, если сможешь обратно передать управление своей программе до закрытия окна CommonDialog, попробуй )
Номер ответа: 4
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #4
Добавлено: 05.07.04 03:10
Спасибо, получилось
Но мне еще очень нужна твоя мааааленькая помощь:
у меня нет значения константы CDN_INITDONE и других из той же оперы 'CDN_'
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 05.07.04 04:08
Вообще-то скачай себе API-Viewer, там много чего есть, вот оттуда:
Private Const CDN_FILEOK As Long = (CDN_FIRST - &H5)
Private Const CDN_FIRST As Long = (-601)
Private Const CDN_FOLDERCHANGE As Long = (CDN_FIRST - &H2)
Private Const CDN_HELP As Long = (CDN_FIRST - &H4)
Private Const CDN_INCLUDEITEM As Long = (CDN_FIRST - &H7)
Private Const CDN_INITDONE As Long = (CDN_FIRST - &H0)
Private Const CDN_LAST As Long = (-699)
Private Const CDN_SELCHANGE As Long = (CDN_FIRST - &H1)
Private Const CDN_SHAREVIOLATION As Long = (CDN_FIRST - &H3)
Private Const CDN_TYPECHANGE As Long = (CDN_FIRST - &H6)
Тут все константы отталкиваются от CDN_FIRST, поэтому, её обязятельно указывай, даже если не используешь
Номер ответа: 6
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #6
Добавлено: 05.07.04 07:34
А ну да, давно я не пользовался этими диалогами, все забыл
Номер ответа: 7
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #7
Добавлено: 05.07.04 15:08
Я пытаюсь позиционировать диалог выбора шрифта, но в CallBack процедуре CDN_INITDONE не отслеживается...
Я использовал Debug.Print hdr.code чтобы посмотреть значения. Так вот, оказалось что hdr.Code принимает только два значения:
-12 и -1249
не понятно, почему.
Может, диалог выбора шрифта нельзя позиционировать?
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 05.07.04 16:28
Ну может не к именно CDN_INITDONE привязывать, а к какому-нибудь другому сообщению? Раз диалог уже создан и CallBack работает и принимает сообщения, делай позиционирование по -12 или -1249
Номер ответа: 9
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #9
Добавлено: 05.07.04 16:45
Сообщения со значениями -12 или -1249, как я понял, появляются при
движении указателя мыши по кнопкам этого диалога.
Получается такая ерунда:
при появлении окно находится на экране там, где я его принудительно
размещаю - с этим все ОК. Затем, если вручную передвинуть это окно на
новое место (согласись, иногда бывает нужно) и коснуться мышью кнопки
ОК этого диалога, окно прыгает на свое первоначальное место
расположения
В принципе, здесь ничего сложного нет - код можно доработать так,
чтобы окно и не прыгало...
Я просто констатирую фактЪ
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 05.07.04 17:19
Именно на выбор фонта я не пробовал сабклассить, а на открытие файла - проблем нет. А обойти движения мышь достаточно просто: заведи булеву переменную, изначально она False, при первом же перемещении диалога ставь её в True, и затем
If Not Moved Then <здесь MoveWindow>.
Номер ответа: 11
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #11
Добавлено: 05.07.04 17:28
Да, я так и сделал - добавил Public bMoveFontDialog As Boolean
Номер ответа: 12
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #12
Добавлено: 25.08.04 04:37
Не согласен...
Надо сразу проверять WM_INITDIALOG и сразу MoveWindow делать и все тут...
И не нужна будет вся эта куча бесполезных и опасных действий с получением и проверкой NMHDR
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 25.08.04 08:35
Да можно MoveWindow и SetWindowPos использовать когда угодно. Просто не задавай hInstance и hWndOwner своего приложения
Кстати, надо бы проверить
Номер ответа: 14
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #14
Добавлено: 25.08.04 08:56
Разумеется, я имею ввиду диалоги, созданные на АПИ. Кроме того, там есть такие полезные штуки как флаг ENABLEHOOK и указатель lpfnHook, так что никаких извратов!
Номер ответа: 15
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #15
Добавлено: 25.08.04 12:07
Как "это когда угодно"??? Если мне память не изменяет, диалоги
CommonDialog всегда модальные.