【Windows.h】学习日志 Dat.4 创建移动的人物


关注公众号程序猿从入门到入土查询更方便哦

创建移动的人物

#include<Windows.h>
#pragma comment(lib,"winmm.lib")			//windows库与multimedia库

HDC g_hdc = NULL;							//设备环境句柄
HDC g_mdc = NULL;							//设备内存
HDC g_buffdc = NULL;						//缓存
HBITMAP g_hSprite[4] = { NULL };			//4张图片位图
HBITMAP g_hBackGround = NULL;				//背景位图
DWORD g_tPre = 0, g_tNow = 0;				//计时
int g_iNum = 0, g_iX = 0, g_iY = 10;		//当前图片和人物位置
int g_iDirection = 0;

#define WINDOW_WIDTH 800					
#define WINDOW_HEIGHT 600					//窗口宽高
#define WINDOW_TITLE L"mk"					//窗口标题

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);		//消息处理函数
BOOL InitialRes(HWND hwnd);					//初始资源函数
VOID PaintFunc(HWND hwnd);					//绘制函数
BOOL CleanUpFunc(HWND hwnd);				//清理资源函数

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {			//程序入口

	WNDCLASSEX wndclass = { 0 };																		//定义窗口类
	wndclass.cbClsExtra = 0;																			
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.cbSize = sizeof(WNDCLASSEX);
	wndclass.hIcon = (HICON)LoadImage(NULL, L"./icon.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
	wndclass.hIconSm = NULL;
	wndclass.hInstance = hInstance;
	wndclass.lpfnWndProc = WndProc;
	wndclass.lpszClassName = L"myClassName";

	if (!RegisterClassEx(&wndclass)) {		//注册窗口
		return -1;
	}

	//创建窗口句柄
	HWND hwnd = CreateWindow(L"myClassName", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

	//显示窗口
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	
	//初始化资源
	if (!InitialRes(hwnd)) {
		return FALSE;
	}

	//播放音乐
	mciSendString(L"Open ./Music/轻音乐-天气预报背景音乐.mp3 alias music", 0, 0, 0);
	mciSendString(L"play music repeat", 0, 0, 0);


	//消息处理
	MSG msg = { 0 };
	while (msg.message != WM_QUIT) {
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else {
			g_tNow = GetTickCount();		//获取时间
			if (g_tNow - g_tPre >= 60) {
				PaintFunc(hwnd);
			}
		}
	}

	//解除注册
	UnregisterClass(L"myClassName", wndclass.hInstance);

	return 0;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

	switch (message) {
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);	//默认处理函数

	case WM_DESTROY:
		PostQuitMessage(0);
		break;

	case WM_KEYDOWN:
		switch (wParam) {

		case VK_ESCAPE:
			if (MessageBox(hwnd, L"确认退出?", L"Tip!", MB_OKCANCEL) == IDOK) {		//按esc退出
				DestroyWindow(hwnd);
				PostQuitMessage(0);
			}
			break;
		case VK_RIGHT:
			g_iX = g_iX + 5;							//人物移动
			g_iDirection = 3;
			if (g_iX > WINDOW_WIDTH - 75) {
				g_iX = WINDOW_WIDTH - 75;
			}
			break;
		case VK_LEFT:
			g_iX = g_iX - 5;
			g_iDirection = 2;
			if (g_iX < 0) {
				g_iX = 0;
			}
			break;
		case VK_UP:
			g_iY = g_iY - 2;
			g_iDirection = 0;
			if (g_iY < 0) {
				g_iY = 0;
			}
			break;
		case VK_DOWN:
			g_iY = g_iY + 2;
			g_iDirection = 1;
			if (g_iY > WINDOW_HEIGHT - 75) {
				g_iY = WINDOW_HEIGHT - 75;
			}
			break;
		}

	}



	return 0;

}

BOOL InitialRes(HWND hwnd) {

	//定义位图
	HBITMAP bmp;
	g_hdc = GetDC(hwnd);		//获得设备句柄
	g_mdc = CreateCompatibleDC(g_hdc);	//获得内存句柄
	g_buffdc = CreateCompatibleDC(g_hdc);
	bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT); //创建位图句柄

	g_iX = 180;						//设置人物位置与方向
	g_iY = 360;
	g_iDirection = 3;
	g_iNum = 0;

	SelectObject(g_mdc, bmp);		//加载图片
	g_hSprite[0] = (HBITMAP)LoadImage(NULL, L"go1.bmp", IMAGE_BITMAP, 480, 216, LR_LOADFROMFILE);
	g_hSprite[1] = (HBITMAP)LoadImage(NULL, L"go2.bmp", IMAGE_BITMAP, 480, 216, LR_LOADFROMFILE);
	g_hSprite[2] = (HBITMAP)LoadImage(NULL, L"go3.bmp", IMAGE_BITMAP, 480, 216, LR_LOADFROMFILE);
	g_hSprite[3] = (HBITMAP)LoadImage(NULL, L"go4.bmp", IMAGE_BITMAP, 480, 216, LR_LOADFROMFILE);
	g_hBackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);

	PaintFunc(hwnd);
	return TRUE;
}

VOID PaintFunc(HWND hwnd) {
	SelectObject(g_buffdc, g_hBackGround);
	BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_buffdc, 0, 0, SRCCOPY);	//绘制位图

	SelectObject(g_buffdc, g_hSprite[g_iDirection]);
	BitBlt(g_mdc, g_iX, g_iY, 60, 108, g_buffdc, g_iNum * 60, 108, SRCAND);
	BitBlt(g_mdc, g_iX, g_iY, 60, 108, g_buffdc, g_iNum * 60, 0, SRCPAINT);

	BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_WIDTH, g_mdc, 0, 0, SRCCOPY);
	g_tPre = GetTickCount();
	g_iNum++;
	if (g_iNum == 8) {
		g_iNum = 0;
	}
}

BOOL CleanUpFunc(HWND hwnd) {

	DeleteObject(g_hBackGround);
	for (int i = 0; i < 4; i++) {
		DeleteObject(g_hSprite[i]);
	}

	DeleteDC(g_buffdc);
	DeleteDC(g_mdc);
	ReleaseDC(hwnd, g_hdc);

	return TRUE;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaoYuanSama

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值