일반적인 윈도 생성 순서
일반적인 윈도 생성
MFC에 의해서 제공되는 모든 윈도 클래스는 2단계로 생성된다. C++의 new 라는 생성자를 호출하게 되면 생성자는 C++ 객체를 할당하고 초기화 시킨다. 그러나 이 객체에 대응하는 Windows는 생성하지 않는다. window의 생성은 create 함수를 호출한 다음에 일어난다.
Create 멤버 함수는 윈도를 생성하며 윈도의 HWND를 C++ 객체 내부의 public data인 m_hWnd 안에 저장한다. Create 함수의 파라메터들은 유연성을 가지고 있다. Create를 하기 전에 frame의 아이콘과 클래스 스타일을 지정하 수 있다. 이를 위해서 윈도 클래스를 등록 시킬수 있는데, 전역 함수인 AfxRegisterWndClass를 호출 하면 된다.
Frame 윈도의 경우에는 Create함수 대신에 LoadFrame 멤버 함수를 호출한다. LoadFrame 함수는 Create보다 파라메터가 적다. 또한 대부분이 resource에서 제공하는 default 값을 사용한다.
WM_NCCREATE
윈도가 생성될때 WM_CREATE가 전해지기전, 가장 먼저 전해지는 메시지이다.
WM_CREATE
WM_CREATE 메시지는 응용프로그램이 윈도가 생성(CreateWidnow, CreateWidnowEx )되기를 요청할때 보내진다. 새로운 윈도의 윈도프로시져는 윈도가 생성된 다음에 이 메시지를 받게 된다. 그러나 아직 보여지지는( visible ) 않은 상태이다. 이 메시지는 CreateWindowinEx또는 CreateWindow함수가 리턴 되기 전에 보내진다.
afx_msg BOOL OnNcCreate( LPCREATESTRUCT lpCreateStruct )
Framework은 CWnd가 생성될때 WM_CREATE가 전해지기 전에 먼저 이 함수를 호출한다.
This member function is called by the framework to allow your application to handle a Windows message. The parameters passed to your function reflect the parameters received by the framework when the message was received. If you call the base-class implementation of this function, that implementation will use the parameters originally passed with the message and not the parameters you supply to the function.
Each class derived from CWnd adds its own functionality to its override of PreCreateWindow. By design, these derivations of PreCreateWindow are not documented. To determine the styles appropriate to each class and the interdependencies between the styles, you can examine the MFC source code for your application's base class. If you choose to override PreCreateWindow, you can determine whether the styles used in your application's base class provide the functionality you need by using information gathered from the MFC source code.
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct )
이 함수는 응용프로그램이 윈도를 생성하기를 요청할때 framework에 의하여 호출된다. CWnd 객체가 생성된후 아직 화면상엔 나타나지 않은 상태에 이 함수의 호출을 받게 된다. 이 함수는 Create나 Create 멤버 함수가 리턴 되기전에 호출된다.
virtual BOOL PreCreateWindow( CREATESTRUCT& cs )
CWnd 객체내부에 존재하는 window의 생성 전에 framework에 의해서 호출된다. 절대로 직접 호출해서는 안된다.
The default implementation of this function checks for a NULL window class name and substitutes an appropriate default.
윈도가 생성되기전 CREATESTRUCT를 수정하고 싶다면 이 함수를 오버라이드하자.