【问题标题】:Loading a bitmap to a window将位图加载到窗口
【发布时间】:2015-06-10 21:06:19
【问题描述】:

我想在我的应用程序中将位图加载到窗口,我将使用 GDI 将位图绘制到窗口。在处理WM_PAINT 消息时我是否也应该绘制位图,以便位图保留在窗口上?

【问题讨论】:

  • 让自己的生活变得轻松,WM_PAINT处理程序中绘图。您将避免重复代码和引入细微的错误。准备好绘图时,使用InvalidateRect 强制WM_PAINT
  • @Mark Ransom 嗨,如果我在WM_PAINT 处理程序之外进行绘制,您能告诉我这些“微妙的错误”是什么吗?以下 MSDN 文章未提及任何错误:msdn.microsoft.com/en-us/library/windows/desktop/…
  • @Mark Ransom 哦,我还以为你所说的“错误”是指我的程序会崩溃之类的!谢谢。

标签: c++ c winapi gdi


【解决方案1】:

是的,您应该像这样在 WM_PAINTWM_ERASEBKGND 处理程序中绘制位图:

        switch(Msg)
        {
        case WM_DESTROY:
            PostQuitMessage(WM_QUIT);
            break;
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &Ps);

            // Load the bitmap from the resource
            bmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MY_COOL_PIC));
            // Create a memory device compatible with the above DC variable
            MemDC = CreateCompatibleDC(hDC);
            // Select the new bitmap
            HBITMAP hOldBmp = SelectObject(MemDC, bmp);

            // Copy the bits from the memory DC into the current dc
            BitBlt(hDC, 10, 10, 450, 400, MemDC, 0, 0, SRCCOPY);

            // Restore the old bitmap
            SelectObject(MemDC, hOldBmp);
            DeleteObject(bmp);

            DeleteDC(MemDC);
            EndPaint(hWnd, &Ps);
            break;
        default:
            return DefWindowProc(hWnd, Msg, wParam, lParam);
        }

【讨论】:

  • 当您仍有选择的对象时,请勿删除 DC。在调用 DeleteDC(MemDC) 之前取消选择 bmp
猜你喜欢
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多