Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: Ламерский вопрос про WM_KEYDOWN/UP Добавлено: 27.01.04 11:27  

Автор вопроса:  sne | Web-сайт: hw.t-k.ru | ICQ: 233286456 

Люди, ничего не пойму, вчера 3 часа пробовал :)
Сабклассю окошко, и не могу поймать сообщения нажатия клавишь Esc, Enter... И не могу поймать сообщения нажатий которые отсылаются Child окошку :( ListBox'у например...

Ответить

  Ответы Всего ответов: 23  

Номер ответа: 1
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #1
Добавлено: 27.01.04 16:35

WM_SYSKEYDOWN/up

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 27.01.04 18:41

Тьфу, я спрашиваю почему я создаю диалог на PB (Dialog New) и мне не поступают эти самые сообщения, а не какой мессагой это ловить :( Вопрос-то ламерский, но не настолько же ;)

Ответить

Номер ответа: 3
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #3
Добавлено: 28.01.04 00:25

извини форум не разглядел, я сюда не лезу...

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 28.01.04 02:27

Вообще-то я имел в виду что я все его сообщения отлавливаю, принимаю, обрабатываю :) (Subclass)...

Ну это уже даже не важно, все сделал через CreateWindowEx, но все же мне было бы интересно знать, а почему такое происходит :(

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 28.01.04 03:22
Ясно. В общем я в этом птичьем языке не силён. Если епе обычно скажут - понятно, а если жаргон -

Ответить

Номер ответа: 8
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 28.01.04 03:52

Ты свой обычный диалог прослушиваешь?

Если да, то просто при показе укзжи ему калбак функцию.

DIALOG SHOW MODAL hDlg& [[,] CALL ИмяФункции] [TO result&]

Потом объяви эту функцию

CallBack Function ИмяФункции()

...

End Function
А внутри функции используй специальные PB-операторы, предназначенные для неё. Начинаются с CB.

 

Ответить

Номер ответа: 9
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 28.01.04 11:45

Так и делал, вот сам попробуй, увидишь, что при таком раскладе сообщения некоторых клавишь - пропадают (Esc, Enter, Tab, ...) В том-то и загадочность этого ;(

Ответить

Номер ответа: 10
Автор ответа:
 brevno



Вопросов: 18
Ответов: 57
 Web-сайт: smsquest.by.ru
 Профиль | | #10
Добавлено: 31.01.04 12:52

#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

Ответить

Номер ответа: 11
Автор ответа:
 brevno



Вопросов: 18
Ответов: 57
 Web-сайт: smsquest.by.ru
 Профиль | | #11
Добавлено: 31.01.04 14:16

Подытожу... Ошибка, ИМХО, чисто теоретическая: то что сделал sne и предлагал великий CyRax не есть субклассинг в ПБ(вообще, надо организовать разборки по понятиям, меня очень суперклассинг интересует). В принципе, DIALOG SHOW MODAL hDlg& [[,] CALL ИмяФункции] [TO result&] многого и не дает(хз почему, правда).. Выше пример(с форума, конечно, зачем сто раз все изобретать) использующий субклассинг в моем понимании, то есть при создании контрола ВСЕ мессаги для него нехитрым приемом(CallWindowProc) перекидываются в колбек..

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 31.01.04 15:53

Хм... на сколько я тут разглядел, мессаги то принимает не ворма, а листбокс - :( А вот ты попробуй словить VK_TAB, когда у тебя одна только голая форма на экране ??? Ну как ??? У меня не получилось :( А если диалог создать на API, все нормально... Почему ???

Ответить

Номер ответа: 13
Автор ответа:
 brevno



Вопросов: 18
Ответов: 57
 Web-сайт: smsquest.by.ru
 Профиль | | #13
Добавлено: 01.02.04 12:02

Ну вот, а я думал тебе листбокс нужен.. искал тут... Но можно и на голой форме, кстати, вот,

'В принципе, проблем нет, надо только использовать субклассинг

'.. или это правильнее называеть "пылесосом" ж) (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

Ответить

Номер ответа: 14
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #14
Добавлено: 01.02.04 23:07

:) Ладно... Скажем что это работает, я не запускал, у меня выдал ошибку... да ладно поверю на слово :)

Вот только а как быть с модальной формой ??? Она же ведь не ловит эти самые мессаги ... Почему ?)

Ответить

Номер ответа: 15
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 02.02.04 00:42
Я тут вычитал что CALLBACK FUNCTION зарезрвирована для работы с DDT.
Скорее всего причина здесь. У диалога обязательно должна быть кнопка по умолчанию (отменить это мне не удалось). А раз CALLBACK встроенная функция, то скорее всего подчиняется внутреннему приоритету исполнения команд (надеюсь вы поняли что я хотел сказать). А значит у кнопки приоритет выше и она срабатывает раньше.
Сказав что это не субклассинг, не менее великий brevno был прав лишь от части. Это субклассинг, но не API, а PB-зависимый субклассинг.

Ответить

Страница: 1 | 2 |

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



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