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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[371] [WINAPI]윈도우 프로시져(WndProc) 캡슐화하기;
류진주 [ypenguin] 9439 읽음    2002-10-17 22:01
제가 이걸 구현하려고 참.. 많이도 고생했는데..-_- 얼마전에 구입한 책을 보니..나와있네요 -__-;


VCL에 보면 WndProc이 캡슐화 되어있죠?;

API로 그런것을 구현한겁니다 -_-a

출처는 OpenGL Game Programming이구요, 소스는-_-제가 쓰던거에서..

기본적인 작동 원리는,

1. WNDCLASS 구조체의 cbWndExtra = 4를 해서 4바이트 여분 메모리를 생성하구요

WNDCLASS WndClass;
WndClass.cbWndExtra = 4;
...
RegisterClass(&WndClass);
---------------------------------------------------------------------------------------
2. CreateWindow(Ex)의 '마지막 인자'에 클래스의 포인터를 주고요(원래는 CREATESTRUCT),

CreateWindowEx(0, WindowName.c_str(),WindowName.c_str(),WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,640,480,
    NULL,(HMENU)NULL,Instance, (void *)POGLW_Iterator[0]); // 메인윈도 생성

POGLW_Iterator[0]이 클래스의 포인터입니다. 클래스 내에서 CreateWindow를 사용하는것이면,
this를 주면 됩니다.
---------------------------------------------------------------------------------------
3. static멤버인 WndProc에서는

LRESULT CALLBACK POpenGLWindows::WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  PMessage Messages(hWnd, Message, wParam, lParam); // TMessage와 비슷합니다. WndProc의 파라
  //메터들이 들어있습니다....-_-a;

  POpenGLWindows *POGLWnd = (POpenGLWindows*)GetWindowLong(hWnd, 0); // 0번째 오프셋이
  //바로 여분의 메모리.

  if( (POGLWnd == NULL) && (Message != WM_CREATE) ) // 여분의 메모리는 0으로 초기화됩니다.
  {
    return DefWindowProc(hWnd, Message, wParam, lParam);
  }
  else if((Message == WM_CREATE) && (POGLWnd == NULL))
  {
    // 이부분이 핵심 -_-;;;;;;;;
    SetWindowLong(hWnd, 0, (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
    // CreateWindow 의 마지막인자로 준 포인터값은, lParam으로 넘어옵니다. 그걸 이용한것..-_-a

    POGLWnd = (POpenGLWindows *)GetWindowLong(hWnd, 0);
    POGLWnd->Handle = hWnd;
    POGLWnd->WndProc(Messages);
  }
  else if(POGLWnd != NULL)  POGLWnd->WndProc(Messages);

  if(Messages.MsgNotProcessed) return DefWindowProc(hWnd, Message, wParam, lParam);
}
---------------------------------------------------------------------------------------

POGLWnd->WndProc(&Messages);



이게 바로 캡슐화된 프로시져구요, 이렇게하면.. 좋은점은..-_-a 그냥 클래스멤버에 접근이 편리한 정도..--

TForm::WndProc(TMessage &Message); 랑 모양이 똑같죠 ^-^(-_-..... 이상한거 해놓고 좋아하는..)

음 잘 전달이 되었을지..-_-a;;

제가 머리가 나쁜지-_- 이걸로 한참 고생을 했거든요..-_-;;;

그래서 함 올려봅니다;
정재필 [zgdr7th]   2002-10-23 09:01 X
오... 이런 방법이 있었군요. 전 VC로 VCL 구조를 구현한다고 템플릿 노가다를 했었는데...
정재필 [zgdr7th]   2002-10-23 09:01 X
이 방법으로 템플릿 딱 한 번만 쓰고 가능하네요...(TApplication 구현할 때 템플릿 한 번 쓰고)^^
정재필 [zgdr7th]   2002-10-23 09:01 X
덕분에 제 소스가 정말 간결해졌네요^^ 좋은 팁 감사^^
jack [ukurere]   2002-11-22 15:03 X
정말 이름이 류진주 세요? +_+
유진주 [ypenguin]   2002-11-22 15:15 X
퉷 -_-
수야!╋ [sooya23]   2005-04-23 10:59 X
퉷 ㅡ0ㅡ;;; ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

+ -

관련 글 리스트
371 [WINAPI]윈도우 프로시져(WndProc) 캡슐화하기; 류진주 9439 2002/10/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.