Windows API初步实现游戏界面

首先将位图资源载入工程

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




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值