#include <Windows.h>
#include<time.h>
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_CLASS L"为了所有人的IT梦"
#define WINDOW_TITLE L"一个测试窗口"
#define SPRITES_NUM 30
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"Msimg32.lib")
HBITMAP g_sprites[4];
int g_spritesn;
struct Sprites
{
int x, y;
int direction;
}sprites[SPRITES_NUM];
HDC g_hdc, g_memdc, g_bufdc;//绘图环境句柄
HBITMAP g_BackGround;
VOID GamePaint(HWND hWnd);
BOOL GameInit(HWND);
void BubSort(int n);
DWORD g_tPre, g_tNow;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
/*入口函数*/
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE prehInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
WNDCLASSEX wnd = { 0 };//wnd就是窗口
wnd.cbSize = sizeof(WNDCLASSEX);//窗口所占内存
wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wnd.hCursor = NULL;//鼠标
wnd.hIcon = NULL;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hInstance = hInstance;
wnd.lpszClassName = WINDOW_CLASS;//项目名字
wnd.lpszMenuName = NULL;//窗口菜单
wnd.style = CS_HREDRAW | CS_VREDRAW;
//响应客服指令
wnd.lpfnWndProc = WndProc;//窗口过程函数
RegisterClassEx(&wnd);
HWND hWnd = CreateWindow(WINDOW_CLASS,//窗口名称
WINDOW_TITLE,//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格
300, 300, //窗口出现位置
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL, NULL, hInstance, NULL);
//显示 更新
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);
//播放音乐
PlaySound(L"OrcTheme.wav", NULL, SND_FILENAME | SND_LOOP | SND_ASYNC);
//SND
GameInit(hWnd);
//消息循环
//窗口不断去接受客户的指令
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 >= 100)//1秒贴10次图
GamePaint(hWnd);
}
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);//结束进程
break;
default:
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
BOOL GameInit(HWND hWnd)
{
srand((unsigned int)time(NULL));
g_hdc = GetDC(hWnd);
g_memdc = CreateCompatibleDC(g_hdc);
g_bufdc = CreateCompatibleDC(g_hdc);
HBITMAP bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
SelectObject(g_memdc, bmp);
g_BackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);
g_sprites[0]= (HBITMAP)LoadImage(NULL, L"11.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
g_sprites[1]= (HBITMAP)LoadImage(NULL, L"22.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
g_sprites[2]= (HBITMAP)LoadImage(NULL, L"33.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
g_sprites[3]= (HBITMAP)LoadImage(NULL, L"44.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
for (int i = 0; i < SPRITES_NUM; i++)
{
sprites[i].direction = 3;
sprites[i].x = rand() % WINDOW_WIDTH;
sprites[i].y = rand() % WINDOW_HEIGHT;
}
g_spritesn = 0;
return TRUE;
}
VOID GamePaint(HWND hWnd)
{
//背景图
SelectObject(g_bufdc, g_BackGround);
BitBlt(g_memdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);
BubSort(SPRITES_NUM);
for (int i = 0; i < SPRITES_NUM; i++)
{
SelectObject(g_bufdc, g_sprites[sprites[i].direction]);
TransparentBlt(g_memdc, sprites[i].x, sprites[i].y, 96, 96, g_bufdc, g_spritesn*96, 0, 96, 96, RGB(0, 0, 0));
}
BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_memdc, 0, 0, SRCCOPY);
if (++g_spritesn == 4)
g_spritesn = 0;
for (int i = 0; i < SPRITES_NUM; i++)
{
switch (rand() % 4)
{
case 0:sprites[i].y += 20;
if (sprites[i].y > WINDOW_HEIGHT)
sprites[i].y = WINDOW_HEIGHT;
sprites[i].direction = 0;
break;
case 1:sprites[i].x -= 20;
if (sprites[i].x < 0)
sprites[i].x = 0;
sprites[i].direction = 1;
break;
case 2:sprites[i].x += 20;
if (sprites[i].x > WINDOW_WIDTH)
sprites[i].x = WINDOW_WIDTH;
sprites[i].direction = 2;
break;
case 3:sprites[i].y -= 20;
if (sprites[i].y < 0)
sprites[i].y = 0;
sprites[i].direction = 3;
break;
}
}
g_tPre = GetTickCount();
}
void BubSort(int n)
{
int i, j;
Sprites temp;
bool f = false;
for (int i = 0; i < n - 1; i++)
{
f = false;
for (int j = 0; j < n - 1 - i; j++)
{
if (sprites[j + 1].y < sprites[j].y)
{
temp = sprites[j + 1];
sprites[j + 1] = sprites[j];
sprites[j] = temp;
f = true;
}
}
if (!f)
{
break;
}
}
}
运行效果