Windows编程之旅(九)

来源:互联网 发布:c 结构体数组 编辑:程序博客网 时间:2024/06/06 09:42

透明动画


#include <windows.h>//#include <tchar.h>       //swprintf  打印宽字符到字符串#pragma comment(lib,"winmm.lib")     //调用PlaySound函数所需库文件#pragma comment(lib,"Msimg32.lib")#define WINDOWS_WIDTH 800#define WINDOWS_HEIGHT 600#define WINDOWS_TITLE L"--这是一个美丽而又宁静的夜晚[透明动画]--"HDC g_hdc = NULL,g_mdc = NULL,g_bufdc=NULL;   //全局设备环境句柄    缓存dc句柄HBITMAP g_hSprite=NULL,g_hBackGround=NULL;   //定义2个位图句柄  一个储存贴图  一个为背景int g_iNum = 0, g_iX = 0,g_iY=0;    //g_iNum记录图号    g_iX  g_iY贴图的位置  DWORD g_tPre=0, g_tNow=0;           //g_tPre  记录上一次绘图的时间  g_tNow  此次准备绘图的时间LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lParam);BOOL Game_Init(HWND hwnd);   // 游戏初始化 VOID Game_Paint(HWND hwnd);   //在此函数中绘画BOOL Game_CleanUp(HWND hwnd);  //游戏资源清理int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow){//1.初始化窗口类WNDCLASSEX wndClass = { 0 };wndClass.cbSize = sizeof(WNDCLASSEX);wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //白色背景wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);  //光标句柄wndClass.hInstance = hInstance;wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";wndClass.lpszMenuName = NULL;wndClass.lpfnWndProc = WndProc;wndClass.style = CS_HREDRAW | CS_VREDRAW;//2.注册窗口类if (!RegisterClassEx(&wndClass))return -1;//3.创建窗口HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOWS_TITLE,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOWS_WIDTH, WINDOWS_HEIGHT, NULL, NULL, hInstance, NULL);//4.窗口移动,显示,更新MoveWindow(hwnd, 250, 80, WINDOWS_WIDTH, WINDOWS_HEIGHT, true);ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);//游戏资源初始化if (!Game_Init(hwnd)){MessageBox(hwnd, L"资源初始化失败", L"消息窗口", 0);return FALSE;}PlaySound(L"仙剑三·原版景天.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//5.消息循环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)Game_Paint(hwnd);              //当间隔相差0.1s  重新绘画}}//6.  注销窗口 UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);return 0;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){//PAINTSTRUCT paintStruct;switch (message){//case WM_TIMER:             //定时器信息//Game_Paint(hwnd);//break;//case WM_PAINT:          //绘图信息//g_hdc = BeginPaint(hwnd, &paintStruct);  //指定窗口 准备绘画//Game_Paint(hwnd);                      //开始绘画//EndPaint(hwnd, &paintStruct);           //结束绘画//ValidateRect(hwnd, NULL);               //更新客户区的显示//break;case WM_KEYDOWN:         //退出信息if (wParam == VK_ESCAPE)DestroyWindow(hwnd);   //销毁窗口 并发出一条WM_DESTROY信息break; case WM_DESTROY:Game_CleanUp(hwnd);   //资源清理PostQuitMessage(0);   //响应  WM_DESTROY信息break;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0; //正常退出}BOOL Game_Init(HWND hwnd){HBITMAP bmp;    g_hdc = GetDC(hwnd);  //获取环境句柄//3.建立兼容DCg_mdc = CreateCompatibleDC(g_hdc);       //建立和hdc兼容的内存DCg_bufdc = CreateCompatibleDC(g_hdc);     //建立和hdc兼容的缓冲DC//1.建立与窗口兼容的空的位图对象 并选入mdcbmp = CreateCompatibleBitmap(g_hdc, WINDOWS_WIDTH, WINDOWS_HEIGHT);SelectObject(g_mdc, bmp);   //将空位图对象选入mdc//2.加载位图g_hSprite = (HBITMAP)LoadImage(NULL, L"goright.bmp", IMAGE_BITMAP, 480, 108, LR_LOADFROMFILE);g_hBackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, WINDOWS_WIDTH,WINDOWS_HEIGHT, LR_LOADFROMFILE);//4.设置贴图起始位置g_iX = 0;       g_iY = 350; g_iNum = 0; Game_Paint(hwnd);return TRUE;}//绘制函数VOID Game_Paint(HWND hwnd){//4.恢复图号if (g_iNum == 8)     //图号为大于7时   回置0g_iNum = 0;//5.选用位图对象  在没mdc中SelectObject(g_bufdc, g_hBackGround);   //对象要选入g_bufd   将位图对象图号  //5.进行贴图BitBlt(g_mdc,0,0,WINDOWS_WIDTH,WINDOWS_HEIGHT,g_bufdc,0,0,SRCCOPY);  //在g_mdc中 以目前的对象进行  SRCCOPY贴图//6.在mdc进行透明处理SelectObject(g_bufdc, g_hSprite);   //对象要选入g_bufdc 480/8=60  108不变     (g_iNum*60,0)每一次开始源位置TransparentBlt(g_mdc,g_iX,g_iY,60,108,g_bufdc,g_iNum*60,0,60,108,RGB(255,0,0));  //透明色彩法//7.将后面的画面显示在窗口中BitBlt(g_hdc, 0, 0, WINDOWS_WIDTH, WINDOWS_HEIGHT, g_mdc, 0, 0, SRCCOPY);//8.记录此次的绘图时间g_tPre = GetTickCount();//9.图号要自增g_iNum++;//10计算下次贴图的坐标g_iX += 10;//11.如果超出窗口就将坐标置为-60if (g_iX >= WINDOWS_WIDTH)g_iX = -60;}BOOL Game_CleanUp(HWND hwnd){//KillTimer(hwnd, 1);   //删除定时器//释放资源对象DeleteObject(g_hBackGround);DeleteObject(g_hSprite);DeleteDC(g_bufdc);DeleteDC(g_mdc);ReleaseDC(hwnd, g_hdc);return TRUE;}/*BitBlt()hDestDC:指向目标设备环境的句柄。x:指定目标矩形区域左上角的X轴逻辑坐标。y:指定目标矩形区域左上角的Y轴逻辑坐标。nWidth:指定源在目标矩形区域的逻辑宽度。nHeight:指定源在目标矩形区域的逻辑高度。hSrcDC:指向源设备环境的句柄。xSrc:指定源矩形区域左上角的X轴逻辑坐标。ySrc:指定源矩形区域左上角的Y轴逻辑坐标。dwRop:指定光栅操作代码。*//*TransparentBlt()hdcDest:指定目标的句柄。nXOriginDest:指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示。nYOriginDest:指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示。nnWidthDest:指定目标矩形的宽度。nHeightDest:指定目标矩形的高度。hdcSrc:源图的句柄。nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。nWidthSrc:指定源矩形的宽度。nHeightSrc:指定源矩形的高度。crTransparent:源位图中的RGB值当作透明颜色。(用RGB(0,0,0)也就是黑色不行)返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE*/