HBITMAP和CBITMAP不能成功转换

蒙飞鸿 2010-02-16 02:01:49
CBitmap cb;
cb.LoadBitmap(IDB_BKGROUD);
m_myB5.SetBitmap((HBITMAP)cb);



HBITMAP hBmp;
hBmp = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BKGROUD));
m_myB5.SetBitmap(hBmp);

为什么前者不能显示图片,而后者能?
...全文
286 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
道猫猫 2011-07-12
  • 打赏
  • 举报
回复
试试这个:
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BKGROUD);
m_myB5.SetBitmap((HBITMAP)bitmap.Detach());
arong1234 2010-02-19
  • 打赏
  • 举报
回复
你的转化只是保存了一个句柄,并没有复制一个对象出来!你转化并没有解决cb会被析构的事实!你这种转化完全是掩耳盗铃!在你转化的时候,cb还是合法的,你得到的句柄当然也是合法的,然后cb析构了,对应的位图被删除了,你保存在m_myB5中的句柄自动也失效了。你这种转化有什么用?

你需要做的要么是用你第二种方式,要么确保cb不是局部变量,而不是做这种转化
引用 9 楼 mengfeihong 的回复:
引用 8 楼 arong1234 的回复:前者CBitmap对象是临时变量,函数结束就自动析构,也顺便删除了位图后者HBITMAP没有这种机制,因此幸免于难
所以现在要转化啊,
CBitmap cb;
if(cb.LoadBitmap(IDB_BKGROUD)==NULL)AfxMessageBox("load bitmap fail");

HBITMAP hb = (HBITMAP)cb.GetSafeHandle();
m_myB5.SetBitmap(hb);
m_myB5.ShowWindow(SW_SHOW);
还是不行,
蒙飞鸿 2010-02-19
  • 打赏
  • 举报
回复
引用 8 楼 arong1234 的回复:
前者CBitmap对象是临时变量,函数结束就自动析构,也顺便删除了位图
后者HBITMAP没有这种机制,因此幸免于难

哦,把那个CBitmap做成成员变量(放大其作用域)以后就行了。
cb.GetSafeHandle() 出来的东西还真不稳定,不知道这个句柄和HBITMAP的详细区别哪有介绍。
蒙飞鸿 2010-02-19
  • 打赏
  • 举报
回复
引用 8 楼 arong1234 的回复:
前者CBitmap对象是临时变量,函数结束就自动析构,也顺便删除了位图
后者HBITMAP没有这种机制,因此幸免于难

所以现在要转化啊,
CBitmap cb;
if(cb.LoadBitmap(IDB_BKGROUD)==NULL)AfxMessageBox("load bitmap fail");

HBITMAP hb = (HBITMAP)cb.GetSafeHandle();
m_myB5.SetBitmap(hb);
m_myB5.ShowWindow(SW_SHOW);
还是不行,
arong1234 2010-02-19
  • 打赏
  • 举报
回复
前者CBitmap对象是临时变量,函数结束就自动析构,也顺便删除了位图
后者HBITMAP没有这种机制,因此幸免于难
蒙飞鸿 2010-02-19
  • 打赏
  • 举报
回复
引用 6 楼 yhp1888 的回复:
换了台电脑上网 ,资料不在这 ,大脑记不住那么多 ,麻烦 !

找到了没。。。
yhp1888 2010-02-17
  • 打赏
  • 举报
回复
换了台电脑上网 ,资料不在这 ,大脑记不住那么多 ,麻烦 !
yhp1888 2010-02-17
  • 打赏
  • 举报
回复
遇到问题,多想一想:

CBitmap cb;
cb.LoadBitmap(IDB_BKGROUD);
m_myB5.SetBitmap((HBITMAP)cb.GetSafeHandle());

CBitmap与HBITMAP是两码事。
要从CBitmap中取得句柄HBITMAP
蒙飞鸿 2010-02-16
  • 打赏
  • 举报
回复
判断了,cb.LoadBitmap(IDB_BKGROUD)返回值不为NULL
蒙飞鸿 2010-02-16
  • 打赏
  • 举报
回复
引用 1 楼 xsc2001 的回复:
第一种情况下,你先确认一下你的cb.LoadBitmap(IDB_BKGROUD);成功与否,如果成功了则试一下下面的代码:
m_myB5.SetBitmap((HBITMAP)bmp.GetSafeHandle());

cb.LoadBitmap(IDB_BKGROUD)为什么会不成功?
xsc2001 2010-02-16
  • 打赏
  • 举报
回复
写错了,应该是:
m_myB5.SetBitmap((HBITMAP)cb.GetSafeHandle());
xsc2001 2010-02-16
  • 打赏
  • 举报
回复
第一种情况下,你先确认一下你的cb.LoadBitmap(IDB_BKGROUD);成功与否,如果成功了则试一下下面的代码:
m_myB5.SetBitmap((HBITMAP)bmp.GetSafeHandle());

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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