Windows API初步实现游戏界面

来源:互联网 发布:复旦医学院考研 知乎 编辑:程序博客网 时间:2024/06/14 12:02

首先将位图资源载入工程

具体实现方法: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);}




0 0