Win32 位图 - BitBlt,内存兼容DC,LoadBitmap
注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚!
学了一周左右的Win32 SDK编程,已经不可抑制的想要自己写点什么了,鉴于以往学Qt时自己编写小游戏的乐趣,决定再把那几个小游戏用Win32 SDK实现一遍。现在万事俱备只欠东风了,再学一下位图的显式吧~~,这几章内容真多,一切从简吧。
1. BitBlt
BitBlt(hdcDst, xDst, yDst, cx, cy, hdcSrc, xSrc, ySrc, dwROP);
该函数把像素从一个设备(叫做“源”)的矩形区域,传输到另一个设备环境(也就是“目标”)中一个同样大小的矩形区域。源和目标可以使一样的。
下面把屏幕的左上角256*256区域拷贝到客户区:
/*-----------------------------------------------------------BitBlt.cpp -- BitBlt Demonstration
------------------------------------------------------------*/#include <windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT("BitBlt");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_INFORMATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass (&wndclass)){MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);return 0 ;}hwnd = CreateWindow(szAppName, TEXT ("BitBlt Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{static int cxClient, cyClient, cxSource, cySource;HDC hdcClient, hdcScreen;PAINTSTRUCT ps;int x, y;switch (message){case WM_CREATE:/*cxSource = GetSystemMetrics(SM_CXSIZEFRAME) + GetSystemMetrics(SM_CXSIZE);cySource = GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);*/cxSource = 256;cySource = 256;return 0;case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_PAINT:hdcClient = BeginPaint(hwnd, &ps);hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);for (y = 0; y < cyClient; y += cySource)for (x = 0; x < cxClient; x += cxSource){BitBlt(hdcClient, x, y, cxSource, cySource, hdcScreen, 0, 0, SRCCOPY);}DeleteDC(hdcScreen);EndPaint(hwnd, &ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}
2.内存设备环境
通常,设备环境对应于特定的图形输出设备和驱动程序。内存设备环境只存在于内存。它不是一个真实的图形输出设备,但和特定的真实设备“兼容”。
要创建一个内存设备环境,必须有一个对应于真实设备的设备句柄。
hdcMem = CreateCompatibleDC(hdc);
把GDI位图对象选入内存设备环境:
SelectObject(hdcMem, hBitmap);
3.加载位图资源
hBitmap = LoadBitmap(hInstance, szBitmapName);
示例:
/*-----------------------------------------------------------Bricks1.cpp -- LoadBitmap Demostration
------------------------------------------------------------*/#include <windows.h>
#include "resource.h"LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT("Bricks1");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass (&wndclass)){MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);return 0 ;}hwnd = CreateWindow(szAppName, TEXT ("LoadBitmap Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{static HBITMAP hBitmap;static int cxClient, cyClient, cxSource, cySource;BITMAP bitmap;HDC hdc, hdcMem;PAINTSTRUCT ps;int x, y;HINSTANCE hInstance;switch (message){case WM_CREATE:hInstance = ((LPCREATESTRUCT)lParam)->hInstance;hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));GetObject(hBitmap, sizeof(BITMAP), &bitmap);cxSource = bitmap.bmWidth;cySource = bitmap.bmHeight;return 0;case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);hdcMem = CreateCompatibleDC(hdc);SelectObject(hdcMem, hBitmap);for (y = 0; y < cyClient; y += cySource)for (x = 0; x < cxClient; x += cxSource){BitBlt(hdc, x, y, cxSource, cySource, hdcMem, 0, 0, SRCCOPY);}DeleteDC(hdcMem);EndPaint(hwnd, &ps);return 0;case WM_DESTROY:DeleteObject(hBitmap);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}
上面的例子使用了位图资源。
Win32 位图 - BitBlt,内存兼容DC,LoadBitmap相关推荐
- CreateCompatibleBitmap,关于兼容DC的创建与资源回收
其实,我的C++入门就是从GDI开始的,想在CE上面写应用程序,若兼程序界面太难看那就必须用回GDI了.GDI是一种古老而又非常麻烦的技术,在C#年代还好点,但VC++下,玩GDI记得最最重要的一点是 ...
- win32的BitBlt和StretchBlt
参考 https://blog.csdn.net/baidu_37503452/article/details/73484646 https://www.cnblogs.com/fwycmengsof ...
- win32进程共享内存
在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换. 进程间 ...
- b450支持服务器内存,微星b450迫击炮内存兼容列表 板子是微星迫击炮b450配什么内存条好...
锐龙r5 2600,板子是微星迫击炮b450配什么内存条好 点击查看锐龙r5 2600,板子是微星迫击炮b450配什么内存条好具体信息 锐龙r5 2600,板子是微星迫击炮b450配什么内存条好 答: ...
- Win32 API中内存的申请与释放
之前在做内存泄漏分析模块功能开发时,发现在windows下的输出结果并不是很准确,很多内存泄漏都显示是在windows的api或crt函数中,比如CoInitializeEx,stderror,IsO ...
- 怎样查看主板支持服务器内存,怎么看主板和内存兼容-怎么查看主板对内存的支持情况 爱问知识人...
可以利用搜索引擎在网上查找到你需要了解的主板各个参数,先把主板的名称.型号输入到搜索栏里点击搜索就可以了. 我举个硕泰克 SL-75FRN3-L 主板的情况,搜索的结果是: 硕泰克 SL-75FRN3 ...
- win32应用程序内存不足
当在windows环境运行32位应用程序时,由于32位的限制最大分配的内存只有2G.要想使用更大的内存正常情况下编译为64位就可以了. 但是如果程序依赖的库比较多,其他库也需要编译成64位,这样做起来 ...
- python 读取内存_使用Python学习win32库进行内存读写
前言: 上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下. 要用到的工具: C ...
- python有哪些库可以读写内存_使用Python学习win32库进行内存读写
前言: 上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下. 要用到的工具: C ...
最新文章
- css html span 块状不换行
- 深入了解SAP S4 HANA Business Partner
- PHP - .htaccess设置显示PHP错误 (转)
- VC++ 用ADO连接数据库的简单方法
- hdu 5340(manacher+枚举)
- import _ssl # if we can‘t import it, let the error propagate
- php 强制刷新,web端实现后退强制刷新功能代码
- Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...
- 20172331 《Java程序设计》第3周学习总结
- 《C++ Primer Plus》读书笔记之十—类和动态内存分配
- 如何执行静默(无人参与)Java 安装?
- jquery操作li向下向上几行
- 大数据时代下的用户洞察:用户画像建立(ppt版)
- 浅析泛在电力物联网及国网公司“三型两网”战略
- 京东 Android 客户端样式的级联地址选择器
- 【Hostapd support for WPA3 R3 Wi-Fi Security】
- 辽宁省计算机设计大赛三等奖英语,我校在2018年辽宁省大学生计算机设计大赛中取得佳绩...
- Android 10 默认输入法
- 好程序员Java培训分享20个Java程序员基础题
- APP测试与WEB测试的区别
热门文章
- Java byte数组与十六进制字符串互转
- 如何构建知识图谱和问答系统
- 国内测试专业blog(部份),欢迎一起完善
- 别提996、腾讯2022校招起薪40w,大厂招人铁了心要卷
- 502 nginx bad gateway
- linux 布署Asp.net Core 6.0 应用 (宝塔面板)
- python求雅可比矩阵_提高自组雅可比矩阵的性能
- 基于matlab的正交振幅调制与解调,正交幅度调制(QAM)及解调Matlab仿真
- 人脸识别之表情识别(二)--基于CNN分类
- sae搭建微信服务器的坑