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
[25] [VCL][WIN32 API] 컨트롤의 메시지 가로채기 (윈도우프로시저 교체)
박지훈.임프 [cbuilder] 21868 읽음    2001-03-24 13:50
pulyip 님이 쓰신 글 :
: CBuilder를 쓰면서 좀 불편했던 점인데요...
:
: VC의 경우에는 각 위젯(컨트롤)당 메시지 핸들러를 삽입 할 수 있는데요..
:
: CBuilder에서는 상속에 의한 방법 아니면... 메시지 핸들러를 삽입을 못하나요?
:
: 아무리 컴포넌트 지향이라지만 메시지 핸들러삽입은 좀 번거롭네요....
:
: 정의된 메시지 핸들러 속성(__property) 외에는 메시지 핸들러를 사용하지 못하나요?
:
: 방법이 있음 좀 알려 주세요...
:


임펠리테리입니다.

C++Builder는 컴퍼넌트 기반의 RAD툴이기도 하지만 그 이전에 Win32 C++ 컴파일러입니다. 컴퍼넌트 기반 프로그래밍 인터페이스로는 직접 메시지핸들러로 접근할 방법이 없지만 Win32 api를 그대로 쓸 수 있으므로 api 레벨에서 접근하면 됩니다. api 함수 SetWindowLong()은 윈도우의 메시지를 처리하는 내부 함수인 윈도우 프로시저를 바꿔치울 수 있게 해줍니다. 구체적인 방법은 다음과 같습니다.

WNDPROC FOriginalProc;

LRESULT CALLBACK NewWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case 별도로처리할메시지1:
        ...
        break;

        case 별도로처리할메시지2:
        ...
        break;

        default:
        return CallWindowProc((FARPROC)FOriginalProc, hWnd, uMsg, wParam, lParam);
    }
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{

    FOriginalProc = (WNDPROC)SetWindowLong(메시지를수정할컨트롤->Handle, GWL_WNDPROC, (LONG)NewWinProc);
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    SetWindowLong(메시지를수정할컨트롤->Handle, GWL_WNDPROC, (LONG) FOriginalProc);
}

좀더 자세한 내용은 SetWindowLong(), GetWindowLong(), WindowProc() 등의 API 함수에 대한 헬프를 찾아서 참고하시기 바랍니다.

그럼 이만...

+ -

관련 글 리스트
25 [VCL][WIN32 API] 컨트롤의 메시지 가로채기 (윈도우프로시저 교체) 박지훈.임프 21868 2001/03/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.