#include <afxwin.h>
// MFC를 사용해서 윈도우 프로그램을 작성할 때는 반드시 <afxwin.h> 헤더를 포함시킨다.
#include "Cmmsdk.h"
#include "CmmsdkDef.h"
/*
class CMyWindow : public CWnd
// CWnd의 파생 클래스를 생성.
// PostNcDestroy라는 가상 함수를 재정의. 윈도우가 파괴될 때 MFC 프레임워크에 의해 호출된다.
{
public:
virtual void PostNcDestroy();
};
void CMyWindow::PostNcDestroy()
{
delete this; // 창을 닫을 시 자신의 메모리를 삭제
}
*/
class CMainFrame : public CFrameWnd
// MFC로 윈도우 창을 만들기 위해서는 CFrameWnd에서 파생된 클래스를 만들어야 한다.
{
};
class CMFCTest : public CWinApp
// MFC는 CWinApp라는 클래스를 제공하는데, MFC를 사용하는 모든 윈도우 프로그램은
// CWinApp 클래스의 파생클래스를 반드시 1개 만들어야 한다.
{
public:
virtual BOOL InitInstance();
virtual BOOL ExitInstance();
};
BOOL CMFCTest::InitInstance()
// CWinApp 클래스는 InitInstance() 라는 가상 함수를 제공하며,
// 사용자는 반드시 이 가상함수를 재정의해서 응용 프로그램의 초기화 코드를 만든다.
// 초기화에 성공하면 TRUE를, 실패하면 FALSE를 리턴한다.
// 함수를 재정의 할 때는 CWinApp::InitInstance()를 먼저 한번 호출해야 한다.(언어 관련 리소스 초기화)
{
CWinApp::InitInstance();
//==================================================
// CWnd 윈도우 1
//==================================================
CMainFrame* pFrame = new CMainFrame;
// 사용자가 만든 클래스에 대해서 new를 사용해 객체를 생성한다.
// MFC가 종료될 때 new를 이용해 할당받은 메모리는 자동으로 소거되므로 delete해주지 않아도 된다.
m_pMainWnd = pFrame;
// CWinApp의 멤버 변수인 m_pMainWnd에 반드시 사용자가 만든 윈도우 객체의 주소를 넣어야 한다.
// 윈도우 생성 이후 MFC가 해당 포인터 변수를 이용해 몇 가지 작업을 자동으로 수행한다.\
pFrame->Create( 0, "MFC 테스트!!" );
// 실제 윈도우를 생성하는 함수. 첫 번째 인자에는 윈도우 클래스 이름이 들어가며,
// 0이 전달되면 MFC가 내부적으로 윈도우 클래스를 등록해서 사용하게 된다.
pFrame->ShowWindow( SW_SHOW );
// 윈도우를 보여주기 위해 꼭 사용해야 하는 함수.
// SW_SHOW 부분은 바꾸어서 창의 크기를 조절하는 등의 변경이 가능
pFrame->UpdateWindow();
// 생략해도 되나, 이 함수를 호출해 주면 조금 빠르게 동작하는 것 처럼 보일 수 있다.
/*
//==================================================
// CWnd 윈도우 2
//==================================================
CString classname = AfxRegisterWndClass(
CS_HREDRAW | CS_VREDRAW,
LoadStandardCursor( IDC_ARROW ),
( HBRUSH )::GetStockObject( WHITE_BRUSH ), // WinAPI 함수이므로 앞에 스코프 연산자(::)를 붙인다.
LoadStandardIcon( IDI_APPLICATION ) );
// CFrameWnd를 사용해서 윈도우를 만들 경우 사용자가 직접 윈도우 클래스를 만들지 않아도 MFC가 내부적으로 등록
// CWnd클래스를 사용해서 윈도우를 만들 경우 반드시 윈도우 클래스를 먼저 등록.
// 윈도우 클래스 스타일, 커서, 배경 브러시, 아이콘
CMyWindow * pWnd = new CMyWindow;
pWnd->CreateEx( 0, classname, "CWnd로 만든 윈도우", WS_OVERLAPPEDWINDOW, CRect( 0, 0, 300, 300 ), 0, 0 );
// 확장 윈도우 스타일, 윈도우 클래스 이름(윈도우2), 타이틀 문자열,
// 윈도우 스타일, 윈도우 위치 및 크기, 부모 윈도우 포인터, ID
pWnd->ShowWindow( SW_SHOW );
pWnd->UpdateWindow();
// 화면상에 출력
*/
if( cmmLoadDll() == TRUE ) // DLL로딩 함수 실행
{
AfxMessageBox( "DLL 로딩에 성공하였습니다!!" );
}
else
{
AfxMessageBox( "DLL 로딩에 실패하였습니다!!" );
AfxGetMainWnd()->SendMessage( WM_CLOSE ); // 종료 메시지 보냄
}
return TRUE;
}
BOOL CMFCTest::ExitInstance()
{
cmmUnloadDll();
return CWinApp::ExitInstance();
}
CMFCTest test;
// 사용자가 만든 파생클래스에 대해서 객체를 전역적으로 한 개만 생성해야 한다.
/*
MFC는 내부적으로 WinMain() 함수를 제공한다.
*/