📄 cdxwin.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 + -