您的位置:首页 > 其它

Windows API初步实现游戏界面

2014-05-02 10:24 162 查看
首先将位图资源载入工程

具体实现方法:Insert > Resource > Import 载入位图资源,保存成xxx.rc资源文件,最后编译资源文件,发现左下角会多出一个Resource View选项卡,接着为每个资源取一个容易记忆的ID,这样就将位图资源载入工程了。

下面用LoadBitmap将资源中的文件载入程序,示例代码如下:

HBITMAP bmp_ground=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_GROUND);


双缓冲技术

要在屏幕上显示位图需要用到双缓冲技术,即在一个设备描述表上创建一个与此兼容的设备描述表,然后在这个兼容的设备描述表上创建兼容的位图,接着用SelectObject将位图作用于兼容的设备描述表,最后关键的步骤用Bitblt将兼容DC贴到DC上。

具体实现代码如下:

hdc=GetDC(hwnd);//设备描述表
MemDC=CreateCompatibleDC(hdc);//兼容的设备描述表
CreateCompatibleBitmap(MemDC,0,0);//兼容的位图
SelectObject(MemDC,bmp_cloud);//将位图作用于兼容的设备描述表
//BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY);//将兼容的设备描述表贴到设备描述表上
TransparentBlt(hdc,20,80,89,50,MemDC,0,0,89,50,RGB(0,0,0));//该行代码实现功能同上,但实现了背景透明的效果
DeleteDC(MemDC);//释放兼容的设备描述表
ReleaseDC(hwnd,hdc);//释放设备描述表


API实现按钮的绘制

在WIN32 SDK中,按钮也是属于一种窗口,只不过是附属于某个父窗口的子窗口,因此也可以使用CreateWindow创建一个按钮

HWND hwnd_check;
hwnd_check=CreateWindow("BUTTON","开始游戏",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,350,400,80,28,hwnd,NULL,NULL,NULL);


用以上知识就可以实现一个游戏界面



实现代码:

#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){
WNDCLASS wnd;
wnd.cbClsExtra=0;
wnd.cbWndExtra=0;
wnd.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wnd.hCursor=LoadCursor(hInstance,(LPCTSTR)IDC_CURSOR2);
wnd.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
wnd.hInstance=hInstance;
wnd.lpfnWndProc=WndProc;
wnd.lpszClassName="window";
wnd.lpszMenuName=NULL;
wnd.style=CS_HREDRAW|CS_VREDRAW;

RegisterClass(&wnd);

HWND hwnd;
HWND hwnd_check;
hwnd=CreateWindow("window","超级玛丽",WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,300,40,800,600,NULL,NULL,hInstance,NULL);
hwnd_check=CreateWindow("BUTTON","开始游戏",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,350,400,80,28,hwnd,NULL,NULL,NULL);

ShowWindow(hwnd,nShowCmd);

MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
HDC hdc;
HDC MemDC;
PAINTSTRUCT ps;
RECT r={0,0,800,600};
RECT rc_ground={0,530,800,600};
RECT rc_grass={0,500,800,530};

HBITMAP bmp_ground=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_GROUND);
HBITMAP bmp_sky=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_SKY);
HBITMAP bmp_stack=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_STACK);
HBITMAP bmp_rock=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_ROCK);
HBITMAP bmp_title=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_TITLE);
HBITMAP bmp_grass=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_GRASS);
HBITMAP bmp_cloud=LoadBitmap((HINSTANCE)GetModuleHandle(NULL),(LPCSTR)IDB_CLOUD);

switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hdc=GetDC(hwnd);//设备描述表
MemDC=CreateCompatibleDC(hdc);
CreateCompatibleBitmap(MemDC,0,0);

HBRUSH hbr_sky=CreatePatternBrush(bmp_sky);
HBRUSH hbr_ground=CreatePatternBrush(bmp_ground);

//天空
FillRect(hdc,&r,hbr_sky);
//地面
FillRect(hdc,&rc_ground,hbr_ground);

//草
SelectObject(MemDC,bmp_grass);
//BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY);
for(int num_grass=0;num_grass<10;num_grass++){
TransparentBlt(hdc,150+28*num_grass,506,28,24,MemDC,0,0,28,24,RGB(255,255,255));
}

//云朵
SelectObject(MemDC,bmp_cloud);
//BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY);
TransparentBlt(hdc,20,80,89,50,MemDC,0,0,89,50,RGB(0,0,0));

//标题
SelectObject(MemDC,bmp_title);
//BitBlt(hdc,0,0,537,232,MemDC,0,0,SRCCOPY);
TransparentBlt(hdc,140,30,537,232,MemDC,0,0,537,232,RGB(0,255,0));

//烟囱
SelectObject(MemDC,bmp_stack);
//BitBlt(hdc,200,465,264,530,MemDC,0,0,SRCCOPY);
TransparentBlt(hdc,500,465,64,65,MemDC,0,0,64,65,RGB(255,255,255));

//墙
SelectObject(MemDC,bmp_rock);
for(int num_rock=0;num_rock<10;num_rock++){
//BitBlt(hdc,0+32*num_rock,300,32+32*num_rock,332,MemDC,0,0,SRCCOPY);
TransparentBlt(hdc,0+32*num_rock,330,32,32,MemDC,0,0,32,32,RGB(255,255,255));
}

DeleteDC(MemDC);
ReleaseDC(hwnd,hdc);
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: