Страница: 1 | 2 |
Люди, ничего не пойму, вчера 3 часа пробовал :)
WM_SYSKEYDOWN/up Тьфу, я спрашиваю почему я создаю диалог на PB (Dialog New) и мне не поступают эти самые сообщения, а не какой мессагой это ловить Вопрос-то ламерский, но не настолько же извини форум не разглядел, я сюда не лезу... Бывает Вообще-то я имел в виду что я все его сообщения отлавливаю, принимаю, обрабатываю (Subclass)... Ты свой обычный диалог прослушиваешь? Если да, то просто при показе укзжи ему калбак функцию. DIALOG SHOW MODAL hDlg& [[,] CALL ИмяФункции] [TO result&] Потом объяви эту функцию CallBack Function ИмяФункции() ... End Function Так и делал, вот сам попробуй, увидишь, что при таком раскладе сообщения некоторых клавишь - пропадают (Esc, Enter, Tab, ...) В том-то и загадочность этого #Compile Exe #Register None #Dim All #Include "WIN32API.INC" CallBack Function ListProc Static ClassProc As Long Local pMsg As tagMsg Ptr, i As Long, zTxt As String If CbHndl = 0 Then ClassProc = CbLParam: Exit Function If CbMsg = %WM_GETDLGCODE Then pMsg = CbLParam If pMsg > 0 Then i = @pMsg.Message If (i = %WM_CHAR) Or (i = %WM_KEYDOWN) Or (i = %WM_KEYUP) Then If @pMsg.wParam <> %VK_TAB Then Function = %DLGC_WANTALLKEYS End If Else If CbMsg = %WM_CHAR And CbWParam = 13 Then ListBox Get Text GetParent(CbHndl), GetDlgCtrlId(CbHndl) To zTxt MsgBox zTxt End If Function = CallWindowProc(ClassProc, CbHndl, CbMsg, CbWParam, CbLParam) End If End Function CallBack Function DlgProc Select Case CbMsg Case %WM_INITDIALOG Control Add ListBox, CbHndl, 101, , 10, 10, 100, 45,%WS_TABSTOP Or %WS_VSCROLL, %WS_EX_CLIENTEDGE Local i As Long For i = 1 To 10 ListBox Add CbHndl, 101, "Item" + Format$(i, " 000") Next ListBox Select CbHndl, 101, 3 Control Add Button, CbHndl, 102, "Something for Tab", 10, 50, 100, 12 CallWindowProc CodePtr(ListProc), 0, 0, 0, _ SetWindowLong(GetDlgItem(CbHndl, 101), %GWL_WNDPROC, CodePtr(ListProc)) End Select End Function Подытожу... Ошибка, ИМХО, чисто теоретическая: то что сделал sne и предлагал великий CyRax не есть субклассинг в ПБ(вообще, надо организовать разборки по понятиям, меня очень суперклассинг интересует). В принципе, DIALOG SHOW MODAL hDlg& [[,] CALL ИмяФункции] [TO result&] многого и не дает(хз почему, правда).. Выше пример(с форума, конечно, зачем сто раз все изобретать) использующий субклассинг в моем понимании, то есть при создании контрола ВСЕ мессаги для него нехитрым приемом(CallWindowProc) перекидываются в колбек.. Хм... на сколько я тут разглядел, мессаги то принимает не ворма, а листбокс - А вот ты попробуй словить VK_TAB, когда у тебя одна только голая форма на экране ??? Ну как ??? У меня не получилось А если диалог создать на API, все нормально... Почему ??? Ну вот, а я думал тебе листбокс нужен.. искал тут... Но можно и на голой форме, кстати, вот, 'В принципе, проблем нет, надо только использовать субклассинг '.. или это правильнее называеть "пылесосом" ж) (message pump).. 'я тут могу путать #COMPILE EXE #REGISTER NONE #INCLUDE "Win32Api.Inc" GLOBAL StopLoop AS BYTE FUNCTION PBMAIN() LOCAL Msg AS tagMsg, hDlg AS LONG, txt$ : txt$ = " хотите, их есть у меня" DIALOG NEW 0 ,"Press any to continue...", 0, 0, 100, 100, %WS_CAPTION OR %DS_CENTER OR %WS_SYSMENU TO hDlg DIALOG SHOW MODELESS hDlg, CALL hDlg_CB DO WHILE GetMessage(Msg, %NULL, 0, 0) IF Msg.Message = %WM_KEYUP THEN SELECT CASE Msg.wParam CASE %VK_RETURN MSGBOX "Энтер" & txt$ CASE %VK_ESCAPE MSGBOX "Эскейпа" & txt$ CASE %VK_TAB MSGBOX "Таба" & txt$ END SELECT END IF IF IsDialogMessage(hDialB&, Msg) = %FALSE THEN TranslateMessage Msg DispatchMessage Msg END IF IF StopLoop <> 0 THEN EXIT DO LOOP END FUNCTION CALLBACK FUNCTION hDlg_CB SELECT CASE CBMSG CASE %WM_DESTROY: StopLoop = 1 END SELECT END FUNCTION Ладно... Скажем что это работает, я не запускал, у меня выдал ошибку... да ладно поверю на слово
Вопрос: Ламерский вопрос про WM_KEYDOWN/UP
Добавлено: 27.01.04 11:27
Автор вопроса: sne | Web-сайт:
Сабклассю окошко, и не могу поймать сообщения нажатия клавишь Esc, Enter... И не могу поймать сообщения нажатий которые отсылаются Child окошку :( ListBox'у например...
Ответы
Всего ответов: 23
Номер ответа: 1
Автор ответа:
NeForm@t
ICQ: 252999255
Вопросов: 36
Ответов: 247
Web-сайт:
Профиль | | #1
Добавлено: 27.01.04 16:35
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 27.01.04 18:41
Номер ответа: 3
Автор ответа:
NeForm@t
ICQ: 252999255
Вопросов: 36
Ответов: 247
Web-сайт:
Профиль | | #3
Добавлено: 28.01.04 00:25
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 28.01.04 00:30
А вообще если диалог создать Dialog New то не работает, если через API, то все нормально... Почему !? Загадка
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 28.01.04 01:33
Я извиняюсь за действительно ламерский вопрос: слово Сабклассю - это эквивалент выражению создаю экземпляр класса?
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 28.01.04 02:27
Ну это уже даже не важно, все сделал через CreateWindowEx, но все же мне было бы интересно знать, а почему такое происходит
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 28.01.04 03:22
Ясно. В общем я в этом птичьем языке не силён. Если епе обычно скажут - понятно, а если жаргон -
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 28.01.04 03:52
А внутри функции используй специальные PB-операторы, предназначенные для неё. Начинаются с CB.
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 28.01.04 11:45
Номер ответа: 10
Автор ответа:
brevno
Вопросов: 18
Ответов: 57
Web-сайт:
Профиль | | #10
Добавлено: 31.01.04 12:52
Номер ответа: 11
Автор ответа:
brevno
Вопросов: 18
Ответов: 57
Web-сайт:
Профиль | | #11
Добавлено: 31.01.04 14:16
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 31.01.04 15:53
Номер ответа: 13
Автор ответа:
brevno
Вопросов: 18
Ответов: 57
Web-сайт:
Профиль | | #13
Добавлено: 01.02.04 12:02
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 01.02.04 23:07
Вот только а как быть с модальной формой ??? Она же ведь не ловит эти самые мессаги ... Почему ?)
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 02.02.04 00:42
Я тут вычитал что CALLBACK FUNCTION зарезрвирована для работы с DDT.
Скорее всего причина здесь. У диалога обязательно должна быть кнопка по умолчанию (отменить это мне не удалось). А раз CALLBACK встроенная функция, то скорее всего подчиняется внутреннему приоритету исполнения команд (надеюсь вы поняли что я хотел сказать). А значит у кнопки приоритет выше и она срабатывает раньше.
Сказав что это не субклассинг, не менее великий brevno был прав лишь от части. Это субклассинг, но не API, а PB-зависимый субклассинг.