TCustomControl i obsługa klawiatury

0

Tworzę właśnie swój komponent, jednak pojawił mi się mały problem. Wszystkie właściwości dziedziczy od TCustomControl. Problem pojawia się przy obsłudze komunikatu WM_KEYDOWN. Otóż, gdy wciśniemy klawisz TAB lub którąkolwiek strzałkę, to komponent tego komunikatu nie otrzymuje (dostaje jedynie WM_KEYUP po zwolnieniu przycisku). Tak, czy inaczej, wciśnięcie któregokolwiek z tych klawiszy powoduje uaktywnienie następnego komponentu na formularzu, co zupełnie mija się z celem. TEdit - obiekt pochodzący z TWinControl (TCustomControl tez z niego pochodzi) ma w sobie pełną obsługę strzałek (nie powodują one przechodzenia do następnego komponentu). TRichEdit przechwytuje także TAB. W jaki sposób przekształcić komponent tak, by w pełni obsłużyć WM_KEYDOWN w przypadku strzałek i klawisza TAB? Czy ktoś może spotkał się już z tym problemem?

0

Ok, juz sobie poradzilem :)

Jak ktos spotka sie z tym samym problemem, to daje rozwiazanie:

w pliku naglowkowym

w sekcji protected:
void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
void __fastcall CMWantSpecialKey(TCMWantSpecialKey &Message);

i tuz przed "};"

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_WANTSPECIALKEY, TCMWantSpecialKey, CMWantSpecialKey)
END_MESSAGE_MAP(TCustomControl)

w pliku cpp

void __fastcall TMyControl::CMWantSpecialKey(TCMWantSpecialKey &Message)
{
if(Message.CharCode == VK_TAB)
TForm::Dispatch((void*)&Message);
else Message.Result = 1;
}

i teraz w funkcji

void __fastcall TMyControl::KeyDown(Word &Key, Classes::TShiftState Shift)
{
if (Key == VK_DOWN)
{
// mozemy juz obsluzyc strzaleczki :)
}
}


Jesli natomiast potrzebujemy rowniez obsluzyc TAB i Shift+TAB, to trzeba uzyc tej samej techniki, tylko w CMWantSpecialKeys musimy zwrocic Message.Result = 1 dla VK-TAB, wiec po prostu:

void __fastcall TMyControl::CMWantSpecialKey(TCMWantSpecialKey &Message)
{
Message.Result = 1;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1