📄 demo.cpp
字号:
KeyFlag=8;
else if(KeyFlag==4)
KeyFlag=11;
else if(KeyFlag==8)
KeyFlag=8;
else if(KeyFlag==11)
KeyFlag=11;
else
KeyFlag=7;
break;
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_KEYUP:
switch(wParam)
{
case VK_UP:
KeyFlag-=1;
SpriteCountY=3;
break;
case VK_LEFT:
KeyFlag-=7;
SpriteCountY=3;
break;
case VK_DOWN:
KeyFlag-=4;
SpriteCountY=3;
break;
case VK_RIGHT:
KeyFlag-=2;
SpriteCountY=3;
break;
}
break;
case WM_DESTROY://销毁窗口消息
MID_Close();
KillTimer(hWnd,0);
FreeObjects();
PostQuitMessage(0);
break;
}
//调用缺省的过程处理过程
return DefWindowProc(hWnd, message, wParam, lParam);
}
//******************************************************************
//函数:InitWindow()
//功能:创建主窗口。
//******************************************************************
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASS wc; //窗口类结构
//填充窗口类结构
wc.style = 0;
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//选择黑色刷做为窗口背景
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASSNAME;
//注册窗口类
RegisterClass( &wc );
//创建主窗口
hWndMain= CreateWindowEx(
0,
CLASSNAME, //窗口的类名称,必须与上面的wc.lpszClassName一致
TITLE, //窗口的标题名
WS_POPUP,
0,
0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL,
NULL,
hInstance,
NULL );
if( !hWndMain ) return FALSE;
//显示并更新窗口
ShowWindow( hWndMain, nCmdShow );
UpdateWindow( hWndMain );
return TRUE;
}
//******************************************************************
//函数:InitDDraw()
//功能:初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区)
// 以及创建一个定时器。
//******************************************************************
BOOL InitDDraw(void)
{
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
HRESULT ddrval;
//创建DirectDraw对象
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval != DD_OK )
return FALSE;
//取得全屏独占模式
ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if( ddrval != DD_OK )
return FALSE;
//设置显示器显示模式为640x480x8
ddrval = lpDD->SetDisplayMode( WIDTH, HEIGHT, 16);
if( ddrval != DD_OK )
return FALSE;
//填充换页链结构
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
//指定后台缓冲区数量为1
ddsd.dwBackBufferCount = 1;
//创建换页链,包括了主页面及其后台缓冲区
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval != DD_OK )
return FALSE;
//获得指向后台缓冲区的页面指针
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
if( ddrval != DD_OK )
return FALSE;
//创建离屏页面
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = 640;
ddsd.dwHeight = 480;
if (lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK)
return FALSE;
if (lpDD->CreateSurface(&ddsd, &lpDDSPic2, NULL) != DD_OK)
return FALSE;
//从磁盘文件中载入调色板
// lpDDPal = DDLoadPalette(lpDD, "001.bmp");
//将调色板设置给主页面
// if (lpDDPal)
// lpDDSPrimary->SetPalette( lpDDPal );
//调用页面初始化函数
if( !InitSurfaces() )
return FALSE;
return TRUE;
}
//******************************************************************
//函数:WinMain()
//功能:应用程序入口
//******************************************************************
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
hInst=hInstance;
//初始化主窗口
if (!InitWindow( hInstance, nCmdShow))
return FALSE;
//初始化DirectDraw环境
if (!InitDDraw())
{
MessageBox(hWndMain, "初始化DirectDraw过程中出错!", "Error", MB_OK);
FreeObjects();
DestroyWindow(hWndMain);
return FALSE;
}
//进入消息循环
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(bActive)
{
UpdateFrame();
}
else WaitMessage();
}
return msg.wParam;
}
//******************************************************************
//函数:InitSurfaces()
//功能:初始化页面图象
//******************************************************************
BOOL InitSurfaces( void )
{
HBITMAP hbm,hbm1;
//从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
hbm = (HBITMAP)LoadImage(hInst, "002.bmp", IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
hbm1 = (HBITMAP)LoadImage(hInst, "001.bmp", IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if (hbm == NULL)
return FALSE;
DDCopyBitmap(lpDDSPic1, hbm, 0, 0, 640, 480);
DDCopyBitmap(lpDDSPic2, hbm1, 0, 0, 640, 480);
DDSetColorKey(lpDDSPic2, RGB(255,0,255));//CLR_INVALID);
//释放hbm位图对象
DeleteObject(hbm);
return TRUE;
}
//更新屏幕
void UpdateFrame( void )
{
HRESULT ddrval;
//计算刷新率
static int fps=0, frame=0, nt=0, ot=0;
frame++;
nt=timeGetTime();
if (nt > ot+1000)
{
ot=nt;
fps=frame;
frame=0;
}
//计算图象卷轴的坐标数据
static n=320;
RECT srect, drect, srect2, drect2;
MakeRect(&srect, SpriteX[SpriteCountX], SpriteY[SpriteCountY],SpriteX[SpriteCountX]+48, SpriteY[SpriteCountY]+48);
MakeRect(&drect, 300, 200, 348, 248);
MakeRect(&srect2, 0, 0, 384, 192);
MakeRect(&drect2, 0, 0, 384, 192);
/* n++;
if (n>1280) n=n-1280;
if (n>521)
{
MakeRect(&srect, 0, 0, 1280-119-n, 246);
MakeRect(&drect, n-521, 0, 1280-119-n, 246);
MakeRect(&srect2, n-640, 0, 640, 480);
MakeRect(&drect2, 0, 0, 1280-n, 480);
}
else
{
MakeRect(&srect, 521-n, 0, 521, 246);
MakeRect(&drect, 0, 0, n, 246);
MakeRect(&srect2, 0, 0, n, 480);
MakeRect(&drect2, 640-n, 0, 640, 480);
}*/
//清屏后台缓冲区
DDBLTFX ddBltFx;
ddBltFx.dwSize = sizeof(DDBLTFX);
ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(255,0,255));
lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
//将背景图象Blit到后台缓冲区
lpDDSBack->Blt(&drect2, lpDDSPic1, &srect2, DDBLT_WAIT, NULL);
//将前景图象透明Blit到后台缓冲区
// lpDDSBack->Blt(&drect, lpDDSPic2, &srect,DDBLT_WAIT|DDBLT_KEYSRC,NULL);
lpDDSBack->BltFast(StaticX+X,StaticY+Y,lpDDSPic2,&srect,DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
//打印刷新率fps
HDC hdc;
char temp[32];
lpDDSBack->GetDC(&hdc);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(0,255,0));
sprintf(temp, "fps=%d", fps);
TextOut(hdc, 0, 0, temp, strlen(temp));
lpDDSBack->ReleaseDC(hdc);
// 换页
while( 1 )
{
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );//调用换页函数
if( ddrval == DD_OK )//成功则退出while循环
break;
else if( ddrval == DDERR_SURFACELOST )//如果页面丢失,则恢复页面,再继续while循环
RestoreAll();
else
break;
}
}
void MakeRect(RECT *rect, long left, long top, long right, long bottom)
{
rect->left=left;
rect->top=top;
rect->right=right;
rect->bottom=bottom;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -