因为界面方面只需要一个对话框或者托盘形式的,所以不想用MFC。但希望封装性好一点,应用程序类也能从CWinApp派生,请问哪位大侠有CWinApp的实现?

解决方案 »

  1.   

    不想用MFC?但想从CWinApp派生?
    CWinApp就是MFC中的一个类啊
    具体实现可以查看MFC的源码
      

  2.   

    可以去看看 c++ in action(c++实践之路)
    下面是一个实现,摘自《windows游戏编程》
    //Application.h
    #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;}
    };
      

  3.   

    //CApplication.cpp#include "CApplication.h"
    #include <windows.h>/************************************************************
    *   函数名: CApplication(...) 属于CApplication类的成员
    *     功能: 构造函数
    * 参数说明:
    *     bFullScr 是否全屏
    *     ScrW     客户区的宽度(全屏时就是屏幕的宽度)
    *     ScrH     客户区的高度(全屏时就是屏幕的高度)
    *************************************************************/
    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 窗口的类型
    *************************************************************/
    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 的值与对应的消息有关。
    *************************************************************/
    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类的成员
    * 功能: 主窗口消息循环
    *       
    **********************************************************/
    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;
    }
      

  4.   

    回复:i_noname
         我的意思是说自己实现一个CWinApp类。回复:yuelinsoft
         哥们,多谢了!!!