【问题标题】:Set bitmap into CStatic object将位图设置为 CStatic 对象
【发布时间】:2019-11-25 12:23:36
【问题描述】:

我正在尝试将一个位图添加到图片框中。这是我尝试过的:

void DlgError::Define_Image()
{
    // I generate all requiered elements.
    CBitmap bitmap;

    // Depending on the type of the message, I define the image to show.
    switch (Message_Type)
    {
        case Error: bitmap.LoadBitmap(IDB_ERROR); break;
        case Warning: break;

        case Information:
        default: bitmap.LoadBitmap(IDB_INFORMATION); break;
    }

    // I set the new picture.
    m_picture.ModifyStyle(0, SS_BITMAP);
    m_picture.SetBitmap(bitmap);
}

我不知道为什么它不起作用。我在某些论坛中有相同的代码。有谁能够帮我?我必须定义一些额外的样式?

图片框的类型为Bitmap(可以挂在图片控件属性中)

解决方案

我必须说,解决方案是两个答案的结合。最后,我定义了一个局部变量,然后使用下一个代码来做我想做的事情。

void DlgError::Define_Image()
{
    // Depending on the type of the message, I define the image to show.
    switch (Message_Type)
    {
        case Error: bitmap.LoadBitmap(IDB_ERROR); break;
        case Warning: break;

        case Information:
        default: bitmap.LoadBitmap(IDB_INFORMATION); break;
    }

    // I set the new picture.
    m_picture.ModifyStyle(SS_ENHMETAFILE, SS_BITMAP);
    m_picture.SetBitmap(bitmap);
}

感谢所有帮助过我的人!

【问题讨论】:

  • 尝试添加 SS_CENTERIMAGE 样式。
  • @EyIM 仍然无法正常工作...
  • 使用 SS_TYPEMASK 而不是 SS_ENHMETAFILE

标签: c++ bitmap mfc picturebox


【解决方案1】:

您正在使用CBitmap 对象作为Define_Image 函数中的局部变量。 一旦函数超出范围,位图就会被CBitmap 对象的析构函数销毁(这里没有引用计数)。

您需要分离对象,然后将HBITMAP 句柄传递给CStaticSetBitmap

幸运的是,只需要一行:

 m_picture.SetBitmap((HBITMAP)bitmap.Detach());

【讨论】:

  • 谢谢你教我关于物体的破坏!你的回答真的很有帮助
【解决方案2】:

你确定 LoadBitmap 成功了吗?

m_picture 是不是已经用匹配的样式创建了,否则你的代码可能会失败。

SS_BITMAP 是一个数字。如果要改变静态控件的tsyle,需要去掉旧样式:

m_picture.ModifyStyle(SS_TYPEMASK,SS_BITMAP);

否则会产生副作用。 使用 Spy++ 检查样式。

【讨论】:

  • 我试过你说的,但仍然显示为纯灰色矩形。我试图确保该方法成功使用:ENSURE(m_picture.SetBitmap(bitmap)); 并引发异常。
  • 位图中的句柄不是NULL吗?
  • 感谢您的帮助!真的很有帮助!
猜你喜欢
  • 2023-03-27
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2018-08-24
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多