【问题标题】:Rotating a bitmap using GDI+ then converting to HDC使用 GDI+ 旋转位图然后转换为 HDC
【发布时间】:2019-02-26 22:08:24
【问题描述】:

我正在努力按照标题所说的去做。

下面是应该返回带有旋转图标的 HDC 的代码。 我不确定为什么它没有返回任何东西。当我尝试绘制返回的 HDC 时,什么都没有出现,而且我测试它不是我的绘图中的错误。

Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Gdiplus::Bitmap SrcBitmap(L"H:\\Company\\iOG\\blue_arrow.tif", FALSE);

Gdiplus::Graphics DstGraphics(&SrcBitmap);

Gdiplus::REAL angle = lAngle;
DstGraphics.ResetTransform();
DstGraphics.RotateTransform(angle);
DstGraphics.TranslateTransform(SrcBitmap.GetWidth() / 2.0f, SrcBitmap.GetHeight() / 2.0f, Gdiplus::MatrixOrderAppend);
DstGraphics.DrawImage(&SrcBitmap, -((INT)SrcBitmap.GetWidth() / 2), -((INT)SrcBitmap.GetHeight() / 2), SrcBitmap.GetWidth(), SrcBitmap.GetHeight());

HBITMAP hBmp;
SrcBitmap.GetHBITMAP(Gdiplus::Color::Transparent, &hBmp);
HDC dcIcon = CreateCompatibleDC(NULL);
SelectObject(dcIcon, hBmp);

return dcIcon;

【问题讨论】:

  • 你好像忘记检查错误了。
  • 您无法将位图转换为HDC。请用简单的语言解释你要做什么。
  • @BarmakShemirani - 你在哪里查看转换位图(HBITMAP 你的意思是?)到HDC?存在正确的 dc 选择位图 SelectObject(hIcon, hBmp);(奇怪的是 dc 名为 hIcon
  • 您好,感谢您的回复。我有一个图标(蓝色箭头) 我需要旋转图标并将其显示在游戏地图上。我有 .gif、.tif、.bmp、.jpg 中的图标
  • 您可能需要使用不同的源位图和目标位图。

标签: c++ winapi bitmap drawing gdi+


【解决方案1】:

Gdiplus::Bitmap::GetHBITMAP 创建一个新的位图句柄。当不再需要此句柄时,应将其删除。上面代码的设置方式,位图句柄丢失,无法清理。这将导致资源泄漏,程序最终将停止工作。

您应该关注修改后图像的位图句柄,而不是绘制该位图的设备上下文。可以如下修改代码:

HBITMAP convert(const wchar_t* filename, UINT& w, UINT& h)
{
    Gdiplus::Bitmap src(filename, FALSE);
    if(0 != src.GetLastStatus())
        return NULL;

    w = src.GetWidth();
    h = src.GetHeight();
    Gdiplus::Graphics gr(&src);
    gr.ResetTransform();
    gr.RotateTransform(45);
    gr.TranslateTransform(w / 2.0f, h / 2.0f, Gdiplus::MatrixOrderAppend);
    gr.DrawImage(&src, -(INT)w / 2, -(INT)h / 2);// , w, h);
    HBITMAP hbitmap = NULL;
    src.GetHBITMAP(Gdiplus::Color::Transparent, &hbitmap);
    return hbitmap;
}

void draw(HDC hdc)
{
    UINT w, h;
    HBITMAP hbitmap = convert(L"filename.bmp", w, h);
    if(hbitmap)
    {
        HDC memdc = CreateCompatibleDC(hdc);
        auto oldbmp = SelectObject(memdc, hbitmap);
        BitBlt(hdc, 0, 0, w, h, memdc, 0, 0, SRCCOPY);
        SelectObject(memdc, oldbmp);
        DeleteDC(memdc);
        DeleteObject(hbitmap);
    }
}

此外,对GdiplusStartup 的调用应以GdiplusShutdown 结尾

SelectObject(dcIcon, hBmp); 应该被修改为返回旧的位图句柄。最后应该恢复旧的句柄。

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2017-04-11
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多