请教如何从ICONINFO结构中得到鼠标光标的位图?
英文不好,看不太懂MSDN,所以把我理解的写出来,请大家看看是否正确。
- C/C++ code
typedef struct _ICONINFO { BOOL fIcon; DWORD xHotspot; DWORD yHotspot; HBITMAP hbmMask; HBITMAP hbmColor; } ICONINFO; fIcon:0,表示为光标;非0,表示为图标。
xHotspot和yHotspot:光标的hot spot(热点?)或者图标的中心点 坐标。
hbmColor:颜色图的句柄。
hbmMask:bitmask bitmap(掩图?)的句柄。其中的点是和颜色图中的点一一对应的。若其中的点是白色表示透明的点,显示时透明显示;黑色的点表示不透明的点,显示时按颜色图中的颜色显示。
如果hbmColor为0,则表示这个光标只有黑白两色,而hbmMask中,就包含了bitmask bitmap和颜色图,其中bitmask bitmap在上,颜色图在下。
我这样理解对不对?全不全?
[解决办法]
xHotspot和yHotspot共同制定指针图形的哪个点是热点,也就是那个点是鼠标真正的位置。。。。 也就是。。。还真不好表述,不过你应该明白了
如果是图标的话 那么这两个参数无效,自动为图标中心位置
后两个参数理解的应该正确吧,你获取一个指针后然后把hbmMask画出来应该更清楚
[解决办法]
hbmColor
Handle to the icon color bitmap. This member can be optional if this structure defines a black and white icon. The AND bitmask of hbmMask is applied with the
SRCAND
flag to the destination; subsequently, the color bitmap is applied (using XOR) to the destination by using the
SRCINVERT
flag.
当结构体定义了白色或是黑色光标,这个成员是无所谓的。同时,掩图在SRCAND下生效,掩色在SRCINVERT生效,也就是无视另外一者
[解决办法]
差不多。
“热点”的意思是图象中的该点代表鼠标光标的位置,例如常规的箭头光标的热点是左上角;编辑框中的I形光标的热点是左边中点;X形的热点是图象中心。
如果hbmColor不为0,显示时先用hbmMask与目标图象相“与”,再用hbmColor与目标图象相“异或”;如果hbmColor为0,显示时先用hbmMask的上一半与目标图象相“与”,再用hbmMask的下一半与目标图象相“异或”。
[解决办法]
ICONINFO这个结构从MSDN上确实无法得知说明,楼主应该这样理解CreateIcon函数:
HICON CreateIcon( HINSTANCE hInstance,int nWidth,int nHeight,BYTE cPlanes,BYTE cBitsPixel,const BYTE *lpbANDbits,const BYTE *lpbXORbits);
其中:
hInstance创建图标模块的实例句柄
nWidth图标的像素宽度
nHeight图标的像素高度
cPlanes图标XOR位掩码的平面数
cBitsPixel图标XOR位掩码的每像素位数。
lpbANDbits图标中AND位掩码的比特值数组。这个位掩码描述了一个单色位图
lpbXORbits图标中XOR位掩码的比特值数组。这个位掩码描述了一个单色位图
如果函数调用成功,返回值是一个图标的句柄,如果制作,返回值是NULL.
此函数创建一个指定尺寸,颜色和位组合格式的图标.它应用AND与XOR位掩码的如下真值表:
AND位掩码 XOR位掩码 显示颜色
0 0 黑
0 1 白
1 0 屏幕
1 1 屏幕反色
每个像素点的颜色由参数lpbANDbits与lpbXORbits的一个比特位共同决定。
有了CreateIcon原理之后(特别是红色的那段话),再来看看ICONINFO结构的原理:
typedef struct _ICONINFO {
BOOL fIcon;//指定这个结构定义一个图标还是光标。当为TRUE时,指定一个图标,为FALSE时,指定一个光标
DWORD xHotspot;//指定光标的热点的x坐标。如果结构定义了一个图标,热点总是在图标的中心,该成员被忽略
DWORD yHotspot;//指定光标的热点的y坐标。如果结构定义了一个图标,热点总是在图标的中心,该成员被忽略
HBITMAP hbmMask;//图标位掩码位图。如果hbmColor定义了一个黑白图标,这个位图代表AND比特集,非白色像素是比特值为0,白色像素是比特值1。如果hbmColor定义了一个彩色图标,非白色像素表示hbmColor中的像素原样输出,白色像素表示hbmColor中的像素与屏幕像素XOR后输出。
HBITMAP hbmColor; //图标颜色位图句柄。如果该成员定义了一个黑白图标,这个位图代表XOR比特集,黑色像素是比特值为0,白色像素是比特值1。当hbmColor为黑白位图时,着色原理与CreateIcon相同
} ICONINFO;
这下应该明白了吧
[解决办法]
[解决办法]
ICONINFO中的hbmMask和CreateIcon中的参数lpbANDbits类似, 当hbmColor成员指定为一个黑白位图时,hbmMask与hbmColor其实都是一个比特数组,每一像素点占用的比特集作为一个整体参与运算(一个像素点占用的所有比特均视为统一的值)。因此在这种情况下,实际像素点的颜色只存在着四种可能:黑,白,屏幕色,屏幕反色.