位图加载显示原理

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

  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 ———保留背景图中的颜色
赞(0) 打赏
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

    暂无评论...