視窗:遊戲基類CApplication(.cpp),可用之
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////// CApplication.cpp ///////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "CApplication.h"
CApplication::CApplication(int bFullScr, int ScrW, int ScrH)
{
m_bFullScreen = bFullScr;
//全屏模式
if(bFullScr)
{
if(ScrW >= 1024)
{
ScreenW = 1024;
ScreenH = 768;
}
else if(ScrW >= 800)
{
ScreenW = 800;
ScreenH = 600;
}
else
{
ScreenW = 640;
ScreenH = 480;
}
}
//窗口模式
else
{
ScreenW = ScrW;
ScreenH = ScrH;
}
bActive = FALSE;
hWnd = NULL;
Show_Mouse_Cursor = TRUE;
Change_Size_Able = FALSE;
ClientBKColor = WHITE_BRUSH;
hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
hMenu = NULL;
}
//構造函數重載
CApplication::CApplication(void)
{
m_bFullScreen = FALSE;
ScreenW = 640;
ScreenH = 480;
bActive = FALSE;
hWnd = NULL;
Show_Mouse_Cursor = TRUE;
Change_Size_Able = TRUE;
ClientBKColor = WHITE_BRUSH;
hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
hMenu = NULL;
}
//
HWND CApplication::CreateWin(WNDPROC WinProc,
HINSTANCE hInstance,
TCHAR * WindowName,
DWORD winStyle)
{
WNDCLASS wc;
wc.hInstance = hInstance;
wc.lpszClassName = WindowName;
//wc.lpfnWndProc = (WNDPROC)WndProc;
wc.lpfnWndProc = WinProc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hIcon = hIcon;
wc.hCursor = hCursor;
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(ClientBKColor);
if(!RegisterClass(&wc))
{
MessageBox(NULL, "註冊窗口類出錯!", "錯誤", MB_OK);
return FALSE;
}
//全屏模式
if(m_bFullScreen == TRUE)
{
hWnd = CreateWindow(WindowName,
WindowName,
WS_POPUP,
0,
0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,
hMenu,
hInstance,
NULL);
if(!hWnd)
{
MessageBox(NULL, "創建窗口出錯!", "錯誤", MB_OK);
return FALSE;
}
}
//窗口模式
else
{
hWnd = CreateWindowEx(0,
WindowName,
WindowName,
winStyle,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
hMenu,
hInstance,
NULL);
if(!hWnd)
{
MessageBox(NULL, "創建窗口出錯!", "錯誤", MB_OK);
return FALSE;
}
//獲取屏幕大小
int Win_W = GetSystemMetrics(SM_CXSCREEN);
int Win_H = GetSystemMetrics(SM_CYSCREEN);
//計算窗口居中之左上角位置
int x1 = (Win_W - ScreenW) / 2;
int y1 = (Win_H - ScreenH) / 2;
//據上值調整窗口位置
SetWindowPos(hWnd,
HWND_NOTOPMOST,
x1,
y1,
ScreenW,
ScreenH,
SWP_HIDEWINDOW);
//獲取客戶區相對屏幕左上角之位置
GetClientRect(hWnd, &rectWin);
ClientToScreen(hWnd, (LPPOINT)&rectWin);
ClientToScreen(hWnd, (LPPOINT)&rectWin + 1);
}
ShowWindow(hWnd, SW_NORMAL);
UpdateWindow(hWnd);
return hWnd;
}
//主窗口之消息處理
LRESULT CApplication::MsgProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
//窗口激活狀態消息處理
case WM_ACTIVATEAPP:
bActive = (BOOL)wParam;
break;
//滑鼠指針移動處理
case WM_SETCURSOR:
if(!Show_Mouse_Cursor)
{
SetCursor(NULL);
return true;
}
break;
//窗口大小改變消息處理
case WM_SIZE:
if(!Change_Size_Able)
{
if(m_bFullScreen == 0)
{
//獲取窗口客戶區的屏幕坐標系位置
GetClientRect(hWnd, &rectWin);
ClientToScreen(hWnd, (LPPOINT)&rectWin);
ClientToScreen(hWnd, (LPPOINT)&rectWin + 1);
}
}
break;
//窗口位置改變之消息處理
case WM_MOVE:
if(m_bFullScreen == 0)
{
//獲取窗口客戶區的屏幕坐標系位置
GetClientRect(hWnd, &rectWin);
ClientToScreen(hWnd, (LPPOINT)&rectWin);
ClientToScreen(hWnd, (LPPOINT)&rectWin + 1);
}
break;
//窗口最大最小尺寸消息處理
case WM_GETMINMAXINFO:
//不可改變窗口的大小
if(!Change_Size_Able)
{
PMINMAXINFO pMM = (PMINMAXINFO)lParam;
//獲取橫向、縱向邊框寬度和標題欄高度
int FrameW = GetSystemMetrics(SM_CXSIZEFRAME);
int FrameH = GetSystemMetrics(SM_CYSIZEFRAME);
int CapH = GetSystemMetrics(SM_CYCAPTION);
//把窗口能被改變到的最小尺寸改爲以前之值
pMM->ptMinTrackSize.x = ScreenW + FrameW * 2;
pMM->ptMinTrackSize.y = ScreenH + FrameH * 2 + CapH;
//把窗口能被改變到的最大尺寸改爲與最小尺寸相同之值
pMM->ptMaxTrackSize.x = pMM->ptMinTrackSize.x;
pMM->ptMaxTrackSize.y = pMM->ptMinTrackSize.y;
}
else
{
PMINMAXINFO pMM = (PMINMAXINFO)lParam;
//限制窗口能被改變到的最小尺寸
pMM->ptMinTrackSize.x = 100;
pMM->ptMinTrackSize.y = 150;
}
break;
//關閉窗口消息處理
case WM_CLOSE:
DestroyWindow(hWnd);
break;
//銷毀窗口消息處理
case WM_DESTROY:
PostQuitMessage(0);
break;
}
//默認消息處理
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//默認消息循環機制
int CApplication::RunDefault(void)
{
MSG msg;
msg.message = WM_NULL;
while(msg.message != WM_QUIT)
{
if(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
/////////////////////////////////////////////////////////////////eof//////////////////////////////////////////////////////////////////////////////