Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 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
    ;Dim hdr As NMHDR, lOFN As OPENFILENAME
    ;Dim 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 всегда модальные.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

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



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