如何在窗口上绘制图像?

Vin*_*igi 11 windows winapi createwindow

我在Windows Vista上使用C++中的VS2005创建了一个带有createwindow()api的窗口

我的要求是在该窗口上绘制一个图像(任何格式).我在这个应用程序中没有使用任何MFC.

ser*_*nko 27

不确定你的问题是什么:在表单上绘制位图,或者你想知道如何使用各种图像格式,或两者兼而有之.无论如何,下面是一个如何加载位图并在表单上绘制它的示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

LoadImage加载图标,光标,动画光标或位图.细节在这里

对于使用各种图像格式,您可以使用Windows Imaging Component(请参阅IWICBitmapDecoder)或此处的代码加载JPEG和GIF图片或第三方工具,如FreeImageLeadTools

希望这有帮助,问候

  • 如果我可以节省几分钟的搜索时间,我尝试使用这个答案,但它没有用.经过一段时间的戳戳,我试图将sizeof(位图)更改为sizeof(BITMAP)并且代码工作正常.我在Windows 10上使用Visual Studio 2015.完整的一行:GetObject(hBitmap,sizeof(BITMAP),&bitmap); (2认同)

Ahm*_*ein 8

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 以及在函数退出时从未释放的泄露 HDC?Windows GDI 规则 101:如果你得到它,那么释放它;如果你创建它,然后删除它。您使用画笔正确执行此操作(创建/删除),但使用客户端 DC 执行此操作失败(获取/发布)。 (3认同)
  • 啊,谢谢:) 我解决了。在关闭大括号之前只添加了一行。ReleaseDC(hWnd, hdc); (2认同)