下面我们开始分析源
![](/icons/63949chengxu.gif)
![](/icons/63949chengxu.gif)
属于Win32
![](/icons/63949chengxu.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949dou2.gif)
![](/icons/63949de.gif)
![](/icons/63949chengxu.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949chengxu.gif)
工程文件:FullScreenMode.cpp
#
![](/icons/63949define.gif)
#
![](/icons/63949include.gif)
#
![](/icons/63949include.gif)
#
![](/icons/63949include.gif)
#
![](/icons/63949include.gif)
#
![](/icons/63949include.gif)
//定义删除指针和释放对象
![](/icons/63949de.gif)
#
![](/icons/63949define.gif)
{
![](/icons/63949if.gif)
{
delete (p);
(p)=NULL;
}
}
#
![](/icons/63949define.gif)
{
![](/icons/63949if.gif)
{
(p)->Release
![](/icons/63949kh.gif)
(p)=NULL;
}
}
#
![](/icons/63949define.gif)
#
![](/icons/63949define.gif)
#
![](/icons/63949define.gif)
#
![](/icons/63949define.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949yi.gif)
#
![](/icons/63949define.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
#
![](/icons/63949define.gif)
上面出现
![](/icons/63949de.gif)
![](/icons/63949yi.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949chengxu.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou2.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
struct SPRITE_STRUCT
{
FLOAT fPosX; //sprite当前坐标
![](/icons/63949de.gif)
![](/icons/63949chushi.gif)
![](/icons/63949chushi.gif)
FLOAT fPosY; //sprite当前坐标
![](/icons/63949de.gif)
![](/icons/63949chushi.gif)
![](/icons/63949chushi.gif)
FLOAT fVelX; //sprite在x轴上
![](/icons/63949de.gif)
FLOAT fVelY; //sprite在y轴上
![](/icons/63949de.gif)
};
CDisplay* g_pDisplay = NULL; /*CDisplay就是ddutil.h(我们又新加入
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949yi.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
CSurface* g_pBackSurface = NULL; /* CSurface也是ddutil.h头文件中定义
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
CSurface* g_pLogoSurface = NULL; /*子画面图画指针*/
CSurface* g_pTextSurface = NULL; /*背景文本指针*/
BOOL g_bActive = FALSE; /*定义
![](/icons/63949yi.gif)
![](/icons/63949dou.gif)
![](/icons/63949yi.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949chengxu.gif)
DWORD g_dwLastTick; /*用于记录最后
![](/icons/63949yi.gif)
![](/icons/63949de.gif)
SPRITE_STRUCT g_Sprite[NUM_SPRITES]; /*定义多个子画面
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
Function-prototypes
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );//主窗口消息处理
![](/icons/63949hanshu.gif)
HRESULT WinInit( HINSTANCE hInst,
![](/icons/63949int.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
HRESULT InitDirectDraw( HWND hWnd );
VOID FreeDirectDraw
![](/icons/63949kh.gif)
HRESULT ProcessNextFrame
![](/icons/63949kh.gif)
VOID UpdateSprite( SPRITE_STRUCT* pSprite, FLOAT fTimeDelta );
HRESULT DisplayFrame
![](/icons/63949kh.gif)
HRESULT RestoreSurfaces
![](/icons/63949kh.gif)
WinMain
![](/icons/63949kh.gif)
Desc: Entry po
![](/icons/63949int.gif)
UpdateFrame
![](/icons/63949kh.gif)
![](/icons/63949int.gif)
![](/icons/63949int.gif)
{
MSG msg;
HWND hWnd;
HACCEL hAccel;
ZeroMemory( &g_Sprite,
![](/icons/63949sizeof.gif)
srand( GetTickCount
![](/icons/63949kh.gif)
![](/icons/63949de.gif)
![](/icons/63949if.gif)
![](/icons/63949return.gif)
![](/icons/63949if.gif)
{
MessageBox( hWnd, TEXT(\"DirectDraw init failed. \")
TEXT(\"The sample will now exit. \"), TEXT(\"DirectDraw Sample\"),
MB_ICONERROR | MB_OK );
![](/icons/63949return.gif)
}
g_dwLastTick = timeGetTime
![](/icons/63949kh.gif)
while( TRUE )
{
// Look for messages,
![](/icons/63949if.gif)
// update the state and display it
![](/icons/63949if.gif)
{
![](/icons/63949if.gif)
![](/icons/63949dd.gif)
{
// WM_QUIT was posted, so exit
![](/icons/63949return.gif)
![](/icons/63949int.gif)
}
// Translate and dispatch the message
![](/icons/63949if.gif)
![](/icons/63949dd.gif)
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
![](/icons/63949else.gif)
{
![](/icons/63949if.gif)
{
// Move the sprites, blt them to the back buffer, then
// flip or blt the back buffer to the primary buffer
![](/icons/63949if.gif)
![](/icons/63949kh.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
{
SAFE_DELETE( g_pDisplay );
MessageBox( hWnd, TEXT(\"Displaying the next frame failed. \")
TEXT(\"The sample will now exit. \"), TEXT(\"DirectDraw Sample\"),
MB_ICONERROR | MB_OK );
![](/icons/63949return.gif)
}
}
![](/icons/63949else.gif)
{
// Make sure we go to sleep
![](/icons/63949if.gif)
![](/icons/63949else.gif)
WaitMessage
![](/icons/63949kh.gif)
// Ignore time spent inactive
g_dwLastTick = timeGetTime
![](/icons/63949kh.gif)
}
}
}
}
WinInit
![](/icons/63949kh.gif)
Desc: Init the window
HRESULT WinInit( HINSTANCE hInst,
![](/icons/63949int.gif)
{
WNDCLASS wc;
HWND hWnd;
HACCEL hAccel;
// Register the Window Class 设置窗口类
wc.lpszClassName = TEXT(\"FullScreenMode\");
wc.lpfnWndProc = MainWndProc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInst;
wc.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_MAIN) );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
![](/icons/63949if.gif)
![](/icons/63949dd.gif)
![](/icons/63949return.gif)
// Load keyboard accelerators
hAccel = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_MAIN_ACCEL) );
// Create and show the
![](/icons/63949main.gif)
hWnd = CreateWindowEx( 0, TEXT(\"FullScreenMode\"), TEXT(\"DirectDraw FullScreenMode Sample\"),
WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL );
![](/icons/63949if.gif)
![](/icons/63949dd.gif)
![](/icons/63949return.gif)
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
*phWnd = hWnd;
*phAccel = hAccel;
![](/icons/63949return.gif)
}
InitDirectDraw
![](/icons/63949kh.gif)
Desc: Create the DirectDraw object, and init the surfaces
HRESULT InitDirectDraw( HWND hWnd )
{
HRESULT hr; //接受返回值
![](/icons/63949dou.gif)
LPDIRECTDRAWPALETTE pDDPal = NULL; //定义
![](/icons/63949chengxu.gif)
![](/icons/63949de.gif)
![](/icons/63949int.gif)
![](/icons/63949de.gif)
g_pDisplay =
![](/icons/63949new.gif)
![](/icons/63949kh.gif)
![](/icons/63949yi.gif)
![](/icons/63949if.gif)
![](/icons/63949chengxu.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou2.gif)
{
MessageBox( hWnd, TEXT(\"This display card does not support 1024x768x8. \"),
TEXT(\"DirectDraw Sample\"), MB_ICONERROR | MB_OK );
![](/icons/63949return.gif)
}
// Create and
![](/icons/63949set.gif)
![](/icons/63949if.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou2.gif)
![](/icons/63949return.gif)
![](/icons/63949if.gif)
![](/icons/63949de.gif)
![](/icons/63949chengxu.gif)
![](/icons/63949return.gif)
SAFE_RELEASE( pDDPal );//释放指针
// Create a surface, and draw a bitmap resource _disibledevent=>
![](/icons/63949if.gif)
![](/icons/63949return.gif)
![](/icons/63949if.gif)
![](/icons/63949return.gif)
// Create a surface, and draw text to it.
//创建文本表面
![](/icons/63949if.gif)
![](/icons/63949return.gif)
// Set the color key for the logo sprite to black
//设置色彩键码为黑色
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949de.gif)
![](/icons/63949if.gif)
![](/icons/63949return.gif)
![](/icons/63949if.gif)
![](/icons/63949return.gif)
// Init all the sprites. All of these sprites look the same,
// using the g_pDDSLogo surface.
for( iSprite = 0; iSprite < NUM_SPRITES; iSprite
![](/icons/63949jiajia.gif)
{
// Set the sprite\'s position and velocity
// 设置这些 sprite(小怪物)
![](/icons/63949de.gif)
![](/icons/63949chushi.gif)
g_Sprite[iSprite].fPosX = (float) (rand
![](/icons/63949kh.gif)
g_Sprite[iSprite].fPosY = (float) (rand
![](/icons/63949kh.gif)
// 速度也随机产生
g_Sprite[iSprite].fVelX = 500.0f * rand
![](/icons/63949kh.gif)
g_Sprite[iSprite].fVelY = 500.0f * rand
![](/icons/63949kh.gif)
}
![](/icons/63949return.gif)
}
FreeDirectDraw
![](/icons/63949kh.gif)
Release all the DirectDraw objects 释放所有指针
![](/icons/63949dou2.gif)
VOID FreeDirectDraw
![](/icons/63949kh.gif)
{
SAFE_DELETE( g_pBackSurface );
SAFE_DELETE( g_pLogoSurface );
SAFE_DELETE( g_pTextSurface );
SAFE_DELETE( g_pDisplay );
}
MainWndProc
![](/icons/63949kh.gif)
Desc: The
![](/icons/63949main.gif)
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch (msg)
{
![](/icons/63949case.gif)
switch( LOWORD(wParam) )
{
![](/icons/63949case.gif)
// Received key/menu command to exit app
PostMessage( hWnd, WM_CLOSE, 0, 0 );
![](/icons/63949return.gif)
}
![](/icons/63949break.gif)
![](/icons/63949case.gif)
// Hide the cursor in fullscreen
SetCursor( NULL );
![](/icons/63949return.gif)
![](/icons/63949case.gif)
// Check to see
![](/icons/63949if.gif)
![](/icons/63949if.gif)
![](/icons/63949dd.gif)
![](/icons/63949dd.gif)
g_bActive = FALSE;
![](/icons/63949else.gif)
g_bActive = TRUE;
![](/icons/63949if.gif)
g_pDisplay->UpdateBounds
![](/icons/63949kh.gif)
![](/icons/63949break.gif)
![](/icons/63949case.gif)
// Ignore time spent in menu
g_dwLastTick = timeGetTime
![](/icons/63949kh.gif)
![](/icons/63949break.gif)
![](/icons/63949case.gif)
// Ignore time spent resizing
g_dwLastTick = timeGetTime
![](/icons/63949kh.gif)
![](/icons/63949break.gif)
![](/icons/63949case.gif)
![](/icons/63949if.gif)
g_pDisplay->UpdateBounds
![](/icons/63949kh.gif)
![](/icons/63949break.gif)
![](/icons/63949case.gif)
// Prevent moving/sizing and power loss in fullscreen mode
switch( wParam )
{
![](/icons/63949case.gif)
![](/icons/63949case.gif)
![](/icons/63949case.gif)
![](/icons/63949case.gif)
![](/icons/63949return.gif)
}
![](/icons/63949break.gif)
![](/icons/63949case.gif)
// Cleanup and close the app
FreeDirectDraw
![](/icons/63949kh.gif)
PostQuitMessage( 0 );
![](/icons/63949return.gif)
}
![](/icons/63949return.gif)
}
ProcessNextFrame
![](/icons/63949kh.gif)
Desc: Move the sprites, blt them to the back buffer, then
flips the back buffer to the primary buffer
HRESULT ProcessNextFrame
![](/icons/63949kh.gif)
{
HRESULT hr;
// Figure how much time has passed since the last time
DWORD dwCurrTick = timeGetTime
![](/icons/63949kh.gif)
DWORD dwTickD
![](/icons/63949if.gif)
![](/icons/63949if.gif)
//计算当前时间 (dwCurrTick) 和最后
![](/icons/63949yi.gif)
![](/icons/63949de.gif)
// Don\'t update
![](/icons/63949if.gif)
![](/icons/63949if.gif)
![](/icons/63949if.gif)
![](/icons/63949dd.gif)
![](/icons/63949return.gif)
//如果
![](/icons/63949chengxu.gif)
g_dwLastTick = dwCurrTick; //使最后时间=当前时间
// Move the sprites according to how much time has passed
//根据时间
![](/icons/63949de.gif)
for(
![](/icons/63949int.gif)
![](/icons/63949jiajia.gif)
UpdateSprite( &g_Sprite[ iSprite ], dwTickD
![](/icons/63949if.gif)
// Display the sprites _disibledevent=>
![](/icons/63949if.gif)
![](/icons/63949kh.gif)
{
![](/icons/63949if.gif)
![](/icons/63949return.gif)
// The surfaces were lost so restore them
RestoreSurfaces
![](/icons/63949kh.gif)
}
![](/icons/63949return.gif)
}
UpdateSprite
![](/icons/63949kh.gif)
Desc: Move the sprite around and make it bounce based _disibledevent=> VOID UpdateSprite( SPRITE_STRUCT* pSprite, FLOAT fTimeDelta )
{
// Update the sprite position
pSprite->fPosX
![](/icons/63949jiadeng.gif)
pSprite->fPosY
![](/icons/63949jiadeng.gif)
// Clip the position, and bounce
![](/icons/63949if.gif)
![](/icons/63949if.gif)
{
pSprite->fPosX = 0;
pSprite->fVelX = -pSprite->fVelX;
}
![](/icons/63949if.gif)
{
pSprite->fPosX = SCREEN_WIDTH - 1 - SPRITE_DIAMETER;
pSprite->fVelX = -pSprite->fVelX;
}
![](/icons/63949if.gif)
{
pSprite->fPosY = 0;
pSprite->fVelY = -pSprite->fVelY;
}
![](/icons/63949if.gif)
{
pSprite->fPosY = SCREEN_HEIGHT - 1 - SPRITE_DIAMETER;
pSprite->fVelY = -pSprite->fVelY;
}
}
DisplayFrame
![](/icons/63949kh.gif)
Desc: Blts a the sprites to the back buffer, then flips the back buffer _disibledevent=> HRESULT DisplayFrame
![](/icons/63949kh.gif)
{
HRESULT hr;
// Fill the back buffer with black, ignoring errors until the flip
g_pDisplay->Clear( 0 ); //清空后备缓冲区表面
// Blt the help text _disibledevent=>
g_pDisplay->Blt( 0, 0, g_pBackSurface, NULL );
//将g_pTextSurface所指向
![](/icons/63949de.gif)
g_pDisplay->Blt( 10, 10, g_pTextSurface, NULL );
// Blt all the sprites _disibledevent=>
for(
![](/icons/63949int.gif)
![](/icons/63949jiajia.gif)
{
g_pDisplay->Blt( (DWORD)g_Sprite[iSprite].fPosX,(DWORD)g_Sprite[iSprite].fPosY,g_pLogoSurface, NULL );
}
// We are in fullscreen mode, so perform a flip and
![](/icons/63949return.gif)
// any errors like DDERR_SURFACELOST
//最关键
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949yi.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949if.gif)
![](/icons/63949kh.gif)
![](/icons/63949return.gif)
![](/icons/63949return.gif)
}
RestoreSurfaces
![](/icons/63949kh.gif)
Desc: Restore all the surfaces, and redraw the sprite surfaces.
HRESULT RestoreSurfaces
![](/icons/63949kh.gif)
{
HRESULT hr;
LPDIRECTDRAWPALETTE pDDPal = NULL;
![](/icons/63949if.gif)
![](/icons/63949kh.gif)
![](/icons/63949kh.gif)
![](/icons/63949return.gif)
// No need to re-create the surface, just re-draw it.
![](/icons/63949if.gif)
![](/icons/63949return.gif)
// We need to release and re-load, and
![](/icons/63949set.gif)
// redraw the bitmap _disibledevent=>
![](/icons/63949if.gif)
![](/icons/63949return.gif)
![](/icons/63949if.gif)
![](/icons/63949return.gif)
SAFE_RELEASE( pDDPal );
// No need to re-create the surface, just re-draw it.
![](/icons/63949if.gif)
![](/icons/63949return.gif)
![](/icons/63949return.gif)
}
好了
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949chengxu.gif)
![](/icons/63949dou.gif)
![](/icons/63949chengxu.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949de.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou.gif)
![](/icons/63949dou2.gif)
![](/icons/63949de.gif)
最新评论