当前位置: 代码迷 >> 汇编语言 >> 关于SetDIBits函数中那个缓冲区大小的有关问题
  详细解决方案

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

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

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

//取得窗口的DC
invoke GetDC,_hWnd
mov hDC,eax

//建立一个与窗口DC兼容的背景DC
invoke CreateCompatibleDC,hDC
mov hBackDC,eax

//根据前面得到的窗口客户区的宽度和高度建立一个与窗口DC兼容的位图
mov eax,stRect.right
mov l_bmpwidth,eax
inc l_bmpwidth
mov ebx,stRect.bottom
mov l_bmpheight,ebx
inc l_bmpheight
invoke CreateCompatibleBitmap,hDC,l_bmpwidth,l_bmpheight
mov hBmp,eax
invoke SelectObject,hBackDC,hBmp

//为这个新的位图分配内存,宽度×高度×3字节(不知分配这些字节对不对)
xor edx,edx
mov eax,l_bmpwidth
mul l_bmpheight
mov dwBmpSize,eax
mov eax,3
mul dwBmpSize
mov dwBmpSize,eax
invoke GlobalAlloc,GHND,dwBmpSize
mov hBitMap,eax
invoke GlobalLock,hBitMap
mov lpBitMap,eax

//初始化这个颜色内存区,初始为红色,0ffh
assume esi:dword
mov esi,lpBitMap
mov edi,lpBitMap
add edi,dwBmpSize
.while esi <edi
      mov al,0ffh
      mov byte   ptr   [esi],al
      inc esi
      mov al,0h
      mov byte   ptr   [esi],al
      inc esi
      mov byte   ptr   [esi],al
      inc esi
.endw
assume esi:nothing
invoke GlobalUnlock,hBitMap

//填写位图头信息
invoke RtlZeroMemory,offset   stBmi,sizeof BITMAPINFOHEADER
mov stBmi.bmiHeader.biSize,sizeof BITMAPINFOHEADER
push l_bmpwidth
pop stBmi.bmiHeader.biWidth
push l_bmpheight
pop stBmi.bmiHeader.biHeight
mov stBmi.bmiHeader.biPlanes,1
mov stBmi.bmiHeader.biBitCount,24   //颜色深度24位
mov stBmi.bmiHeader.biCompression,BI_RGB
push dwBmpSize
pop stBmi.bmiHeader.biSizeImage
mov stBmi.bmiHeader.biXPelsPerMeter,NULL
mov stBmi.bmiHeader.biYPelsPerMeter,NULL
mov stBmi.bmiHeader.biClrUsed,NULL
mov stBmi.bmiHeader.biClrImportant,NULL

//把刚才初始化的颜色内存区写入到位图中
invoke SetDIBits,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

invoke ReleaseDC,_hWnd,hDC

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

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

不过对于汇编我还还不懂,图象也不懂。帮你顶。。。。。。。。。。。
------解决方案--------------------------------------------------------
解决了吗?可以蹭点分吗?
  相关解决方案