转的一个帖子 关于CreateBitmap

《WIDOWS程序设计》619页上说,执行下面的操作

hBitmap   =   CreateBitmap(7,9,5,3,NULL);

时Windows为象素位分配内存,粗略的计算此位图需要7*9*5*3即945位,相当于118个字节多一点。
     (1)我不理解为什么要乘5呢?5可是颜色板的数目,颜色板到底是什么?

下面又说Windows为位图分配内存时,每行象素都具有偶数个字节,即
iWidthBytes=2*((cx*cBitsPixel+15)/16);      
//(2)为什么要加15?         

或者
iWidthBytes=((cx*cBitsPixel+15)&~15)> > 3;
//(3)这个式子是怎么得出来的?
 
 
style="height: 130px;" id="tad2" height="0" marginheight="0" src="/u/t5/include/ad2.asp?pdate=2002-05-16 16:37:11&ba=Cpp&sa=C" frameborder="0" width="100%" marginwidth="0" scrolling="no">
id="Iframe1" height="0" marginheight="0" src="/u/t5/include/ad3.asp?pdate=2002-05-16 16:37:11&ba=Cpp&sa=C" frameborder="0" width="100%" marginwidth="0" scrolling="no">
#1楼 得分:0回复于:2002-05-16 19:13:46
(cx*cBitsPixel+15)&~15后面的&~15是以16字节进行内存对齐的意思。请查msdn关于操作符   &   和   ~   的文档.
 
#2楼 得分:0回复于:2002-05-16 19:33:37
问题(3)
pos&~15其实就是把变量pos的最后8bit变为0,其他位不变.比如:如果pos=0x32345453   (16进制数)
那么执行运算后pos=0x32345400

问题(2)
+15的是进位算法。设有以下算式   a   =   A/16;   程序作者的意图是:如果
(float)A/16   小数部分不为0,那么无论小数是否满足四舍五入条件都进位到个位。等效于下面程序:
if(   (A%16)   !=   0   ){      //如果不能整除
           a   =   (A-A%16)+16;
             a   =   a/16;
}else{                                          //如果整除
           a   =   a/16;
}
注意:整型相除的时候,程序是将小数部分舍弃的。

问题(1)
我没看过这本书。颜色板就是一系列的颜色值,比如16色,那么颜色板里就有0到15这16个值,然后显卡根据这些值选择相应的颜色输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值