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*/
阅读全文
0 0
- Windows编程之旅(九)
- Windows API 教程(九) 网络编程
- Win32 Windows编程 九
- 前端编程提高之旅(九)----延迟对象
- 剑指offer之编程(九)
- windows游戏编程<九>键盘
- windows基础应用程序编程(九)控件简介(二)
- Windows核心编程(九)同步设备I/O
- Windows编程之旅(二)
- Windows编程之旅(三)
- Windows编程之旅(四)
- Windows编程之旅(六)
- Windows编程之旅(七)
- Windows编程之旅(八)
- Windows编程之旅(十)
- 《Windows程序设计》读书笔记之九
- Windows编程之旅(一)
- C++多线程编程之九
- StringUtils在commons-lang3和commons-lang中的区别
- Shell脚本中反引号`和$()的区别
- Java清理:垃圾回收
- startActivityForResult
- Android直播间_003
- Windows编程之旅(九)
- opensuse42.1改用国内源
- linux驱动 内存池的机制和使用
- MySQL删除关联表的数据
- 如何用altium designer10去画4层板
- [FFT] BZOJ3527: [Zjoi2014]力
- Windows编程之旅(十)
- WMS系统开发总结-移库管理-下架与上架
- 17.nginx 的 rewrite 功能