① 응용 프로그램 클래스 정의
② 메인(=프레임) 윈도우 클래스 정의
③ 응용 프로그램 객체 선언
④ 메시지 맵 선언
// mfc
// c++은하나로묶여있지만..
#include <afxwin.h>
// 응용프로그램클래스를선언한다.
// WinMain 역할을담당한다.
// CWinApp 상속받아 사용해야 한다.
class CHelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
// 재정의된함수
// 초기화 하는 함수이다. 반드시 재정의 해야한다.
// 반드시 해야하는 함수는 virtual이 붙어 있다.
};
// 메인윈도우클래스를선언한다.
// 윈도우에대한생성, 메시지처리등을묶어서가지고있음
// c++에서프로시저역활을담당한다.
// sdk는스위치로나눴는데여기서는????
// 대시에매시지맵이존재한다.
class CMainFrame : public CFrameWnd
{
public:
CMainFrame();
protected:
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
// 메시지핸들러함수
DECLARE_MESSAGE_MAP()
};
// 응용프로그램객체를선언한다.
// mfc예제는객체가하나가있어야사용이된다.
// 가장먼저시작. 응용프로그램의 객체이다.
// ******* 여기서부터프로그램이시작이되는것이다.******
// 이거는힙? 스택??
CHelloApp theApp;
// 2번째로실해된다.
// 응용프로그램클래스를정의한다.
// winmain에서윈도우생성, 화면에출력하는것만정의했다.
// 나머지는??
// 출력전에윈도우를정의해야하는데보이지않는다??
// - > cWinApp 안에서물려받은것을그대로사용한다.
// 메시지루프는어디에???
// 이것도역시cWinApp안에서물려받는다.
// 모든윈도우프로그램은api함수를사용해야한다.
BOOL CHelloApp::InitInstance()
{
//동적으로 생성된다.
// 동적할당되면힙에저장된다.
m_pMainWnd = new CMainFrame; // -> create하고 다음으로
m_pMainWnd->ShowWindow(m_nCmdShow);
// 이것은전역함수가아니라,cWin의mfc 클래스의멤버함수이다.
// 내부적으로는api함수를호출한다.
// 본래showwindow는2개지만, 현재는윈도우핸들이없다
// 대신에윈도우를가리키는윈도우의객체가있다.
return TRUE;
}
// 메인윈도우클래스를정의한다.
// 이제생성자로넘어간다.
// createwindow 와대응된다.
CMainFrame::CMainFrame()
{
Create(NULL, "HelloMFC Application");
// 이것역시멤버함수이다.
// 역시내부적으로는api를사용, 사용하기쉽게하기위해서.
// 원래인자가11개인데-> 2개만
// 기본인자, 디폴드함수로있어서...
}
// 화면을 출력하기 위함이다.
// sdk보다 간단하다. 객체를 사용해 멤버함수로 호출한다.
// 반드시 DC 가 필요하다. sdk에서는 begin paint end... 여기선 객체로
// 출력에 관한 함수를 클래스에 묶어두어 사용하기편하다.
void CMainFrame::OnPaint()
{
char *msg = "Hello, MFC";
CPaintDC dc(this);
dc.TextOut(100, 100, msg, lstrlen(msg));
}
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// mfc 멤버함수이다. api 함수보다 심플하다.
MessageBox("마우스를클릭했습니다.", "마우스메시지");
}
// 이것은매크로로되어서전처리기가처리한다.
// 그래서개념만파악하면알아서
// 메시지맵을선언한다.
// 메시지핸들러가2개니깐2개밖에없다
// 더추가할려면더추가해야한다.
// DECLARE_MESSAGE_MAP() 이것을통해서사용이가능하다.
// 메시지맵이있어야지메시지를처리할수있다.
// CMainFrame - 메인 프레임의 메시지 핸들러이다.
// 윈도우마다 메시지 맵을 따로 정의해야한다.
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// 매크로이다, 코드를 간략하기 위함이다.
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()