Window编程之旅(五)
来源:互联网 发布:员工培训档案软件 编辑:程序博客网 时间:2024/06/03 23:06
贴图透明遮罩法
#include <windows.h>#pragma comment(lib,"winmm.lib")#define WINDOWS_WIDTH 932#define WINDOWS_HEIGHT 700#define WINDOWS_TITLE L"--这是一个美丽而又宁静的夜晚--"HDC g_hdc = NULL,g_mdc = NULL; //全局设备环境句柄 HBITMAP g_hBackGround,g_hCharacter1,g_hCharacter2; //定义3个位图句柄 用于存放三张图片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, 200, 20, WINDOWS_WIDTH, WINDOWS_HEIGHT, true);ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);//游戏资源初始化if (!Game_Init(hwnd)){MessageBox(hwnd, L"资源初始化失败", L"消息窗口", 0);return FALSE;}PlaySound(L"宝瓶时代1.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);}}//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_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){g_hdc = GetDC(hwnd); //获取环境句柄//1.加载位图g_hBackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP,WINDOWS_WIDTH, WINDOWS_HEIGHT, LR_LOADFROMFILE);g_hCharacter1 = (HBITMAP)LoadImage(NULL,L"character1.bmp",IMAGE_BITMAP,640,579,LR_LOADFROMFILE);g_hCharacter2 = (HBITMAP)LoadImage(NULL, L"character2.bmp", IMAGE_BITMAP, 800, 584, LR_LOADFROMFILE);//2.建立兼容DCg_mdc = CreateCompatibleDC(g_hdc);Game_Paint(hwnd);ReleaseDC(hwnd, g_hdc);return TRUE;}VOID Game_Paint(HWND hwnd){//3.选用位图对象SelectObject(g_mdc, g_hBackGround); //将位图对象 选入g_mdc内存DC中//4.进行贴图BitBlt(g_hdc,0,0,WINDOWS_WIDTH,WINDOWS_HEIGHT,g_mdc,0,0,SRCCOPY); //SRCCOPY贴图//透明遮罩法绘制第一个人物 SelectObject(g_mdc,g_hCharacter1); //(50, WINDOWS_HEIGHT - 600,)设置位置 (320,640)设置大小 640宽度必须取一半320 (320,0)320也是宽度640的一半BitBlt(g_hdc, 50, WINDOWS_HEIGHT - 579, 320, 640, g_mdc,320, 0, SRCAND); //1.屏蔽图与背景图做"AND"运算 SRCANDBitBlt(g_hdc, 50, WINDOWS_HEIGHT - 579, 320, 640, g_mdc, 0, 0, SRCPAINT); //2.前景图与背景图做"OR"运算 SRCPAINT//透明遮罩法绘制第二个人物SelectObject(g_mdc, g_hCharacter2); //(50, WINDOWS_HEIGHT - 600,)设置位置 (320,640)设置大小 640宽度必须取一半320 (320,0)320也是宽度640的一半 BitBlt(g_hdc, 450, WINDOWS_HEIGHT - 584, 400, 640, g_mdc, 400, 0, SRCAND); //1.屏蔽图(黑背景)与背景图做"AND"运算 SRCAND BitBlt(g_hdc, 450, WINDOWS_HEIGHT - 584, 400, 640, g_mdc, 0, 0, SRCPAINT); //2.前景图与背景图做"OR"运算 SRCPAINT}BOOL Game_CleanUp(HWND hwnd){//释放资源对象DeleteObject(g_hBackGround);DeleteObject(g_hCharacter1);DeleteObject(g_hCharacter2);DeleteDC(g_mdc);return TRUE;}
阅读全文
0 0
- Window编程之旅(五)
- windows编程之五 First Window
- window编程之CreateProcess
- window编程之CreateThread
- C#编程之C#基础(五)
- QT分析之网络编程(五)
- JavaSwing图形界面编程之JApplet(五)
- 剑指offer之编程(五)
- Go语言编程(五)之常量
- Java入门之编程基础(五)
- Android基础知识(五)之网络编程
- DOM编程之五
- Window 编程之句柄篇
- DOM编程之window对象
- pthread学习笔记(五)--跋涉之旅之Posix线程编程指南(3)
- Java Socket编程之五
- 12.网络编程之五
- 初识windows编程之五
- 【LeetCode-面试算法经典-Java实现】【所有题目目录索引】
- 字符串编码
- python学习(12)——面向对象编程
- 【C++泛读总结】
- 使用ThinkPHP框架快速搭建网站
- Window编程之旅(五)
- markdown的使用
- JavaScript 作用域链与闭包
- JZOJ 1301. treecut
- redis快速入门
- LintCode python 小白3-三角形计数
- Log4J使用配置
- JAVA学习
- poj 2065 SETI 高斯消元解模线性方程