用到GetDIBits出问题了

having_hr 2008-11-05 11:27:48
void StretchDesktop(HWND hMyWnd,HINSTANCE hInstance)
{
HDC hMyDC;
HDC hMemDC;
HBITMAP hBmp;
BITMAPINFO bmpInfo;
TCHAR *lpBuf;
HANDLE hp;

hMyDC=GetDC(hMyWnd);
hMemDC=CreateCompatibleDC(hMyDC);
hBmp=(HBITMAP)LoadImage(hInstance,_T("abc.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

SelectObject(hMemDC,hBmp);

BitBlt(hMyDC,0,0,300,225,hMemDC,0,0,SRCCOPY);


bmpInfo.bmiColors[0].rgbRed=8;
bmpInfo.bmiColors[0].rgbGreen=8;
bmpInfo.bmiColors[0].rgbBlue=8;
bmpInfo.bmiColors[0].rgbReserved=0;
bmpInfo.bmiHeader.biBitCount=24;
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biClrImportant=0;
bmpInfo.bmiHeader.biClrUsed=0;
bmpInfo.bmiHeader.biCompression=BI_RGB;
bmpInfo.bmiHeader.biHeight=225;
bmpInfo.bmiHeader.biWidth=300;
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biSizeImage=0;
bmpInfo.bmiHeader.biXPelsPerMeter=0;
bmpInfo.bmiHeader.biYPelsPerMeter=0;

hp=GetProcessHeap();
lpBuf=(TCHAR *)HeapAlloc(hp,HEAP_ZERO_MEMORY,225*300*3);
if(GetDIBits(hMemDC,hBmp,0,225,lpBuf,&bmpInfo,DIB_RGB_COLORS))
MessageBox(NULL,_T("GetDIBits失败"),_T(""),MB_OK);
if(lpBuf==NULL)
MessageBox(NULL,_T("lpBuf填充失败"),_T(""),MB_OK);


TextOut(hMyDC,0,0,lpBuf,lstrlen(lpBuf));

//GetDIBits(hMemDC,hBmp,0,

DeleteObject(hBmp);
ReleaseDC(hMyWnd,hMyDC);
HeapFree(hp,0,lpBuf);
}

结果GetDIBits成功,lpBuf填充也成功,TextOut的时候却没有输出,什么问题呢?大家看看
...全文
519 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
having_hr 2008-11-07
  • 打赏
  • 举报
回复
自已解决了,还是多谢大家支持!!!细节上的错误很难检查呀。。。。
having_hr 2008-11-06
  • 打赏
  • 举报
回复
上面用TextOut只是想测试一下lBuf是否仍旧是空的
having_hr 2008-11-06
  • 打赏
  • 举报
回复
解决了,主要原因是
bmpInfo.bmiColors[0].rgbRed=8;
bmpInfo.bmiColors[0].rgbGreen=8;
bmpInfo.bmiColors[0].rgbBlue=8;
bmpInfo.bmiColors[0].rgbReserved=0;
bmpInfo.bmiHeader.biBitCount=24;
因为源图是32位位图,所以错了

太乙 2008-11-06
  • 打赏
  • 举报
回复
up一下~~~~
sys0004 2008-11-06
  • 打赏
  • 举报
回复
TextOut是输出文字的吧
dbger 2008-11-06
  • 打赏
  • 举报
回复
TextOut返回值正确不?

删除位图前把旧的替换回去:


HBITMAP hOldBmp = SelectObject(hMemDC,hBmp);
SelectObject(hMemDC,hOldBmp);
DeleteObject(hBmp);


stuarts740 2008-11-06
  • 打赏
  • 举报
回复
学习,帮顶一下
星羽 2008-11-06
  • 打赏
  • 举报
回复
textout 是显示文字的,你的buf里的东西可能不只字符

你这样试试看


。。

strcpy(lpBuf, "hello world");
TextOut(hMyDC,0,0,lpBuf,lstrlen(lpBuf));

。。

如果可以显示,那就是你的buf有问题
chiyan2914 2008-11-06
  • 打赏
  • 举报
回复
UP
Longinc 2008-11-06
  • 打赏
  • 举报
回复
UP
having_hr 2008-11-06
  • 打赏
  • 举报
回复
或者谁能给下SetDIBits、GetDIBits的示例代码?
having_hr 2008-11-06
  • 打赏
  • 举报
回复
另外一个问题,SetDIBits应该怎么用呢?谁能根据上面的代码举个例子讲解一下
帅得不敢出门 2008-11-06
  • 打赏
  • 举报
回复
进来jf

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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