⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdxwin.cpp

📁 一个Direct3DRM的包装类的例子
💻 CPP
字号:
/*========================================================================*/
/*                                                                        */
/* WinMain() and other Win32 support functions.                           */
/*                                                                        */
/*========================================================================*/

#define INITGUID            /*  Don't use pre-compiled header!! INITGUID is a once only!  */
#include <windows.h>
#include <d3drmwin.h>
#include <dinput.h>
#include "cdxapp.h"

LONG FAR PASCAL CDXWindowProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam )
{
    /*  Our window proc  */

    RECT                    r;
    PAINTSTRUCT             ps;
    LPDIRECT3DRMWINDEVICE   pD3DRMWinDev;
    HRESULT                 err;

    /*  General trap when our application pointer has yet to be created  */

    if ( !pApp )
    {
        return( ::DefWindowProc(hWnd,msg,wParam,lParam) );
    }

    switch( msg )
    {
        case WM_ENTERMENULOOP:
        {
            pApp->PauseApp( TRUE );
            return( ::AppWindowProcHook(hWnd,msg,wParam,lParam) );
            break;
        }
        case WM_EXITMENULOOP:
        {
            pApp->PauseApp( FALSE );
            return( ::AppWindowProcHook(hWnd,msg,wParam,lParam) );
            break;
        }
        case WM_SIZE:
        {
            if ( wParam==SIZE_MINIMIZED ) pApp->SetMinimized(TRUE); else
            {
                if ( wParam!=SIZE_MAXHIDE ) pApp->SetMinimized(FALSE);
            }
            return( ::AppWindowProcHook(hWnd,msg,wParam,lParam) );
            break;
        }
        case WM_DESTROY:
        {
            pApp->SetQuit();
            break;
        }
        case WM_ACTIVATE:
        {
            pApp->SetActive( (LOWORD(wParam)==WA_INACTIVE)?FALSE:TRUE );
            if ( !pApp->IsInitialised() || !pApp->Get3DDevice() )
            {
                return( ::AppWindowProcHook(hWnd,msg,wParam,lParam) );
            }

            if ( (err=pApp->Get3DDevice()->QueryInterface(IID_IDirect3DRMWinDevice,(void **)&pD3DRMWinDev))!=D3DRM_OK )
            {
                pApp->ErrHandler( "WindowProc()","Query Interface (IDirect3DRMWinDevice)",err );
                break;
            }
            if ( (err=pD3DRMWinDev->HandleActivate((WORD)wParam))!=D3DRM_OK )
            {
                pApp->ErrHandler( "WindowProc()","HandleActivate Failed",err );
            }
            RELEASE( pD3DRMWinDev );
            break;
        }
        case WM_PAINT:
        {
            if ( !pApp->IsInitialised() || !pApp->Get3DDevice() || pApp->IsMinimised() )
            {
                return( ::DefWindowProc(hWnd,msg,wParam,lParam) );
            }

            if ( ::GetUpdateRect(hWnd,&r,FALSE) )
            {
                ::BeginPaint( hWnd,&ps );
                if ( (err=pApp->Get3DDevice()->QueryInterface(IID_IDirect3DRMWinDevice,(void **)&pD3DRMWinDev))!=D3DRM_OK )
                {
                    pApp->ErrHandler( "WindowProc()","QueryInterface (IDirect3DRMWinDevice)(2)",err );
                }
                else
                {
                    if ( (err=pD3DRMWinDev->HandlePaint(ps.hdc))!=D3DRM_OK )
                    {
                        pApp->ErrHandler( "WindowProc()","HandlePaint() Failed",err );
                    }
                    RELEASE( pD3DRMWinDev );
                }
                ::EndPaint( hWnd,&ps );

                /*  Try rendering a frame (probably just first time)  */

                pApp->RenderFrame();
            }
            break;
        }
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
        case WM_MOUSEMOVE:
        {
            pApp->m_bLeftButton     = (wParam&MK_LBUTTON?TRUE:FALSE);
            pApp->m_bRightButton    = (wParam&MK_RBUTTON?TRUE:FALSE);
            pApp->m_nMouseX         = LOWORD(lParam);
            pApp->m_nMouseY         = HIWORD(lParam);
            break;
        }
        default:
            return( ::AppWindowProcHook(hWnd,msg,wParam,lParam) );
    }

    return( ::AppWindowProcHook(hWnd,msg,wParam,lParam) );
}

int PASCAL WinMain( HINSTANCE thisInstance, HINSTANCE prevInstance, LPSTR lpszCmdLine, int nCmdShow )
{
    /*  Win32 entry point and message loop despatcher  */

    MSG             msg;
    int             nFailedCount=0;
    BOOL            bIdle;

    /*  Instantiate our application object  */

    pApp = new CDXApp( thisInstance,prevInstance,lpszCmdLine,nCmdShow );

    if ( !pApp || !pApp->IsInitialised() )
    {
        /*  Ouch!  */

#ifdef _DEBUG
        ::OutputDebugString( "Error, unable to initialise CDXApp object!\n\r" );
#endif
        return( 1 );
    }

    /*  Simply continue to render until quit  */

    while ( !pApp->IsQuitting() )
    {
        /*  Translate and despatch messages  */

        bIdle = TRUE;
        while ( ::PeekMessage(&msg,NULL,0,0,PM_REMOVE) )
        {
            bIdle = FALSE;
            if ( msg.message==WM_QUIT ) break;

            if ( !::TranslateAccelerator(msg.hwnd,pApp->GetAccelerator(),&msg) )
            {
                ::TranslateMessage( &msg );
                ::DispatchMessage( &msg );
            }
        }

        /*  Render as long as initialised, not quit, paused or minimised  */

        if ( pApp->IsInitialised() && !pApp->IsQuitting() && !pApp->IsPaused() && !pApp->IsMinimised() )
        {
            /*  Don't render if fullscreen and not active  */

            if ( pApp->IsFullScreen() && !pApp->IsActive() ) continue;


            /*  Invoke idle hook  */

            if ( bIdle ) AppIdleHook();

            /*  And finally, render...  */

            if ( !pApp->RenderFrame() )
            {
                /*  Abort if 2 failed attempts to render  */

                if ( ++nFailedCount > 2 )
                {
#ifdef _DEBUG
                    ::OutputDebugString( "Error! Failure to render 2 successive frames!\n\r" );
#endif
                    break;
                }
            }
        }
    }

    /*  Destroy our objects  */

    delete pApp;
    pApp=NULL;

    return( msg.wParam );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -