視窗:遊戲基類CApplication(.cpp)(二乙)

本文介绍了一个游戏应用程序基类CApplication的实现细节,包括如何根据全屏或窗口模式初始化窗口,注册窗口类,创建窗口,并处理各种Windows消息。

 視窗:遊戲基類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//////////////////////////////////////////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值