Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Вопрос: Позиционирование диалогов CommonDialog | Добавлено: 04.07.04 16:20 |
Автор вопроса: ![]() |
Может кто-нибудь знает о том, как позиционировать эти диалоги? |
Ответы | Всего ответов: 80 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 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 ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 30 Ответов: 683 |
Профиль | Цитата | #2 | Добавлено: 04.07.04 18:04 |
А можно находить хэндл окна диалога и двигать через MoveWindow() |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #3 | Добавлено: 04.07.04 20:59 |
To hammer:
Ага, если сможешь обратно передать управление своей программе до закрытия окна CommonDialog, попробуй ![]() |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #4 | Добавлено: 05.07.04 03:10 |
Спасибо, получилось ![]() Но мне еще очень нужна твоя мааааленькая помощь: у меня нет значения константы CDN_INITDONE и других из той же оперы 'CDN_' |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 30 Ответов: 683 |
Профиль | Цитата | #6 | Добавлено: 05.07.04 07:34 |
А ну да, давно я не пользовался этими диалогами, все забыл |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #7 | Добавлено: 05.07.04 15:08 |
Я пытаюсь позиционировать диалог выбора шрифта, но в CallBack процедуре CDN_INITDONE не отслеживается...
Я использовал Debug.Print hdr.code чтобы посмотреть значения. Так вот, оказалось что hdr.Code принимает только два значения: -12 и -1249 не понятно, почему. Может, диалог выбора шрифта нельзя позиционировать? |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #8 | Добавлено: 05.07.04 16:28 |
Ну может не к именно CDN_INITDONE привязывать, а к какому-нибудь другому сообщению? Раз диалог уже создан и CallBack работает и принимает сообщения, делай позиционирование по -12 или -1249 |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #9 | Добавлено: 05.07.04 16:45 |
Сообщения со значениями -12 или -1249, как я понял, появляются при движении указателя мыши по кнопкам этого диалога. Получается такая ерунда: при появлении окно находится на экране там, где я его принудительно размещаю - с этим все ОК. Затем, если вручную передвинуть это окно на новое место (согласись, иногда бывает нужно) и коснуться мышью кнопки ОК этого диалога, окно прыгает на свое первоначальное место расположения ![]() В принципе, здесь ничего сложного нет - код можно доработать так, чтобы окно и не прыгало... Я просто констатирую фактЪ ![]() |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #10 | Добавлено: 05.07.04 17:19 |
Именно на выбор фонта я не пробовал сабклассить, а на открытие файла - проблем нет. А обойти движения мышь достаточно просто: заведи булеву переменную, изначально она False, при первом же перемещении диалога ставь её в True, и затем
If Not Moved Then <здесь MoveWindow>. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #11 | Добавлено: 05.07.04 17:28 |
Да, я так и сделал - добавил Public bMoveFontDialog As Boolean |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #12 | Добавлено: 25.08.04 04:37 |
Не согласен...
Надо сразу проверять WM_INITDIALOG и сразу MoveWindow делать и все тут... И не нужна будет вся эта куча бесполезных и опасных действий с получением и проверкой NMHDR |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #13 | Добавлено: 25.08.04 08:35 |
Да можно MoveWindow и SetWindowPos использовать когда угодно. Просто не задавай hInstance и hWndOwner своего приложения
Кстати, надо бы проверить ![]() |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #14 | Добавлено: 25.08.04 08:56 |
Разумеется, я имею ввиду диалоги, созданные на АПИ. Кроме того, там есть такие полезные штуки как флаг ENABLEHOOK и указатель lpfnHook, так что никаких извратов! |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #15 | Добавлено: 25.08.04 12:07 |
Как "это когда угодно"??? Если мне память не изменяет, диалоги CommonDialog всегда модальные. |
|