关注公众号程序猿从入门到入土查询更方便哦
创建移动的人物
#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;
}