Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с виртуальными кодами кнопок

2.7K
23 января 2005 года
sys33
55 / / 16.12.2004
Пытаюсь разобраться в Virtual key codes, почему то когда я использую виртуальные ключи типа VK_SPACE или там VK_INSERT все работает, но как задаю VK_UP(стрелочки) или VK_NUMPAD0, никакой реакции на нажатие... может дело в том, что я пробую на ноутбуке у него клавиатура немного отличается от стандартной?
7.1K
23 января 2005 года
Bumer
33 / / 17.01.2005
Цитата:
Originally posted by sys33
Пытаюсь разобраться в Virtual key codes, почему то когда я использую виртуальные ключи типа VK_SPACE или там VK_INSERT все работает, но как задаю VK_UP(стрелочки) или VK_NUMPAD0, никакой реакции на нажатие... может дело в том, что я пробую на ноутбуке у него клавиатура немного отличается от стандартной?



Однако,ты уже себе сам и ответил.
Пока.

2.7K
23 января 2005 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by Bumer


Однако,ты уже себе сам и ответил.
Пока.


я не уверен что это так, это только предположение...

301
23 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by sys33

я не уверен что это так, это только предположение...


Используй GetKeyState(VK_UP) в отдельном потоке. (На худой конец в таймере)

2.7K
23 января 2005 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin

Используй GetKeyState(VK_UP) в отдельном потоке. (На худой конец в таймере)


Немного не тот эффект и не то, вот мой код... я упражняюсь хочу чтобы объект ( в моем случае форма двигалась по экрану в зависимости от нажатых стрелочек ), вот код который работал:
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
//if(Key == 'S')
if(Key == 'S')
Timer1->Enabled=True;
if(Key == 'W')
Timer2->Enabled=True;
if(Key == 'A')
Timer3->Enabled=True;
if(Key == 'D')
Timer4->Enabled=True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key == 'S')
Timer1->Enabled=False;
if(Key == 'W')
Timer2->Enabled=False;
if(Key == 'A')
Timer3->Enabled=False;
if(Key == 'D')
Timer4->Enabled=False;
}
Я хотел просто чтобы я мог двигать не буквами а стрелочками, при замене if(GetKeyState(VK_UP)) ничего не происходит, т.е. никакой реакции на нажатие стрелочки, а при VK_INSERT (например), объект двигается, но не останавливается, когда я перестаю жать на клавишу.

301
23 января 2005 года
lord Kelvin
897 / / 08.11.2004
 
Код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if(GetKeyState(VK_UP)&128)Top-=5;
 if(GetKeyState(VK_DOWN)&128)Top+=5;
 if(GetKeyState(VK_LEFT)&128)Left-=5;
 if(GetKeyState(VK_RIGHT)&128)Left+=5;
}

Вот мой вариант. ЧеМ он тебе не нравиться?
2.7K
23 января 2005 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin
 
Код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if(GetKeyState(VK_UP)&128)Top-=5;
 if(GetKeyState(VK_DOWN)&128)Top+=5;
 if(GetKeyState(VK_LEFT)&128)Left-=5;
 if(GetKeyState(VK_RIGHT)&128)Left+=5;
}

Вот мой вариант. ЧеМ он тебе не нравиться?


Нда, так у меня все пашет, сенкс, интересно, а почему мой не работал... ну да ладно, а вот только зачем 128????

301
23 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by sys33

Нда, так у меня все пашет, сенкс, интересно, а почему мой не работал... ну да ладно, а вот только зачем 128????


Потому, что нам надо проверить восьмой бит. Еще можно так написать

 
Код:
if(GetKeyState(VK_RIGHT)>>7)Left+=5;

Теперь понятнее?=))
2.7K
24 января 2005 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin

Потому, что нам надо проверить восьмой бит. Еще можно так написать
 
Код:
if(GetKeyState(VK_RIGHT)>>7)Left+=5;

Теперь понятнее?=))


К сожалению не понятнее, но это наверное из за моих скудных ламерских знаний в области программирования, я токо начинаю... ладно, спасибо, попробую найти ченть про GetKeyState, просто я думал, что она возвращает либо 0, либо 1. А оказалось не все так просто...

301
24 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by sys33

К сожалению не понятнее, но это наверное из за моих скудных ламерских знаний в области программирования, я токо начинаю... ладно, спасибо, попробую найти ченть про GetKeyState, просто я думал, что она возвращает либо 0, либо 1. А оказалось не все так просто...


Функция возвращает байт (8 бит, с номерами от 0 до 7, где 0 - младший), нам надо узнать значение 7ого бита. AND (&) - логическое И

 
Код:
0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1

10111001 & 10000000 ( = 128) = 10000000
00111001 & 10000000 ( = 128) = 00000000

То есть если первый 7ой бит единица, то GetKeyState(VK_UP)&128 будет равно 128, иначе 0. Или (для ифа) true или false.
Операция ">>" есть побитовый сдвиг вправо. (При сдвиге на 1 0вой бит заменяется 1ым, 1ый - вторым, а седьмой становится 0). При сдвиге на 7 вправо 7ой бит становится 0вым, а все оставшиеся - нулями. И опять мы получаем либо true, либо false. Вот.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог