<请教>关于内存中的BMP在C++中的显示

ilostlove001 2014-05-11 08:19:52
已知显示BMP代码如下, 问题在下面描述
1、从文件读取BMP文件
// 显示本地图片
CString FileName= "C:\\ceshi.bmp";
HBITMAP mybmp;
mybmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,NULL,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
HBITMAP oldbmp;
CDC memdc;
CDC *dc=GetDC();
// CRect rect;
memdc.CreateCompatibleDC(dc);
GetClientRect(rect);
oldbmp = (HBITMAP)memdc.SelectObject(mybmp);
//显示图片
dc->BitBlt(20,20,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
memdc.SelectObject(oldbmp);
ReleaseDC(dc);

上面代码能正确显示BMP到界面
问题:
请问, 如果我没有ceshi.bmp, 但是在内存中生成了 BITMAP bitmap 如何把这个bitmap显示到界面中呢.....
...全文
291 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-06-25
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
schlafenhamster 2014-05-25
  • 打赏
  • 举报
回复
HBITMAP hbmp = NULL; hbmp = CreateBitmapIndirect(pBitmap); if( hbmp ) { // move to Clipboard for test OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_BITMAP,hbmp); // not CF_DIB CloseClipboard(); }
ilostlove001 2014-05-24
  • 打赏
  • 举报
回复
以上代码还是不对啊... 唉, 给个能用的吧...
schlafenhamster 2014-05-12
  • 打赏
  • 举报
回复
HBITMAP hbmp = NULL; hbmp = CreateBitmapIndirect(pBitmap); 放到 剪贴板看看 对不对 !(绘图 +paste)
wyx100 2014-05-12
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
如果内存数据已经已经转换为 BITMAP 结构,则内存dc选入,BitBlt到目标DC即可
ilostlove001 2014-05-12
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
使用: HBITMAP CreateBitmapIndirect( CONST BITMAP *lpbm // pointer to the bitmap data);
还是无法显示呢 void CServer2012Dlg::OnBnClickedButtonSendcommand() { // 截屏 CRect rect = CRect(0,0,800,800); BITMAP *pBitmap = new BITMAP; memset(pBitmap, 0, sizeof(BITMAP)); // 这个一定要初始化, 否则会错误 m_pic.GetScreenPic(rect, pBitmap, 2, FALSE); m_pic.SaveBitmapToFile(pBitmap, "C:\\ceshi.bmp"); // 保存一下, 看看截屏是否正确, 这里是正确保存的 HBITMAP hbmp = NULL; hbmp = CreateBitmapIndirect(pBitmap); // 显示图片 HBITMAP oldbmp; CDC memdc; CDC *dc= GetDlgItem(IDC_YZ_STATIC)->GetDC(); memdc.CreateCompatibleDC(dc); GetClientRect(rect); oldbmp = (HBITMAP)memdc.SelectObject(hbmp); // 计算图片显示区域 RECT picrect; GetDlgItem(IDC_YZ_STATIC)->GetClientRect(&picrect); //显示图片 dc->BitBlt(0,10,picrect.right,picrect.bottom,&memdc,0,0,SRCCOPY); memdc.SelectObject(oldbmp); ReleaseDC(dc); OnPaint(); }
xiaohuh421 2014-05-11
  • 打赏
  • 举报
回复
mybmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,NULL,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 把这句, 换成你的 在内存中生成的 BITMAP bitmap . int SetDIBits( HDC hdc, // handle to DC HBITMAP hbmp, // handle to bitmap UINT uStartScan, // starting scan line UINT cScanLines, // number of scan lines CONST VOID *lpvBits, // array of bitmap bits CONST BITMAPINFO *lpbmi, // bitmap data UINT fuColorUse // type of color indexes to use ); 可以把bitmap设置进兼容DC, 然后就一样了.
worldy 2014-05-11
  • 打赏
  • 举报
回复
CDC memdc; CDC *dc=GetDC(); // CRect rect; memdc.CreateCompatibleDC(dc); GetClientRect(rect); oldbmp = (HBITMAP)memdc.SelectObject(mybmp); //显示图片 dc->BitBlt(20,20,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); memdc.SelectObject(oldbmp); ReleaseDC(dc); 这段代码就可以
ilostlove001 2014-05-11
  • 打赏
  • 举报
回复
楼上大哥, 可否完整代码贴下, 我对图片这里生疏得狠呢... 就假如我有了 BITMAP bitmap....
worldy 2014-05-11
  • 打赏
  • 举报
回复
如果内存数据已经已经转换为 BITMAP 结构,则内存dc选入,BitBlt到目标DC即可
schlafenhamster 2014-05-11
  • 打赏
  • 举报
回复
使用: HBITMAP CreateBitmapIndirect( CONST BITMAP *lpbm // pointer to the bitmap data);
ilostlove001 2014-05-11
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuh421 的回复:
mybmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,NULL,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 把这句, 换成你的 在内存中生成的 BITMAP bitmap . int SetDIBits( HDC hdc, // handle to DC HBITMAP hbmp, // handle to bitmap UINT uStartScan, // starting scan line UINT cScanLines, // number of scan lines CONST VOID *lpvBits, // array of bitmap bits CONST BITMAPINFO *lpbmi, // bitmap data UINT fuColorUse // type of color indexes to use ); 可以把bitmap设置进兼容DC, 然后就一样了.
--- 大哥可不可以有完整代码 --- 我知道是应该把 mybmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,NULL,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 把这句, 换成你的 在内存中生成的 BITMAP bitmap . 关键就是不懂怎么正确的换... 两个类型不一样... // --- 我的按钮事件完整代码如下 ---- CRect rect = CRect(0,0,500,600); BITMAP *pBitmap = new BITMAP; memset(pBitmap, 0, sizeof(BITMAP)); // 这个一定要初始化, 否则会错误 m_pic.GetScreenPic(rect, pBitmap, 2, FALSE); m_pic.SaveBitmapToFile(pBitmap, "C:\\ceshi.bmp"); // 保存一下, 看看截屏是否正确, 这里是正确保存的 // 不loadImage, 尝试从内存中显示bitmaap HBITMAP oldbmp; CDC memdc; CDC *dc=GetDC(); memdc.CreateCompatibleDC(dc); GetClientRect(rect); oldbmp = (HBITMAP)memdc.SelectObject((HBITMAP)pBitmap); //显示图片 dc->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); memdc.SelectObject(oldbmp); ReleaseDC(dc); DELETEBITMAP // delete pBitmap OnPaint();
ilostlove001 2014-05-11
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
CDC memdc; CDC *dc=GetDC(); // CRect rect; memdc.CreateCompatibleDC(dc); GetClientRect(rect); oldbmp = (HBITMAP)memdc.SelectObject(mybmp); //显示图片 dc->BitBlt(20,20,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); memdc.SelectObject(oldbmp); ReleaseDC(dc); 这段代码就可以
// --- 写了下测试, 还是不能显示呢 --- 大哥帮看看哪里错了吧, 这问题2天了... // 测试完整代码如下... CRect rect = CRect(0,0,500,600); BITMAP *pBitmap = new BITMAP; memset(pBitmap, 0, sizeof(BITMAP)); // 这个一定要初始化, 否则会错误 m_pic.GetScreenPic(rect, pBitmap, 2, FALSE); m_pic.SaveBitmapToFile(pBitmap, "C:\\ceshi.bmp"); // 保存一下, 看看截屏是否正确, 这里是正确保存的 // 不loadImage, 尝试从内存中显示bitmaap HBITMAP oldbmp; CDC memdc; CDC *dc=GetDC(); memdc.CreateCompatibleDC(dc); GetClientRect(rect); oldbmp = (HBITMAP)memdc.SelectObject((HBITMAP)pBitmap); //显示图片 dc->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); memdc.SelectObject(oldbmp); ReleaseDC(dc);

15,980

社区成员

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

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