C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[25944] Re:[질문] TCustomControl 에서 SetFocus 메시지가 안잡히는데요.
임문환.실업자 [] 1103 읽음    2003-06-15 05:17
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가 있다면 그들을 정확히 선언해주어야 합니다.



+ -

관련 글 리스트
25943 [질문] TCustomControl 에서 SetFocus 메시지가 안잡히는데요. Kenny 799 2003/06/15
25944     Re:[질문] TCustomControl 에서 SetFocus 메시지가 안잡히는데요. 임문환.실업자 1103 2003/06/15
25947         DoEnter, OnEnter를 못 쓴 이유.... Kenny 766 2003/06/15
25951             Re:DoEnter, OnEnter를 못 쓴 이유.... 임문환.실업자 866 2003/06/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.