注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚!

学了一周左右的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相关推荐

  1. CreateCompatibleBitmap,关于兼容DC的创建与资源回收

    其实,我的C++入门就是从GDI开始的,想在CE上面写应用程序,若兼程序界面太难看那就必须用回GDI了.GDI是一种古老而又非常麻烦的技术,在C#年代还好点,但VC++下,玩GDI记得最最重要的一点是 ...

  2. win32的BitBlt和StretchBlt

    参考 https://blog.csdn.net/baidu_37503452/article/details/73484646 https://www.cnblogs.com/fwycmengsof ...

  3. win32进程共享内存

    在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换.     进程间 ...

  4. b450支持服务器内存,微星b450迫击炮内存兼容列表 板子是微星迫击炮b450配什么内存条好...

    锐龙r5 2600,板子是微星迫击炮b450配什么内存条好 点击查看锐龙r5 2600,板子是微星迫击炮b450配什么内存条好具体信息 锐龙r5 2600,板子是微星迫击炮b450配什么内存条好 答: ...

  5. Win32 API中内存的申请与释放

    之前在做内存泄漏分析模块功能开发时,发现在windows下的输出结果并不是很准确,很多内存泄漏都显示是在windows的api或crt函数中,比如CoInitializeEx,stderror,IsO ...

  6. 怎样查看主板支持服务器内存,怎么看主板和内存兼容-怎么查看主板对内存的支持情况 爱问知识人...

    可以利用搜索引擎在网上查找到你需要了解的主板各个参数,先把主板的名称.型号输入到搜索栏里点击搜索就可以了. 我举个硕泰克 SL-75FRN3-L 主板的情况,搜索的结果是: 硕泰克 SL-75FRN3 ...

  7. win32应用程序内存不足

    当在windows环境运行32位应用程序时,由于32位的限制最大分配的内存只有2G.要想使用更大的内存正常情况下编译为64位就可以了. 但是如果程序依赖的库比较多,其他库也需要编译成64位,这样做起来 ...

  8. python 读取内存_使用Python学习win32库进行内存读写

    前言: 上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下. 要用到的工具: C ...

  9. python有哪些库可以读写内存_使用Python学习win32库进行内存读写

    前言: 上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下. 要用到的工具: C ...

最新文章

  1. css html span 块状不换行
  2. 深入了解SAP S4 HANA Business Partner
  3. PHP - .htaccess设置显示PHP错误 (转)
  4. VC++ 用ADO连接数据库的简单方法
  5. hdu 5340(manacher+枚举)
  6. import _ssl # if we can‘t import it, let the error propagate
  7. php 强制刷新,web端实现后退强制刷新功能代码
  8. Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...
  9. 20172331 《Java程序设计》第3周学习总结
  10. 《C++ Primer Plus》读书笔记之十—类和动态内存分配
  11. 如何执行静默(无人参与)Java 安装?
  12. jquery操作li向下向上几行
  13. 大数据时代下的用户洞察:用户画像建立(ppt版)
  14. 浅析泛在电力物联网及国网公司“三型两网”战略
  15. 京东 Android 客户端样式的级联地址选择器
  16. 【Hostapd support for WPA3 R3 Wi-Fi Security】
  17. 辽宁省计算机设计大赛三等奖英语,我校在2018年辽宁省大学生计算机设计大赛中取得佳绩...
  18. Android 10 默认输入法
  19. 好程序员Java培训分享20个Java程序员基础题
  20. APP测试与WEB测试的区别

热门文章

  1. Java byte数组与十六进制字符串互转
  2. 如何构建知识图谱和问答系统
  3. 国内测试专业blog(部份),欢迎一起完善
  4. 别提996、腾讯2022校招起薪40w,大厂招人铁了心要卷
  5. 502 nginx bad gateway
  6. linux 布署Asp.net Core 6.0 应用 (宝塔面板)
  7. python求雅可比矩阵_提高自组雅可比矩阵的性能
  8. 基于matlab的正交振幅调制与解调,正交幅度调制(QAM)及解调Matlab仿真
  9. 人脸识别之表情识别(二)--基于CNN分类
  10. sae搭建微信服务器的坑