windows游戏编程- CApplication类

/*--------------------------------------------------------
|           Application.h
|     Application类的相关处理功能的声明
|           (c)  mochsh
----------------------------------------------------------*/

#include <windows.h>

class    CApplication
{
protected:
    //是否是全屏模式
    int     m_bFullScreen;
    //窗口客户区宽度
    int     ScreenW;
    //窗口客户区高度
    int     ScreenH;
    //窗口背景画刷
    int     ClientBKColor;
    //是否可以改变窗口大小的属性变量
    int     Change_Size_Able;
    //是否使用鼠标指针
    int     Show_Mouse_Cursor;
    //窗口的激活状态
    BOOL    bActive;
    //窗口客户区的相对于屏幕左上角的位置
    RECT    rectWin;

    //窗口图标
    HICON   hIcon;
    //窗口光标
    HICON   hCursor;
    //窗口菜单
    HMENU   hMenu;
    //窗口句柄
    HWND    hWnd;

public:
    //构造函数
    CApplication( void );
    CApplication( int bFullScr, int ScrW, int ScrH );

    //设置窗口的属性函数
    void isFullScreen( BOOL bFScr ){m_bFullScreen = bFScr;}
    void SetScreenW( int ScrW )    {ScreenW = ScrW;}
    void SetScreenH( int ScrH )    {ScreenH = ScrH;}
    void ChangeSizeAble(int ChAble){Change_Size_Able = ChAble;}
    void ShowMouseCursor(int M)    {Show_Mouse_Cursor = M;}
    void SetClientBKColor(int C)   {ClientBKColor = C;}
    //设置应用程序的图标
    void Set_hIcon( HINSTANCE hInstance, WORD Icon )
    {
        hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(Icon));
    }
    //设置应用程序的光标
    void Set_hCursor( HINSTANCE hInstance, WORD Cursor )
    {
        hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(Cursor));
    }
    //设置应用程序的菜单
    void Set_hMenu(  HINSTANCE hInstance, WORD Menu )
    {
        hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(Menu));
    }

    //创建窗口
    HWND CreateWin( WNDPROC WinProc,
                    HINSTANCE hInstance,
                    TCHAR* WindowName,
                    DWORD winStyle);

    //处理主窗口消息
    LRESULT MsgProc(HWND hWnd,
                    UINT uMsg,
                    WPARAM wParam,
                    LPARAM lParam );

    //默认消息循环机制
    int RunDefault(void);

    // 外部调用成员变量
    int  Get_m_bFullScreen(void)    {return m_bFullScreen;}
    int  Get_ScreenW(void)          {return ScreenW;}
    int  Get_ScreenH(void)          {return ScreenH;}
    int  Get_ClientBKColor(void)    {return ClientBKColor;}
    int  Get_Change_Size_Able(void) {return Change_Size_Able;}
    int  Get_Show_Mouse_Cursor(void){return Show_Mouse_Cursor;}
    BOOL Get_bActive(void)          {return bActive;}
    RECT Get_rectWin(void)          {return rectWin;}
    HICON Get_hIcon(void)           {return hIcon;}
    HICON Get_hCursor(void)         {return hCursor;}
    HMENU Get_hMenu(void)           {return hMenu;}
    HWND Get_hWnd(void)             {return hWnd;}
};

----------------------------------------------------------------------------------------------------------

/*------------------------------------------------------
|               CApplication.cpp
|        CApplication类的成员的源代码
|            版权所有  mochsh, 2004
--------------------------------------------------------*/

#include "CApplication.h"
#include <windows.h>

/************************************************************
*   函数名: CApplication(...) 属于CApplication类的成员
*     功能: 构造函数
* 参数说明:
*     bFullScr 是否全屏
*     ScrW     客户区的宽度(全屏时就是屏幕的宽度)
*     ScrH     客户区的高度(全屏时就是屏幕的高度)
*       版权所有 mochsh, 2004
*************************************************************/
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;
}


/************************************************************
*    函数名: CreateWin(...) 属于CApplication类的成员
*      功能: 定义并且创建应用程序窗口,显示窗口
*  参数说明:
*   WinProc 窗口的消息处理函数名
*   hInstance 窗口实例句柄
*   WindowName 窗口的名字和注册名字
*   winStyle 窗口的类型
*       版权所有 mochsh, 2004
*************************************************************/
HWND CApplication::CreateWin( WNDPROC WinProc,
                              HINSTANCE hInstance,
                              TCHAR* WindowName,
                              DWORD winStyle)
{
    WNDCLASS wc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = WindowName;
    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, "注册窗口类出错!","Error!", 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, "创建窗口出错!","Error!", 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, "创建窗口出错!","Error!", 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;
}

/************************************************************
*   函数名: MsgProc(...) 属于CApplication类的成员
*     功能: 处理主窗口消息
*   参数说明:
*       hWnd 表示对应窗口的句柄。
*       uMsg 传送给消息处理函数的消息。
*       wParam和lParam 的值与对应的消息有关。
*           版权所有 mochsh, 2004
*************************************************************/
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);
}

/*********************************************************
*    函数名: RunDefault(...) 属于CApplication类的成员
*    功能: 主窗口消息循环
*       版权所有 mochsh, 2004
**********************************************************/
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;
}


转载于:https://www.cnblogs.com/maoyinghui/archive/2009/04/23/1442112.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值