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?
|
А кто говорил, что нельзя?
Просто, каждый, в силу своих знаний и опыта, предлагает то, что считает более правильным и(или) удобным...
|
|
wn1 |
Отправлено: 05.12.2005, 10:03 |
|
Не зарегистрирован
|
Нашел простое решение — аж сам оболдел — и в голову даже текое не пришло. В коде события OnKeyDown когда надо отключить стандартную реакцию после своего кода пишем Key = 0. И все!! Однако работает на сколько я знаю только для несимвольных клавиш. Для символьных перехват таким же образом можно организовать по событию OnKeyPress. Сам не прверял правда. По мотивам http://inprise.narod.ru/cbuilder/archives/..._977431197.html
Отредактировано wn1 — 05/12/2005, 10:04 |
|