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 함수에 대한 헬프를 찾아서 참고하시기 바랍니다.
그럼 이만...
|