读书人

关于SetDIBits函数中那个缓冲区大小的

发布时间: 2012-02-03 22:02:47 作者: rapoo

关于SetDIBits函数中那个缓冲区大小的问题
我用CreateCompatibleDC及CreateCompatibleBitmap函数新建了一个位图,位图的宽度为100像素,高度为100像素,位图的颜色深度为24位,那我在为这个位图分配内存大小时,是不是分配100×100×3共30000字节啊?具体代码如下:

//取得窗口客户区大小,存放在stRect结构中
invokeGetClientRect,_hWnd,offset stRect

//取得窗口的DC
invokeGetDC,_hWnd
movhDC,eax

//建立一个与窗口DC兼容的背景DC
invokeCreateCompatibleDC,hDC
movhBackDC,eax

//根据前面得到的窗口客户区的宽度和高度建立一个与窗口DC兼容的位图
moveax,stRect.right
movl_bmpwidth,eax
incl_bmpwidth
movebx,stRect.bottom
movl_bmpheight,ebx
incl_bmpheight
invokeCreateCompatibleBitmap,hDC,l_bmpwidth,l_bmpheight
movhBmp,eax
invokeSelectObject,hBackDC,hBmp

//为这个新的位图分配内存,宽度×高度×3字节(不知分配这些字节对不对)
xoredx,edx
moveax,l_bmpwidth
mull_bmpheight
movdwBmpSize,eax
moveax,3
muldwBmpSize
movdwBmpSize,eax
invokeGlobalAlloc,GHND,dwBmpSize
movhBitMap,eax
invokeGlobalLock,hBitMap
movlpBitMap,eax

//初始化这个颜色内存区,初始为红色,0ffh
assumeesi:dword
movesi,lpBitMap
movedi,lpBitMap
addedi,dwBmpSize
.whileesi <edi
moval,0ffh
movbyte ptr [esi],al
incesi
moval,0h
movbyte ptr [esi],al
incesi
movbyte ptr [esi],al
incesi
.endw
assumeesi:nothing
invokeGlobalUnlock,hBitMap

//填写位图头信息
invokeRtlZeroMemory,offset stBmi,sizeofBITMAPINFOHEADER
movstBmi.bmiHeader.biSize,sizeofBITMAPINFOHEADER
pushl_bmpwidth
popstBmi.bmiHeader.biWidth
pushl_bmpheight
popstBmi.bmiHeader.biHeight
movstBmi.bmiHeader.biPlanes,1
movstBmi.bmiHeader.biBitCount,24 //颜色深度24位
movstBmi.bmiHeader.biCompression,BI_RGB
pushdwBmpSize
popstBmi.bmiHeader.biSizeImage
movstBmi.bmiHeader.biXPelsPerMeter,NULL
movstBmi.bmiHeader.biYPelsPerMeter,NULL
movstBmi.bmiHeader.biClrUsed,NULL
movstBmi.bmiHeader.biClrImportant,NULL

//把刚才初始化的颜色内存区写入到位图中
invokeSetDIBits,hBackDC,hBmp,0,stRect.bottom,lpBitMap,offset stBmi,DIB_RGB_COLORS

//把开头建立的背景DC中的位图复制到窗口DC中
invoke BitBlt,hDC,stRect.left,stRect.top,stRect.right,stRect.bottom,hBackDC,0,0,SRCCOPY

invokeReleaseDC,_hWnd,hDC

以上的代码是放在WM_RBUTTONDOWN消息里的,这段代码是想用鼠标右击窗口客户区时把客户区的颜色改为红色,可是最后却不是这样的。不知为什么?望高手们给小弟一个答案。

[解决办法]
是不是分配100×100×3共30000字节啊?
-----------------------------------
其实在32位(颜色)中还是要存放100×100×4的
100×100×3是24位颜色的存放方式。

不过对于汇编我还还不懂,图象也不懂。帮你顶。。。。。。。。。。。
[解决办法]
解决了吗?可以蹭点分吗?

读书人网 >汇编语言

热点推荐