|
대표적인 것 몇가지를 적어보겠습니다.
1. 가장 정석적인 방법
상속을 받아서 처리하는거죠. TRichEdit는 결국 TWinControl을 상속받습니다. OnResize 이벤트의 경우 하위 컨트롤에는 있는 것인데 TRichEdit로 넘어오면서 감춰진거죠..
이렇게 하위 컨트롤에서 선언된 이벤트의 경우 TRichEdit를 상속받는 새로운 컨트롤을 하나 작성하면서 __published 영역에 TNotifyEvent OnResize; 라고 한 줄만 적어주면 지가 알아서 다 튀어 나옵니다. 이게 가장 정석적인 방법입니다.
2. 역시 상속을 받지만 직접 메시지 맵을 이용하는 방법
역시 상속받아서 새로운 컨트롤을 만들어야 합니다.
public 영역에
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SIZE, TMessage, WMSize);
END_MESSAGE_MAP(TRichEdit);
이런식으로 메시지 맵을 구성하고.. WMSize라는 맴버함수를 하나 구성해서 처리하는 방법입니다. 이 방법은 도움말을 보시면 금방 이해될겁니다.
3. WndProc를 갈아치우기
TControl을 상속받았다면 WndProc라는 멤버함수가 있습니다.
이넘을 오버로딩해서 처리할 수 있습니다.
4. WindowProc를 갈아치우기..
WindowProc라는 프라퍼티가 있습니다. 이걸 내가 만든 함수로 연결해서 처리할 수 있습니다.
기타등등..
이러한 방법들은 모두 클래스를 상속받아서 처리하는 방법이지만 꼭 그방법 밖에 없는건 아닙니다.
5. WindowProc 갈아치우기(외부에서)
권장할 만한 것은 아니지만 그래도 잘 됩니다.
1) TForm에 RichEdit 하나와 Memo를 하나 박아 넣죠
2) RichEdit의 앵커를 조정해서 폼사이즈 변화에 따라 같이 움직이게 해 놓고
3) Form 헤더 public 영역에 다음을 추가합니다.
void __fastcall RichResize(Messages::TMessage &Message);
TWndMethod OriginalWndProc;
4) Form의 생성자에
OriginalWndProc = RichEdit1->WindowProc;
RichEdit1->WindowProc = RichResize;
5) Form의 구현부에
void __fastcall TfrmMain::RichResize(Messages::TMessage &Message)
{
if (Message.Msg == WM_SIZE)
{
Memo1->Lines->Add("resize");
}
OriginalWndProc(Message);
}
이렇게 하시면 잘 될겁니다.
이 외에도 엄청 다양한 방법들이 있습니다.
하지만 대부분 어디서 윈도우의 메시지를 가로채느냐의 차이이지 근본적인 동작 원리는 같습니다.
VCL은 분명 매우 잘 설계된 라이브러리이지만 Win32의 구조에 대한 이해가 있을 때 보다 효과적으로 다룰 수 있는건 분명합니다. 애정을 가지고 차근차근 살펴보시면 좋은 결과 있을겁니다.
|