为什么创建这样创建位图显示不出来

erensheep 2004-08-09 07:58:52
我创建一个真彩色24位的位图,高宽都是2个象素,然后算得每行宽8个字节,我采用直接赋值的方法测试,但是画不出来,请问是这样创建吗?请大侠赐教
int cx = 2;
int cy = 2;
int nWidthBytes = 4 * ((cx * 24 + 31) / 32);
static BITMAP bitmap = {0,cx,cy,nWidthBytes,1,24};
static BYTE bits[16] =
{
177, 233, 144, 0, 122, 244,0,0,
122, 122, 133, 0, 255, 233,0,0
};
bitmap.bmBits = bits;
hBitmap = CreateBitmapIndirect(&bitmap);
...全文
245 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
酒红绿叶 2004-08-10
  • 打赏
  • 举报
回复
我通常不用DDB创建。
mark。
stoone 2004-08-10
  • 打赏
  • 举报
回复
mark too
lanstar200 2004-08-10
  • 打赏
  • 举报
回复
mark
erensheep 2004-08-10
  • 打赏
  • 举报
回复
感谢老兄,成功了
lanstar200 2004-08-10
  • 打赏
  • 举报
回复
上面胡乱写的,不太规范,看这个
int cx = 2;
int cy = 2;
int nWidthBytes = 4 * ((cx * 24 + 31) / 32);
DWORD dwDIBSize = nWidthBytes * cy *3;
static BYTE bits[16] =
{
177, 233, 144, 0, 122, 244,0,0,
122, 122, 133, 0, 255, 233,0,0
};
//首先创建一个缓冲用来存放位图头和数据
BITMAPINFOHEADER *lpbmi = (BITMAPINFOHEADER *)malloc( sizeof(BITMAPINFOHEADER) + dwDIBSize);
ZeroMemory(lpbmi , sizeof(BITMAPINFOHEADER) + dwDIBSize );
//初始化位图头
lpbmi->biSize = sizeof(BITMAPINFOHEADER);
lpbmi->biClrImportant = 0;
lpbmi->biClrUsed = 0;
lpbmi->biBitCount = 24;
lpbmi->biCompression = BI_RGB;
lpbmi->biPlanes = 1;
lpbmi->biHeight = cy;
lpbmi->biWidth = cx;
lpbmi->biSizeImage = cx * cy * 3;
lpbmi->biXPelsPerMeter = 0x00000EC4;
lpbmi->biYPelsPerMeter = 0x00000EC4;

//复制位图数据
memcpy(((LPBYTE)lpbmi + sizeof(BITMAPINFOHEADER)) , bits , dwDIBSize);
//创建位图
HDC hdc = ::GetDC(GetSafeHwnd());
HDC dcMem = ::CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateDIBitmap( hdc , lpbmi , CBM_INIT ,
(LPBYTE)lpbmi + sizeof(BITMAPINFOHEADER) ,
(LPBITMAPINFO)lpbmi ,
DIB_RGB_COLORS);
//画图
HBITMAP holdbm = (HBITMAP)SelectObject(dcMem , hBitmap);
BitBlt(hdc , 0 , 0 , 2 , 2 , dcMem , 0 , 0 , SRCCOPY);
SelectObject(dcMem , holdbm);
DeleteDC(dcMem);
free(lpbmi);
lpbmi = NULL;
lanstar200 2004-08-10
  • 打赏
  • 举报
回复
少复制了2句

free(lpbmi);
lpbmi = NULL;
lanstar200 2004-08-10
  • 打赏
  • 举报
回复
int cx = 2;
int cy = 2;
int nWidthBytes = 4 * ((cx * 24 + 31) / 32);
static BYTE bits[16] =
{
177, 233, 144, 0, 122, 244,0,0,
122, 122, 133, 0, 255, 233,0,0
};
//首先创建一个缓冲用来存放位图头和数据
BITMAPINFOHEADER *lpbmi = (BITMAPINFOHEADER *)malloc( sizeof(BITMAPINFOHEADER) + sizeof(bits));
ZeroMemory(lpbmi , sizeof(BITMAPINFOHEADER) + sizeof(bits) );
//初始化位图头
lpbmi->biSize = sizeof(BITMAPINFOHEADER);
lpbmi->biClrImportant = 0;
lpbmi->biClrUsed = 0;
lpbmi->biBitCount = 24;
lpbmi->biCompression = BI_RGB;
lpbmi->biPlanes = 1;
lpbmi->biHeight = 2;
lpbmi->biWidth = 2;
lpbmi->biSizeImage = 2 * 2 * 3;
lpbmi->biXPelsPerMeter = 0x00000EC4;
lpbmi->biYPelsPerMeter = 0x00000EC4;

//复制位图数据
memcpy(((LPBYTE)lpbmi + sizeof(BITMAPINFOHEADER)) , bits , sizeof(bits));
//创建位图
HDC hdc = ::GetDC(GetSafeHwnd());
HDC dcMem = ::CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateDIBitmap( hdc , lpbmi , CBM_INIT ,
(LPBYTE)lpbmi + sizeof(BITMAPINFOHEADER) ,
(LPBITMAPINFO)lpbmi ,
DIB_RGB_COLORS);
//画图
HBITMAP holdbm = (HBITMAP)SelectObject(dcMem , hBitmap);
BitBlt(hdc , 0 , 0 , 2 , 2 , dcMem , 0 , 0 , SRCCOPY);
SelectObject(dcMem , holdbm);
DeleteDC(dcMem);
erensheep 2004-08-10
  • 打赏
  • 举报
回复
请说具体点行吗,为什么DDB创建不行呢?
lanstar200 2004-08-10
  • 打赏
  • 举报
回复
CreateDIBitmap()应该可以

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧