Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Вывод изображения в окне


Автор: Kirgston 5.12.2010, 17:25
Всем доброго времени суток! Собственно инетересуюсь как вывести изображение на чистом WinApi в окошко на том же чистом WinApi =). Для этого использую средства GDI + :

Код

Gdiplus::Image * m_pImage;
HDC hdc;

HRESULT Load(LPCWSTR szFile)
{
    // Create new Gdiplus::Image object
    m_pImage = new Gdiplus::Image(szFile);

    // Check for success
    if (Gdiplus::Ok == m_pImage->GetLastStatus())
        return S_OK;

    // Cleanup on failure
    delete m_pImage;
    return E_FAIL;
}

HRESULT DrawImg(HDC hdc, RECT& rcBounds)
{
    if (m_pImage)
    {
        // Create Gdiplus::Graphics object from HDC
        Gdiplus::Graphics graphics(hdc);
        // Create Gdiplus::Rect object from RECT
        Gdiplus::Rect rc(rcBounds.left, rcBounds.top, rcBounds.right, rcBounds.bottom);

        // Draw the image
        return Gdiplus::Ok == graphics.DrawImage(
            m_pImage,                        // [in] Gdiplus::Image object
            rc                                // [in] Position and dimensions
            ) ? S_OK : E_FAIL;
    }

    return E_UNEXPECTED;
}


и собственно вызов:

Код

                    hdc = GetDC(hWnd);
                    RECT rc;
                    rc.bottom = 20;
                    rc.left = 10;
                    rc.right = 20;
                    rc.top = 10;

                    Load(L"C:\\Users\\Алекс\\Desktop\\Screen(12_03-21_24)-0000.jpg");
                    DrawImg(hdc,rc);


Сам файл валидный. А у меня всё останавливается именно на строчке: 
Код

if (Gdiplus::Ok == m_pImage->GetLastStatus())


Потому что если не ошибаюсь то m_pImage == NULL. То есть создание GDI + рисунка не проходит. Какое может быть решение проблемы?

Автор: 586 5.12.2010, 20:22
Gdiplus::GdiplusStartup вызывал?

Автор: Kirgston 6.12.2010, 21:31
Цитата(586 @  5.12.2010,  20:22 Найти цитируемый пост)
Gdiplus::GdiplusStartup вызывал?

спасибо , нет , теперь всё понял =)

А не подскажите как удалить этот рисунок с экрана?

Автор: 586 6.12.2010, 21:36
Цитата(Kirgston @  6.12.2010,  21:31 Найти цитируемый пост)
А не подскажите как удалить этот рисунок с экрана? 

InvalidateRect

Автор: Kirgston 6.12.2010, 22:02
Да действительно всё оказалось достаточно просто (Вы меня даже опередили с постом  smile )

Обычный Инвалидейт Рект ничего не дал, пришлось еще чуток дополнить это (обычный не давал прорисовываться новому рисунку).
Код


        InvalidateRect(hWnd,&tRc,true);
        SendMessage(hWnd,WM_PAINT,0,0);
        SendMessage(hWnd,WM_NOTIFY,(WPARAM)hWnd,NULL);

Автор: 586 6.12.2010, 22:15
Цитата(Kirgston @  6.12.2010,  22:02 Найти цитируемый пост)
SendMessage(hWnd,WM_NOTIFY,(WPARAM)hWnd,NULL);

а это ещё зачем?

Цитата(Kirgston @  6.12.2010,  22:02 Найти цитируемый пост)
обычный не давал прорисовываться новому рисунку

Можно было просто закрасить область функцией FillRect или Rectangle.

И почему не отрисовываешь рисунок в обработчике сообщения WM_PAINT.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)