컴포넌트를 만들고 계시는것 같으데요
몇가지 참고글을 적으면..
1. WM_KEYDOWN 메세지를 써야하는것이 맞는것 같구요
2. CM_xxx , CN_xxx 는
VCL에서 만들어낸 메세지거나, 필요에 의해 변경한 메세지 입니다.
3. 그리고..
MESSAGE_MAP을 이용하여 메세지를 sub-classing 하는것 보다
이미 TControl 클래스에서 WM_KEYDOWN관련 메세지는 처리되어있습니다.
그것을 오버라이딩 해서 쓰는것이 더 좋을것 같습니다.
그래야 OnKeyDown이벤트 등 기타 동작코딩을 따로 해주지 않아도 간단히 처리할수 있기 때문이죠
DYNAMIC void __fastcall KeyDown(System::Word &Key, Classes::TShiftState Shift);
위와 같이 TWinControl에 Dynamic( Virtual로 비슷한 놈임) 으로 선언되어있으니
이놈을 똑같이 DYNAMIC 키워드를 써어 오버라이딩 해서 컴포넌트를 만들면 좋을것 같습니다.
그럼..
박목월 님이 쓰신 글 :
: 우선 헤더파일엔 아래처럼 되어있습니다
:
: typedef void (__closure *KeyInput)(System::TObject *Sender, Word &Key);
: class PACKAGE TPangyas : public TCustomControl
: {
: private:
: KeyInput FKeyDown;
: protected:
:
:
: public:
: __fastcall TPangyas(TComponent* Owner);
: MESSAGE void __fastcall VNKey_Downs(TMessage &Message);
: BEGIN_MESSAGE_MAP
: MESSAGE_HANDLER(CM_APPKEYDOWN,TMessage,VNKey_Downs);
: END_MESSAGE_MAP(TCustomControl)
:
: __published:
: __property KeyInput OnKeyDowns = {read=FKeyDown,write=FKeyDown};
: };
:
: 그리거 cpp파일엔 이렇게 되어있습니다
:
: static inline void ValidCtrCheck(TPangyas *)
: {
: new TPangyas(NULL);
: }
: //---------------------------------------------------------------------------
: __fastcall TPangyas::TPangyas(TComponent* Owner)
: : TCustomControl(Owner)
: {
: }
: //---------------------------------------------------------------------------
: namespace Pangyas
: {
: void __fastcall PACKAGE Register()
: {
: TComponentClass classes[1] = {__classid(TPangyas)};
: RegisterComponents("Standard", classes, 0);
: }
: }
: //---------------------------------------------------------------------------
: MESSAGE void __fastcall TPangyas::VNKey_Downs(TMessage &Message)
: {
: if(FKeyDown)
: FKeyDown(this,Message.WParamLo);
:
: 이렇게 해뒀습니다
: 그런대해보니 동작이 되지 않습니다
: CN_KEYDOWN 메시지로해봐도그렇고요
: CM_MOUSEENTER 로 해보니 잘되더군요
: 근데 키입력이 CN_KEYDOWN이 맞는건가요? 키입력 이벤트는 어떤걸써야되는지요
: 위소스에서 잘못된 부분은 어떤것인지 잘못된거면
: 어떻게 수정해야되는지 알려주세요
: 자꾸 이것만 건드리고있는데 당췌 안되네요