位图加载显示原理

2017-07-10 - C/C++

将位图从文件加载到绘制窗口必须经过的步骤:

  1. 从文件中加载位图对象(BITMAP)

  2. 建立一个与窗口DC兼容的内存DC

  3. 内存DC使用步骤1所建立的位图对象

  4. 将内存DC的内容粘贴到窗口DC中,完成显示

加载位图使用LoadImage()函数:

HANDLE loadImage(HINSTANCE     // 来源实体,若在硬盘或资源文件中,则设为 NULL
                LPCTSTR        // 名称,位图所在路径
                UINT           // 位图类型,IMAGE_BITMAP,IMAGE_CURSOR,IMAGE_ICON
                int            // 宽度
                int            // 高度
                UINT);         // 加载方式,若从文件中加载,设为 LR_LOADFROMFILE

建立与窗口DC兼容的内存DC,做位图的一个缓冲区

HDC CreateCompatibleDC(HDC hdc);
DeleteDC(HDC dc);

选择位图对象,位图对象是GDI的6种对象之一

HGDIOBJ SelectObject(HDC hdc,HGDIOBJ GDI对象)
BOOL DeleteObject(HGDIOBJ GDI对象)

建立与窗口兼容的位图

HBITMAP CreateCompatibleBitmap(HDC,int,int)

Raster运算

BitBlt()函数最后一个参数称为”Raster”的运算值,这个值用来设定内存DC到目的DC的贴图方式.

Raster值 说明
BLACKNESS 将来源位图转换为黑色
DSTINVERT 将目的地DC做”NOT”运算
MERGECOPY 将选择的笔刷与来源位图做”AND”运算
MERGEPAINT 先将来源位图做”NOT”运算,再与目的地DC做”OR”运算
NOTSRCCOPY 将来源位图做”NOT”运算
NOTSRCERASE 先将来源位图与目的地DC做”OR”运算,再将其做”NOT”运算
PATCOPY 将选择的笔刷贴到目的地DC上
PATINVERT 将目的地DC与选择的笔刷做”XOR”运算
PATPAINT 先将来源位图做”NOT”运算,再与笔刷做”OR”运算,最后再与目的地DC做”OR”运算
SRCAND 将来源位图与目的地DC做”AND”运算
SRCCOPY 将来源位图贴到目的地DC上
SRCERASE 先将目的地DC做”NOT”运算,再与来源位图做”AND”运算
SRCINVERT 将来源位图与目的地DC做”XOR”运算
SRCPAINT 将来源位图与目的地DC做”OR”运算
WHITENESS 将来源位图转换为白色

(背景图,前景图,屏蔽图)察看 “透明位图.bmp” 右边为屏蔽图,左边为前景图(黑色为00000000;白色为11111111)

屏蔽图与背景图做”AND”运算:

(同时为真,即为真)

00000000 ———屏蔽图中的黑色
(AND) 01101001 ———背景图中的颜色
结果 00000000 ———保留黑色

前景图再与上次贴图的结果作与”OR”运算:

(一个为真,即为真)

01010101 ———前景图中要显示的颜色
(OR) 00000000 ———背景图中变黑色的部分
结果 01010101 ———保留前景图中要显示的颜色
00000000 ———前景图中黑色的部分
(OR) 01101001 ———背景图中的颜色
结果 01101001 ———保留背景图中的颜色

- END -

14
0

提升程序的特权

提升程序的特权

提升程序的特权首先列出需要的函数1.OpenProcessToken2.AdjustTokenPrivilegesLookupPrivilegeValue首先需要获取进程的令牌句柄Op ...

MFC 消息映射(Message Map)的雏形

MFC 消息映射(Message Map)的雏形

在面向过程的窗口消息处理函数WndProc中,我们要使用大量的switch+case来判断处理消息,这使得代码变得杂乱。若在 ...

Gcc Lcc 命令行 宏定义的设置与取消

Gcc Lcc 命令行 宏定义的设置与取消

...

图像格式解码器的GUID标识

图像格式解码器的GUID标识

#defineCLSID_BMP"{557CF400-1A04-11D3-9A73-0000F81EF32E}"#defineCLSID_JPEG"{557CF401-1A04-11D3-9A73-0000F81EF32E}"#defineCLSID_GIF& ...

offsetof(s,m)解析

offsetof(s,m)解析

offsetof求某个结构体的特定成员在结构体里面的偏移量(s)0是骗编译器说有一个指向类(或结构)s的指针,其值为0& ...

PE 文件结构

PE 文件结构

什么是PE结构PE文件具有较强的移植性PE结构是一种数据组织方式PE结构主要应用于Windows系统、具有PE结构的文件称 ...

MFC 学习笔记 <0>

MFC 学习笔记 <0>

在学习MFC(Microsoft基础类库)之前。要懂得C/C++基础知识。了解使用WIN32API面向过程开发窗口的流程。MFC是对WIN32API ...

_MSC_VER 定义编译器的版本号

_MSC_VER 定义编译器的版本号

MSVC++12.0_MSC_VER=1800(VisualC++2013)MSVC++11.0_MSC_VER=1700(VisualC++2012)MSVC++10.0_MSC_VER=1600(VisualC++2010)MSVC++9.0_MSC_VER=1500MSVC++8.0_MSC_ ...

MD5算法的C++实现

MD5算法的C++实现

MD5算法的C++实现IntroductionMD5算法是一种消息摘要算法(MessageDigestAlgorithm),此算法以任意长度的信息(message)作为输入 ...

__declspec(novtable)作用

__declspec(novtable)作用

declspec(novtable)在C++中接口中广泛应用.不容易看到它是因为在很多地方它都被定义成为了宏.比如说ATL活动模板库中 ...