|
odyssey 님이 쓰신 글 :
: ===header file
: typedef void __fastcall (__closure *TViewMouseDown)(TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y, int ViewX, int ViewY);
:
: class PACKAGE TPanel1 : public TPanel
: {
: private:
: TPaintBox* FViewPaintBox;
:
: TViewMouseDown FViewMouseDown
:
: void __fastcall OnViewPaintBoxMouseDown(TObject *Sender,
: TMouseButton Button, TShiftState Shift, int X, int Y);
:
: __published:
: __property TViewMouseDown OnViewMouseDown = {read=FViewMouseDown,
: write=FViewMouseDown};
: }
: ===cpp file
: __fastcall TPanel1::TPanel1(TComponent* Owner)
: : TPanel(Owner)
: {
: .
: .
: FViewPaintBox->OnMouseDown = OnViewPaintBoxMouseDown;
: .
: .
: }
:
: 위와 같은 형태를 갖는 Component를 만든 후 사용하려 하는데요...
:
: 1. TPanel1이 Parent로 사용되고 실제로 모든 처리는
: TPaintBox control에서 처리하려고 해요..
: 2. 근데 TPanel, TPaintBox의 이벤트를 보면 Mouse에 대한 이벤트는 있는데
: Keyboard에 대한 이벤트는 없네요...
: 3. Keyboard 이벤트를 사용하려면 어떤 형식으로 해야 하나요...???
:
: 여기까지가 질문의 내용이구요...
:
: 즐거운 하루하루가 되세요... 날씨도 참 좋네요.... ^.^
:
임펠리테리입니다.
페인트박스와 같은 그래픽 컨트롤, 즉 윈도우컨트롤이 아닌 컨트롤은 윈도우메시지를 받을 수 없으므로 원래는 마우스메시지나 키보드메시지 양쪽 다 받을 수 없습니다. 윈도우핸들이 없으니 메시지를 받을 수 없는거죠. 그런데 보통 그래픽컨트롤의 경우에도 마우스이벤트가 존재하는 것을 볼 수 있는데, 이것은 직접 마우스 메시지를 받을 수는 없지만 대신 패어런트인 윈도우컨트롤에서 차일드컨트롤들 중 핸들이 없는 컨트롤들의 마우스 메시지들은 대신 처리해주기 때문입니다.
이와 같은 처리가 필요한 이유는 이해가 되시겠지요? 윈도우핸들이 없더라도 일단 컨트롤이라면 화면에 어떻게든 그려지기 때문에 그려지는 영역에 대한 마우스 클릭 등의 사건에 대해 처리해줄 필요가 있을 수 있기 때문입니다.
반면에, 키보드 메시지는 좀 다릅니다. 근본적으로 키보드메시지는 윈도우핸들이 없는 컨트롤이라면 포커스도 가질 수 없고, 그러므로 아예 키보드메시지를 받을 방법이 없습니다. 마우스메시지는 포커스를 가지지 않는 경우에라도 받을 수 있다는 점을 생각해보면 이해가 좀 빠르겠지요? 그래서 윈도우컨트롤이 아닌 컨트롤에는 마우스 이벤트는 있지만 키보드 이벤트는 없는 겁니다.
이제 패널에서 키보드 메시지를 처리하게 하는 방법을 알아보죠.
아주 간단합니다. 사실 키보드나 마우스 같은 메시지의 처리루틴은 아주 일반적이므로 TWinCotrol 클래스에도 기본적인 처리루틴이 있습니다. 단지 패널과 같은 컨트롤에서는 키보드이벤트가 필요가 없으므로 키보드 이벤트를 노출시키지 않았을 뿐이죠.(있긴 있습니다만 TWinControl에서 protected로 되어있어서 사용은 불가능합니다.)
그러므로 패널을 상속받은 컨트롤에서 키보드 이벤트를 처리하려면, 이들 키보드 이벤트들을 다시 __published로 재정의해주기만 하면 됩니다.
...
__published:
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
...
그럼 참고하시길...
|