..
이것 옛날에 한참 삽질해서 찾아낸 팁으로 좀 갈켜주기 아까운 팁인데...
ㅋㅋ 농담이구요..
vcl WinControl의 key입력 동작
Form위에 여러 컨트롤이 있을때
TMemo , TEdit 등에 키입력을 받는 control에 focus가 있는 않는경우에
(TButton , TPanel 등...)
방향키를 입력하면 다음 또는 이전 Control로 focus가 이동합니다.
(tab이나 shift-tab을 클릭한 것 처럼...)
--------------------------------------------------------------
그 이유는?
VCL에서는 PeekMessage로 시스템 메세지 큐에서 메세지를 가져온후에
곧바로 해당 윈도우프로시져로 Dispatch하지 않고
앞에 몇단계 거칩니다.
Application.OnMessage핸들러 호출
hint체크 dialog체크 , key체크 등..
그런후에 해당 윈도우프로시져로 Dispatch 하죠
그중에 Key메세지인경우 CN_BASE+Message 로 메세지를 변경하여
wincontrol에 던져봅니다.
이때 Edit 나 Memo등은 false를 return_하지만
Panel같은 놈은 true를 return하여 KeyBoard를 메세지를 받지 않고
다음 WinControl이 select되게 됩니다.
------------------------------------------------------------------------
TButton / TPanel 등 에서 키보드 입력 받으려면
결론적으로 Panel같은 놈에서 방향키나 키보드 메세지를 받으려면
다음과 같이 CN_BASE+Key_message를 return해주면 됩니다.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OrgPanelProc=Panel1->WindowProc;
Panel1->WindowProc=PanelProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PanelProc(TMessage &Msg)
{
// TPanel 컨트롤에서 키보드 입력을 받게하고
// Tab 및 방향키 같은것을 받을수 있도록 ...
// if (Msg.Msg >= (CN_BASE +WM_KEYFIRST)) and (Msg.Msg <= (CN_BASE +WM_KEYLAST)) then Exit;
if(Msg.Msg==CN_KEYDOWN)return;
OrgPanelProc(Msg);
}
위와같이 하면 TPanel에 focus가 가 있는 상태에서 방향키를 click하여도 다른 control로 focus가 넘어가지 않고
panel에서 keyboard메세지를 받을수 있습니다.
그럼...
용맨소녀 님이 쓰신 글 :
: 방향키를 누르면 이미지를 이동 출력하는 기능을 만들고 있는데..
:
: 해당 폼에 TTrackBar나 TScrollBar같은게 있으면 문제가 생기는군요..
:
: 어쩌다 포커스가 그런 컨트롤에 있으면 TrackBar나 ScrollBar가 작동합니다..
:
: 포커스가 안가게 TabStop도 설정하고 그러는데, 툴을 다루다보면 어쩌다 포커스가 가는 경우가 있더라고요..
:
: 쌈박하게 한 방에 해결하는 방법이 없을까요?