简体   繁体   中英

Set bitmap into CStatic object

I'm trying to add one bitmap into a picture box. This is what I've tried:

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);
}

I don't know why it's not working. I have the same code I've in some forums. Can anybody help me? I have to define some extra styles?

The picture box has Bitmap as its type (Can be hanged in Picture control properties)

SOLUTION

I must say that the solution is a combination of both answers. Finally, I define one local variable and I use the next code in order to do what I want.

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);
}

Thanks everyone who helped me!

Are you sure that LoadBitmap succeeded?

Isn't m_picture already created with the matching style if not your code might fail.

SS_BITMAP is a number. If you want to change the tsyle of the static control, you need to remove the old style:

m_picture.ModifyStyle(SS_TYPEMASK,SS_BITMAP);

Otherwise you get side effects. Check the style with Spy++.

You are using the CBitmap object as a local variable in the Define_Image function. Once the function goes out of scope, the bitmap is destroyed by the destructor of CBitmap object (there are no ref-counts here).

You need to detach the object and then pass the HBITMAP handle to SetBitmap of CStatic .

Fortunatly, only a single line is required:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM