C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Переназначить реакцию на ctrl+стрелки в поле Edit, Перехват стандартной реакции Windows
wn1
  Отправлено: 04.12.2005, 11:34


Не зарегистрирован







Собственно сабж. Имеется поле Edit. Стандартное действие при нажатии комбинации клавиш в этом поле ctrl+влево или ctrl+вправо — передвижение на слово вперед или назад. Необходимо отменить эти действия. Оброботка события OnKeyDown — это понятно. Но при этом сначала выполняются действия описаные в реакции на событие, а потом выполняется стандартное действие, т.е. переход на слово вперед/назад. Как это победить.
P.S. поиском пробежался — не нашел. Програмировать на Си только начал, так что не судите строго...
Grigoriy
Отправлено: 04.12.2005, 16:13


Мастер участка

Группа: Участник
Сообщений: 381



Положите на форму компонент TApplicationEvent
и напишите для него обработчик сообщения, который есть в нижеприведенном коде.
Обязательно должен присутствовать обработчик сообщения
void __fastcall TForm1::FormCreate(TObject *Sender)

CODE


#include <vcl.h>
#pragma hdrstop

#include "Unit1temp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool pctrl;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
if (Edit1->Focused()){
if (Msg.message==256)
if (Msg.wParam==17){pctrl=1;} else
if ((Msg.wParam==37)||(Msg.wParam==39)){
if (pctrl==1)Handled=true;
};
if ((Msg.message==257)&&(Msg.wParam==17)){pctrl=0;}
};
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
pctrl=0;
}

Но при этом коде курсор при нажатом ctrl и клавиш управления курсором (вправо и влево) вообще никуда не уходит.

Отредактировано Grigoriy — 04/12/2005, 16:20
Doga
Отправлено: 04.12.2005, 18:38


Мастер участка

Группа: Участник
Сообщений: 575



А можно воспользоваться компонентом из RxLib — RxWindowHook.

Он может перехватить неугодное Вам сообщение перед тем(до того) как оно придёт в Edit, и просто не пустит его далее по назначению (OnBeforeMessage).
GIZMO
Отправлено: 04.12.2005, 19:25


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Doga @ 04/12/2005, 18:38)
А можно воспользоваться компонентом из RxLib — RxWindowHook.

Он может перехватить неугодное Вам сообщение перед тем(до того) как оно придёт в Edit, и просто не пустит его далее по назначению (OnBeforeMessage).

А почему нельзя воспользоваться св-вом специально предусмотренного разработчиками для таких вещей TControl::WindowProc?
Doga
Отправлено: 04.12.2005, 19:43


Мастер участка

Группа: Участник
Сообщений: 575



QUOTE

А почему нельзя воспользоваться св-вом специально предусмотренного разработчиками для таких вещей TControl::WindowProc?


А кто говорил, что нельзя?

Просто, каждый, в силу своих знаний и опыта, предлагает то, что считает более правильным и(или) удобным... smile.gif
wn1
Отправлено: 05.12.2005, 10:03


Не зарегистрирован







Нашел простое решение — аж сам оболдел — и в голову даже текое не пришло. В коде события OnKeyDown когда надо отключить стандартную реакцию после своего кода пишем Key = 0. И все!! Однако работает на сколько я знаю только для несимвольных клавиш. Для символьных перехват таким же образом можно организовать по событию OnKeyPress. Сам не прверял правда. По мотивам http://inprise.narod.ru/cbuilder/archives/..._977431197.html

Отредактировано wn1 — 05/12/2005, 10:04

Вернуться в Вопросы программирования в C++Builder