【问题标题】:How to store multiple bitmaps in a class?如何在一个类中存储多个位图?
【发布时间】:2019-06-11 10:27:27
【问题描述】:

我想创建一个类,它在运行时生成一些位图,然后根据请求在目标设备的上下文中绘制它们。

我试试这个:

myBitmaps.h

#include <windows.h>

class myBitmaps 
{ 
public:
  void myBitmaps(HDC hDC);
  const int size = 16;
  HDC firstDC; 
  HBITMAP firstBuff;
  HDC secondDC; 
  HBITMAP secondBuff;

  void drawBitmap(HDC hDC, int xPos, int yPos, bool first);
}

myBitmaps.cpp

#include "myBitmaps.h"

void myBitmaps(HDC hDC)
{
  firstDC = CreateCompatibleDC(hDC); 
  firstBuff = CreateCompatibleBitmap(hDC, size, size); 
  SelectObject(firstDC, firstBuff);
  ...draw some lines...
  secondDC = CreateCompatibleDC(hDC); 
  secondBuff = CreateCompatibleBitmap(hDC, size, size); 
  SelectObject(secondDC, secondBuff);
  ...draw some lines...
}

void drawBitmap(HDC hDC, int xPos, int yPos, bool first)
{
  if(first) {
    BitBlt(hDC, xPos, yPos, size, size, firstDC , 0, 0, SRCCOPY);
  }
  else {
    BitBlt(hDC, xPos, yPos, size, size, secondDC , 0, 0, SRCCOPY);
  }  
}

但是这段代码会导致运行时错误。

如何在我的类中存储多个位图?

【问题讨论】:

  • 您必须在问题中包含更多信息。错误是什么?您发布的代码甚至无法编译。请包含minimal reproducible example
  • 请见谅。我会在 30 分钟内添加更多信息。
  • 注意及时发布CompatibleDC,否则肯定会报错。

标签: c++ winapi bitmap


【解决方案1】:

每个 GDI 对象只能有一种类型选择到任何类型中 DC 一次。内存 DC 是独一无二的,因为它是唯一的类型 可以使用 HBITMAP 调用的 DC 的 ::选择对象。与其他 GDI 对象类型不同,HBITMAP 只能是 一次选择一个 DC。因此,如果您使用相同的 具有多个内存DC的位图,一定要保存原始的HGDIOBJ 当您将位图选择到 DC 时,会从内存 DC 中推出。 否则,您尝试将位图选择到第二个内存 DC 会失败。

更多详情,请参考以下链接。

Guide to Win32 Memory DC

该链接列出了在链接中使用CompatibleDC 时应注意的许多事项。请仔细阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2022-10-20
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多