Как нарисовать изображение на окне? - PullRequest
10 голосов
/ 17 ноября 2009

Я создал окно с API createwindow (), используя VS2005 в C ++ в Windows Vista

Мое требование - нарисовать изображение (любого формата) в этом окне. Я не использую MFC в этом приложении.

Ответы [ 2 ]

26 голосов
/ 19 ноября 2009

не совсем уверен, в чем ваша проблема: нарисуйте растровое изображение на форме, или вы хотите знать, как работать с различными форматами изображений, или с обоими. В любом случае ниже приведен пример того, как вы можете загрузить растровое изображение и нарисовать его в форме:

HBITMAP hBitmap = NULL;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;

    switch (message)
    {
<...>

    case WM_CREATE:
        hBitmap = (HBITMAP)LoadImage(hInst, L"c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        break;
    case WM_PAINT:
        PAINTSTRUCT     ps;
        HDC             hdc;
        BITMAP          bitmap;
        HDC             hdcMem;
        HGDIOBJ         oldBitmap;

        hdc = BeginPaint(hWnd, &ps);

        hdcMem = CreateCompatibleDC(hdc);
        oldBitmap = SelectObject(hdcMem, hBitmap);

        GetObject(hBitmap, sizeof(bitmap), &bitmap);
        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, oldBitmap);
        DeleteDC(hdcMem);

        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        DeleteObject(hBitmap);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

LoadImage загружает значок, курсор, анимированный курсор или растровое изображение. Подробности здесь

Для работы с различными форматами изображений вы можете использовать Windows Imaging Component (см. IWICBitmapDecoder ) или код здесь Загрузка изображений JPEG и GIF или сторонние инструменты, такие как FreeImage или LeadTools

надеюсь, это поможет, с уважением

4 голосов
/ 02 мая 2017
void LoadScreen(HWND hWnd) {
    RECT rect;
    HDC hdc = GetDC(hWnd);
    HBRUSH brush = CreatePatternBrush((HBITMAP)LoadImage(NULL, L"file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));
    GetWindowRect(hWnd, &rect);
    FillRect(hdc, &rect, brush);
    DeleteObject(brush);
    ReleaseDC(hWnd, hdc);
}
...