J2Y
Win32 API
API 세미나 실습 파일2 :) FrameWork.cpp, FrameWork.h
imj2y
2008. 7. 22. 09:37
FrameWork.cpp
#include ".\framework.h" #include "./global.h" CFrameWork *pFrameWork; HWND g_hWnd; CFrameWork::CFrameWork(void) { } CFrameWork::CFrameWork(HINSTANCE hInst) :m_hInst(hInst) { pFrameWork = this; } CFrameWork::~CFrameWork(void) { } LRESULT CALLBACK CFrameWork::StaticWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { return pFrameWork->WndProc(hWnd, msg, wParam, lParam); } LRESULT CALLBACK CFrameWork::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // Message 처리함수 시작 // 사용자와 시스템의 메세지 처리 switch( msg ) { case WM_DESTROY: PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } BOOL CFrameWork::InitApplication(void) { // 윈도우 구조체에 각각의 특성을 정의 WNDCLASSEX wcx; wcx.cbSize = sizeof(wcx); wcx.style = CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc = (WNDPROC)CFrameWork::StaticWndProc; wcx.cbClsExtra = 0; wcx.cbWndExtra = 0; wcx.hInstance = this->m_hInst; wcx.hIcon = LoadIcon(NULL,IDI_APPLICATION); wcx.hCursor = LoadCursor(NULL,IDC_ARROW); wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wcx.lpszMenuName = NULL; wcx.lpszClassName = "TEST"; wcx.hIconSm = NULL; return RegisterClassEx(&wcx); // 위의 윈도우 클래스를 레지스터에 등록 } BOOL CFrameWork::InitInstance(void) { this->m_hWnd = CreateWindow ("TEST", "Hello Win32", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, this->m_hInst, NULL); if (!this->m_hWnd) return FALSE; g_hWnd = this->m_hWnd; ShowWindow(this->m_hWnd, SW_SHOW); return TRUE; } BOOL CFrameWork::Run(void) { MSG msg; // 게임루프 초기화 실패시 FALSE 반환 if(!this->GameLoopInit()) return false; PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); while(WM_QUIT != msg.message) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { this->GameLoop(); } } return true; } bool CFrameWork::GameLoopInit(void) { this->m_Debug.Init(); return true; } void CFrameWork::GameLoop(void) { this->m_Debug.CalculateFPS(); this->m_Debug.ShowFPS(); }
FrameWork.h
#pragma once //#include <windows.h> #include "./std.h" #include "./Debug.h" class CFrameWork { private: // 윈도우의 인스턴스(윈XP에서 보내주는 작업할 창의 인덱스번호) HINSTANCE m_hInst; // 윈도우의 기능을 사용하기 위한 도구(이것은 핸들이라고 함) HWND m_hWnd; public: // 윈도우 창의 초기설정을 WNDCLASSEX에 담아 윈도우 레지스터에 저장한다. // 구분은 lpszClassName으로 한다. // 자세한 것은 API 정복 참조 BOOL InitApplication(void); // 윈도우를 생성한다. 레지스터에 등록된 데이터를 바탕으로 하여 여러 옵션을 설정한 후 // 윈도우 생성 -> hWnd(윈도우 핸들 값이 반환된다.) BOOL InitInstance(void); // 메세지 루프 BOOL Run(void); // 게임 루프 초기화 bool GameLoopInit(void); // 게임 루프 void GameLoop(void); public: // 메세지를 처리하는 CALLBACK 함수 // CALLBACK 함수는 어떤 함수가 실행되면 반드시 자동으로 실행되는 함수를 뜻하는 말 // CALLBACK 함수는 반드시 Static이어야 한다. // 아래의 경우는 static과 그냥 함수를 같이 써놨는데 // 그 이유는 같은 클래스 안에 있더라도 static 영역에 선언된 함수는 // 설정된 메모리 영역이 다르기 때문에 클래스의 멤버를 참조할 수 없다. // 그래서 약간의 편법을 사용하여 static영역에 넘어온 데이터를 클래스에 // 선언된 또 다른 프로시져 함수로 값을 넘겨 멤버도 참조 할 수 있도록 하였음. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); public: // Cdebug 선언 CDebug m_Debug; public: CFrameWork(HINSTANCE hInst); CFrameWork(void); virtual ~CFrameWork(void); };
공유하기
게시글 관리
J2Y
티스토리툴바