Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: KeyDown Добавлено: 17.09.03 16:47  

Автор вопроса:   Артём Л. | ICQ: 280044491 

нужно что бы при нажатии в текстбоксе кнопок вверх или вниз отрабатывало нормальное событие нажатие (KeyDown,KeyPress), то есть: как перехватить это событие?

Ответить

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

Номер ответа: 1
Автор ответа:
 crackoff



ICQ: 156165990 

Вопросов: 12
Ответов: 229
 Профиль | | #1 Добавлено: 17.09.03 17:28

Используй ;Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer

Public Const VK_UP = &H26
Public Const VK_DOWN = &H28

Ставишь таймер с задержкой 100 мс и смотришь:

if  GetAsyncKeyState (VK_UP) then ...

if GetAsyncKeyState (VK_DOWN) then ....

Ответить

Номер ответа: 2
Автор ответа:
  Артём Л.



ICQ: 280044491 

Вопросов: 43
Ответов: 227
 Профиль | | #2 Добавлено: 17.09.03 17:42

а тормозить меня этот таймер не будет?

и что-то мне не очень нравиться этот способ. А если мне нужно что б каждый из, допустим, 100 текстбоксов (и не только текстбоксов) реагировал по-своему на это событие?

кроме того это событие таки не перехватывается, так как текстбокс все равно это событие получает и обрабатывает по-своему, то-есть курсор в нем ходит взад-вперед...

Ответить

Номер ответа: 3
Автор ответа:
 ol2003



Вопросов: 3
Ответов: 122
 Профиль | | #3 Добавлено: 17.09.03 17:54

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

If e.KeyChar = ChrW(38) Then 'arrow up

ElseIf e.KeyChar = ChrW(40) Then 'arrow down

End If

End Sub

Список констант в HELP в

Key Code Constant Changes in Visual Basic .NET

Ответить

Номер ответа: 4
Автор ответа:
  Артём Л.



ICQ: 280044491 

Вопросов: 43
Ответов: 227
 Профиль | | #4 Добавлено: 17.09.03 18:06
да не перехватывается KeyPress для стрелок...

Ответить

Номер ответа: 5
Автор ответа:
 crackoff



ICQ: 156165990 

Вопросов: 12
Ответов: 229
 Профиль | | #5 Добавлено: 17.09.03 19:50
Тормозить не будет. В процедуре таймера смотришь на каком объекте (массиве объектов, классе объектов...) находится фокус и делаешь то что тебе надо. Коду получится не больше, чем использовать для каждого объекта или массива объектов свой обработчик.

Ответить

Номер ответа: 6
Автор ответа:
 crackoff



ICQ: 156165990 

Вопросов: 12
Ответов: 229
 Профиль | | #6 Добавлено: 17.09.03 19:55

>курсор в нем ходит взад-вперед...

А вот я не знаю, как сделать так, чтобы не ходил. Вот еще как вариант. Используй PictureBox. Перехватывай кнопка и методом print с заранее установленым нужным тебе шрифтом выводи то, что надо. Ща попробую, самому интересно стало..

Ответить

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



ICQ: 156165990 

Вопросов: 12
Ответов: 229
 Профиль | | #7 Добавлено: 17.09.03 20:02

Конечно, работает!

Private Sub Picture1_KeyPress(KeyAscii As Integer)
Picture1.Print Chr(KeyAscii);
End Sub

А курсор можешь и сам рисовать. У PictureBox есть свойства CurrentX и CurrentY а тж метод Line. Рисуешь, допустим, в процедуре таймера с задержкой 1 сек. (только, по-моему, Line меняет эти самые  CurrentX и CurrentY, так что предусмотри их сохранение)

Ответить

Номер ответа: 8
Автор ответа:
  Артём Л.



ICQ: 280044491 

Вопросов: 43
Ответов: 227
 Профиль | | #8 Добавлено: 17.09.03 20:18
все это конечно умно, но сделано как-то не через тот проход, должен быть способ поэлегантнее, например: перекрытие какого-нибуть тексбоксовского метода, который первым обрабатывает сообщения клавы, а потом передает их сыновьям...знать бы этот метод.

Ответить

Номер ответа: 9
Автор ответа:
  Артём Л.



ICQ: 280044491 

Вопросов: 43
Ответов: 227
 Профиль | | #9 Добавлено: 17.09.03 21:07

сам допетрил: нужно перекрыть у текстбокса функцию ProcessKeyMessage, а там уж можно делать чего захочется...

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 18.09.03 10:35
А если сабклассить текстбокс? Я сам в этом мало разбирался... Вот
здесь можно почитать:
ms-help://MS.MSDNQTR.2003FEB.1033/enu_kbvbnetkb/en-us/vbnetkb/Q311317.htm

Ответить

Номер ответа: 11
Автор ответа:
  Артём Л.



ICQ: 280044491 

Вопросов: 43
Ответов: 227
 Профиль | | #11 Добавлено: 18.09.03 20:51

а на другом форуме мне ешо подсказали :

Ok, so you want to catch the up or down keys, but prevent them from reaching the textbox. You can do that by trapping the key events at the form level and handling them there. To do this, first set your form's KeyPreview property to True. Then add some code like this:

Private Sub FormMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

If myTextBox.ContainsFocus Then

If e.KeyValue = Keys.Up OrElse e.KeyValue = Keys.Down Then

'add your code for whatever you want to do here

e.Handled = True

End If

End If

End Sub

The code above handles a KeyDown event for your form. Then it checks if your text box has focus. If so it checks for the up or down arrow keys. If those keys are pressed, then it would run your code and set the event to handled. This way the event isn't passed on to the control with focus. If the control that has focus isn't your text box, or its not the up/down arrow key, the key event is processed normally.

Ответить

Страница: 1 |

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



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