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

C++빌더 FAQ
C++Builder Programming FAQ
[26] [VCL][WIN32 API] 윈도우 컨트롤의 서브클래싱 (컨트롤의 메세지 가로채기)
이기주 [lkj900] 19186 읽음    2001-07-05 13:52
아래의 예는 Edit 컨트롤에 없는 이벤트인 SETFOCUS이벤트를 사용하도록 하는 방법입니다.

그리고 서브클래싱의 리턴을위해 Dispatch(메세지)를 사용하였습니다.

저는 WindowsProc()보다는 Dispatch(메세지)를 주로 사용합니다.

이것을 사용해 해당메세지를 처리하고 내가 구현하고자하는 동작을 넣을 수도 있으며,

내가 구현하고자 하는 동작을 넣고, 다시 원래의 메세지 처리를 하도록 할 수 도 있습니다.

Edit나 Memo의 경우 아래의 서브클래싱을 사용하여,

SETFOCUS 메세지처리시 CreateCaret() API함수를 사용하여케럿(caret)의 모양등을 바꿔줄 수 도 있고,

아예 케럿을 없앨 수도 있습니다.

---------------------------------- 코딩 *.CPP ---
...

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Edit1->WindowProc=NewEditProc;    // 새로운 처리함수 연결
}


void __fastcall TForm1::NewEditProc(TMessage &Message) // 새로운 처리함수 코딩
{

    if (Message.Msg == WM_SETFOCUS)
    {

        Edit1->Dispatch(&Message); // 기존의 메세지 처리 (경우에 따라 처리)

        // 새로운 코딩   

        Edit1->Dispatch(&Message); // 기존의 메세지 처리 (경우에 따라 처리)

    }
    else
    {
        Edit1->Dispatch(&Message); // 기존의 메세지 처리
    }
}

...


-------------------------------------- 선언 *.H ---
...

class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TEdit *Edit1;
    void __fastcall FormCreate(TObject *Sender);

    void __fastcall NewEditProc(TMessage &Message);    // 새로운 처리함수 선언

private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};

...

+ -

관련 글 리스트
26 [VCL][WIN32 API] 윈도우 컨트롤의 서브클래싱 (컨트롤의 메세지 가로채기) 이기주 19186 2001/07/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.