|
Kenny 님이 쓰신 글 :
: TCustomControl을 상속받아 에디터를 만들고 있습니다.
:
: 좀 특수한 에디터라 Memo나. RichEdit 등은 상속받아봐야 쓸모가 없고...
:
: 암튼.. Caret을 출력하기 위해
:
: Focus를 잡으려 하는데요.. Focus들어오면 Caret이 보이고 나가면 안보이고..
:
: 근데.. Message를 Mapping해도 WM_SETFOCUS가 안잡히는군요.
:
: 동일한 형식으로 WM_SIZE나 기타 메시지는 잘 잡히는데 유독 WM_SETFOCUS만 안되네요.
:
: 게시판 검색해서 모두 살펴봐도 뭐가 잘못된건지......
:
: 아래는 골격입니다. 좀 도와주셨으면 합니다..
:
:
: /////////////////////////////////////////popedit.h
:
: #ifndef PopEditH
: #define PopEditH
: //---------------------------------------------------------------------------
: #include <SysUtils.hpp>
: #include <Classes.hpp>
: #include <Controls.hpp>
: //---------------------------------------------------------------------------
: class PACKAGE TPopEdit : public TCustomControl
: {
: private:
: MESSAGE void __fastcall WMSetFocus(TWMSetFocus &Message);
: MESSAGE void __fastcall WMKillFocus(TWMKillFocus &Message);
:
: protected:
: public:
: __fastcall TPopEdit(TComponent* Owner);
: __fastcall ~TPopEdit();
: __published:
:
:
: BEGIN_MESSAGE_MAP
: //VCL_MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize);
: VCL_MESSAGE_HANDLER(WM_SETFOCUS, TWMSetFocus, WMSetFocus);
: VCL_MESSAGE_HANDLER(WM_KILLFOCUS, TWMKillFocus, WMKillFocus);
: END_MESSAGE_MAP(TCustomControl);
: };
: //---------------------------------------------------------------------------
: #endif
:
: ////////////////////////////////////////popedit.cpp
: #include <vcl.h>
:
: #pragma hdrstop
:
: #include "PopEdit.h"
: #pragma package(smart_init)
: //---------------------------------------------------------------------------
: // ValidCtrCheck is used to assure that the components created do not have
: // any pure virtual functions.
: //
:
: static inline void ValidCtrCheck(TPopEdit *)
: {
: new TPopEdit(NULL);
: }
: //---------------------------------------------------------------------------
: __fastcall TPopEdit::TPopEdit(TComponent* Owner)
: : TCustomControl(Owner)
: {
:
: }
: __fastcall TPopEdit::~TPopEdit()
: {
: }
: //---------------------------------------------------------------------------
: namespace Popedit
: {
: void __fastcall PACKAGE Register()
: {
: TComponentClass classes[1] = {__classid(TPopEdit)};
: RegisterComponents("Samples", classes, 0);
: }
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TPopEdit::WMSetFocus(TWMSetFocus& message)
: {
: Application->MessageBox("got", "aha", MB_OK);
: }
:
: void __fastcall TPopEdit::WMKillFocus(TWMKillFocus& message)
: {
: Application->MessageBox("lost", "aha", MB_OK);
: }
:
:
:
아래와 같이 해보세요.
DoEnter와 OnEnter 위주로 설명하겠습니다. DoExit와 OnExit도 같은 맥락입니다.
TWinControl에 보면 DoEnter 메서드와 OnEnter __property가 있습니다.
응용 프로그램이 WM_SETFOCUS 메시지를 가져오든 받든하면 TWinControl 내부에 구현된 기작에 따라 DoEnter가 호출되고, OnEnter 이밴트 핸들러가 등록되어 있는 경우 DoEnter 메서드 내에서 그 핸들러를 호출하도록 되어 있는 구조입니다.
OnEnter 이밴트 핸들러는 일반적으로 TWinControl을 상속받아 만든 컨트롤(TPopEdit)을 사용하는 쪽에서 등록합니다(TCustomControl이 TWinControl을 상속받은 것이므로 TCustomControl을 상속받았으면 자동으로 TWinControl도 상속받은 것임).
DoEnter를 오버라이드하시되 그 메서드 내에서 조상 클래스인 TWinControl의 DoEnter를 호출해주면 됩니다.
그리고 TabStop 속성을 사용하시되 값을 true로 해주어야 합니다.
1. DoEnter를 오버라이드하여 그 메서드 내에서 필요한 작업을 하고 조상 클래스의 DoEnter를 호출
2. OnEnter,OnExit,TabStop을 비롯한 조상 클래스에 있는 속성들로서 오브젝트 인스펙터를 통하여 사용할 수 있게 할 모든 속성들을 __published 영역에 열거(예: __property OnEnter;).
물론, TPopEdit에서 새로 만든 __property가 있다면 그들을 정확히 선언해주어야 합니다.
|