将位图从文件加载到绘制窗口必须经过的步骤:
- 从文件中加载位图对象(BITMAP)
- 建立一个与窗口DC兼容的内存DC
- 内存DC使用步骤1所建立的位图对象
- 将内存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 | ———保留背景图中的颜色 |