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
[22166] Re: 방법은 수도 없이 많습니다만..
김상구.패패루 [peperu] 861 읽음    2002-10-22 14:45
대표적인 것 몇가지를 적어보겠습니다.

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의 구조에 대한 이해가 있을 때 보다 효과적으로 다룰 수 있는건 분명합니다. 애정을 가지고 차근차근 살펴보시면 좋은 결과 있을겁니다.

+ -

관련 글 리스트
22149 폼에 있는 컴포넌트의 사이즈(넓이,높이)가 변경될때의 이벤트 받기에 대해서... 사랑방 735 2002/10/22
30973     Re:폼에 있는 컴포넌트의 사이즈(넓이,높이)가 변경될때의 이벤트 받기에 대해서... 강재호.만해 681 2002/10/22
22166     Re: 방법은 수도 없이 많습니다만.. 김상구.패패루 861 2002/10/22
22189         많은 도움주셔서 감사 합니다. 그런데 다른 문제가??? 주희 617 2002/10/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.