Установка измененного растрового файла в MFC Picture Control - PullRequest
4 голосов
/ 26 февраля 2010

Есть ли более простой способ сделать это, чем этот, и если это единственный способ, есть ли здесь потенциальные утечки памяти?

    CImage img1;
            int dimx = 100, dimy = 100;
    img1.Load(filename);
    //filename = path on local system to the bitmap

    CDC *screenDC = GetDC();
    CDC *pMDC = new CDC;
    pMDC->CreateCompatibleDC(screenDC);

    CBitmap *pb = new CBitmap;
    pb->CreateCompatibleBitmap(screenDC, dimx, dimy);

    CBitmap *pob = pMDC->SelectObject(pb);
    pMDC->SetStretchBltMode(HALFTONE);
    img1.StretchBlt(pMDC->m_hDC,0, 0, dimx, dimy, 0, 0, img1.GetWidth(), img1.GetHeight(), SRCCOPY);
    pMDC->SelectObject(pob);

    CImage new_image;
    new_image.Attach((HBITMAP)(*pb));
    //
    m_pictureCtrl.SetBitmap(new_image.Detach());
    ReleaseDC(screenDC);

1 Ответ

9 голосов
/ 26 февраля 2010

Я не вижу необходимости в CImage new_image (поскольку SetBitmap принимает HBITMAP, который у вас уже есть через pb), а pb и pMDC должны быть удалены (после отсоединения HBITMAP), но в остальном кажется правильным.

CImage img1;
int dimx = 100, dimy = 100;
img1.Load(filename);
//filename = path on local system to the bitmap

CDC *screenDC = GetDC();
CDC mDC;
mDC.CreateCompatibleDC(screenDC);
CBitmap b;
b.CreateCompatibleBitmap(screenDC, dimx, dimy);

CBitmap *pob = mDC.SelectObject(&b);
mDC.SetStretchBltMode(HALFTONE);
img1.StretchBlt(mDC.m_hDC, 0, 0, dimx, dimy, 0, 0, img1.GetWidth(), img1.GetHeight(), SRCCOPY);
mDC.SelectObject(pob);

m_pictureCtrl.SetBitmap((HBITMAP)b.Detach());
ReleaseDC(screenDC);

Конечно, я бы поместил масштабирование CImage / CBitmap в отдельную функцию (сделайте его многоразовым).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...