初探GDI——基本框架(载入位图)
来源:互联网 发布:网络系统安全巡检方案 编辑:程序博客网 时间:2024/06/05 06:29
跟随的书本的进度,今天尝试GDI载入bmp格式位图,采用创建与屏幕窗口兼容的DC作为缓冲,使窗口重绘更平滑。
载入位图分为四个步骤:
1、载入位图;使用LoadImage()载入位图资源。
2、创建兼容DC;使用CreateCompatible()创建与窗口DC兼容的内存DC用于缓存图像信息。
3、选用位图对象;使用SelectObject()将第一步载入的对象选用为兼容DC内位图对象。
4、进行贴图;使用BilBlt()将兼容DC内的位图贴在窗口DC上,实现位图的显示。
在最后释放资源的时候,采用先进后出的方式,先创建的对象最后释放,后创建的对象,先释放。
源码:
/*尝试GDI载入位图,采用创建与屏幕窗口兼容的DC作为缓冲,使窗口重绘更平滑2017/08/20*///头文件#include <windows.h>//全局变量HDC g_hdc,g_mdc;HBITMAP g_BitMap;//全局函数声明LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);bool Game_Init(HWND);void Game_Paint(HWND);bool Game_CleanUp(HWND);//入口函数int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow){ //创建窗口类 WNDCLASSEX wndClass = { 0 }; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hInstance = hInstance; wndClass.lpfnWndProc = WndProc; wndClass.lpszClassName = L"GDIBitMap"; wndClass.lpszMenuName = NULL; wndClass.style = CS_VREDRAW|CS_HREDRAW; //注册窗口类 RegisterClassEx(&wndClass); //可创建窗口 HWND hwnd = CreateWindow(L"GDIBitMap", L"加载位图", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, hInstance, nullptr); //显示、移动、刷新窗口 ShowWindow(hwnd, nCmdShow); MoveWindow(hwnd, 0, 0, 1024, 600, true); UpdateWindow(hwnd); //初始化资源 Game_Init(hwnd); //消息循环 MSG msg = { 0 }; while (msg.message!=WM_QUIT) { if (PeekMessage(&msg,nullptr,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } //释放资源 Game_CleanUp(hwnd); 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); //关闭窗口 break; case WM_DESTROY: PostQuitMessage(0); //结束线程 break; default: return DefWindowProc(hwnd, message, wParam, lParam); break; } return 0;}//初始化函数bool Game_Init(HWND hwnd){ g_hdc = GetDC(hwnd); //获取设备环境 //载入位图资源 g_BitMap = (HBITMAP)LoadImage(NULL, L"34_3.bmp", IMAGE_BITMAP,1024, 600, LR_LOADFROMFILE); //创建与屏幕DC兼容的内存DC,用于缓冲画面 g_mdc = CreateCompatibleDC(g_hdc); ReleaseDC(hwnd, g_hdc); //释放设备环境 Game_Paint(hwnd); return true;}//绘图函数void Game_Paint(HWND hwnd){ g_hdc = GetDC(hwnd); //获取设备环境 SelectObject(g_mdc, g_BitMap); //绑定内存DC的位图对象 BitBlt(g_hdc, 0, 0, 1024, 600, g_mdc, 0, 0, SRCCOPY); //将内存DC的位图对象以SRCCOPY的方式贴入屏幕DC ReleaseDC(hwnd, g_hdc); //释放设备环境}//资源清理函数bool Game_CleanUp(HWND hwnd){ //释放资源 DeleteObject(g_BitMap); DeleteObject(g_mdc); return true;}
阅读全文
0 0
- 初探GDI——基本框架(载入位图)
- 初探GDI——基本框架(几何绘图)
- 初探GDI——基本框架(文字输出)
- Android GDI基本框架
- 第十四章 位图和Bitblt(GDI 位图对象1)
- 第十四章 位图和Bitblt(GDI 位图对象2)
- MFC GDI绘图(2)位图
- pg_bulkload批量载入工具(初探)
- 位图载入问题
- 载入位图 (bmp, ico)
- VC载入位图方法
- win32载入一张位图
- win32载入一张位图
- GDI位图和DIB位图
- GDI绘制透明位图
- GDI位图透明显示
- 使用GDI位图
- GDI之绘制位图
- [java]集合
- 浏览器渲染页面过程
- 状态栏
- 【Mybatis】——mapper代理方法
- HDU
- 初探GDI——基本框架(载入位图)
- 深度学习DeepLearning.ai系列课程学习总结:课程概述
- Java基础----集合
- dubbo可通过指定Url方式绕过注册中心直连指定的服务地址
- MyBatis初探
- 伸展树(splay tree)
- -----hdu 2181 哈密顿绕行世界问题
- 初学者入门web前端 C#基础知识:数组与集合
- 散列/散列函数