位图加载显示原理

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

  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) 打赏
取消

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

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

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

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

评论

    暂无评论...