성호님 덕분에 해결할 수 있겠네요.. 지금까지 만들 때마다 계속 이 문제가 걸려도 그냥 넘어갔었는데..
장성호 님이 쓰신 글 :
: ..
: 이것 옛날에 한참 삽질해서 찾아낸 팁으로 좀 갈켜주기 아까운 팁인데...
: ㅋㅋ 농담이구요..
:
:
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도 설정하고 그러는데, 툴을 다루다보면 어쩌다 포커스가 가는 경우가 있더라고요..
: :
: : 쌈박하게 한 방에 해결하는 방법이 없을까요?