Консультация № 109364
14.11.2007, 12:05
0.00 руб.
0 2 1
Здравствуйте, уважаемые эксперты.
Проблемка такая:
В 6-м билдере создаю форму. На ней 2 кнопки Button1 и Button2 и 1 прямоугольник Shape1 из палитры компонентов.
В обработчике OnKeyDown пишу
if(Key==VK_LEFT) Shape1->Left=Shape1->Left-1;
Компилируем.
И при нажатии кнопки на клаве ничего не происходит.
Фокус только прыгает между Button-ами.
Как все-таки задвинуть Shape1? Какой функцией можно убрать фокус с кнопок, а не просто передавать его с одного компонента на другой?

Обсуждение

Неизвестный
15.11.2007, 01:46
общий
это ответ
Здравствуйте, Ben Jamin!

Все верно. Дело в том, что нужное вам сообщение WM_KEYDOWN уходит активному контролу - в данном случае активной кнопке. Она его обрабатывает по своему усмотрению и далее блокирует.

Вам нужно ловить это сообщение ДО того, как оно попадет в окно.

Для этих целей можно воспользоваться компонентом TApplicationsEvent.

Напишите обработчик события OnMessage данного компонента так, как в приложении, и все у вас получится;))



Приложение:
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled){ //Если пришло сообщение WM_KEYDOWN (нажата кнопка) И этой кнопкой является <-, вперед... if(Msg.message == WM_KEYDOWN && Msg.wParam == VK_LEFT) { Shape1->Left = Shape1->Left - 1; Handled = true; //Блокируем сообщение, чтобы оно не ушло дальше... }}
Неизвестный
16.11.2007, 03:30
общий
Спасибо за ApplicationEvents. Даже не знал, что есть такое.Но есть замечание. Предложенный код не позволяет производить диагональные перемещения.Тут немного переделал://----------------------------------------------------------------void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled){if((Msg.message==WM_KEYDOWN)||(Msg.message==WM_KEYUP)) { TKeyboardState buf; GetKeyboardState(buf); if(buf[VK_DOWN]>2) Shape1->Top++; if(buf[VK_LEFT]>2) Shape1->Left--; if(buf[VK_UP]>2) Shape1->Top--; if(buf[VK_RIGHT]>2) Shape1->Left++; Handled=true; }}//----------------------------------------------------------------Но возник вопрос.В момент отпускания одной из двух нажатых клавиш всё останавливается.Почему? С оставшейся нажатой клавиши сообщение не приходит что-ли?
Форма ответа