Eigene Bitmaps

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



Hallo,

Ich muss einige Tausend Bitmaps im Speicher halten.
Dise sind nicht recht groß.
wenn ich sie in eine CBitmap laden, und dann in einem vector ablege,
vector<CBitmap *>, und wenn ich dann einige Zeichnen möchte, ist
ab einer gewissen anzahl nur noch ein schwarzer block zu sehen.

Ich vermute, das windows der gdi speicher aus geht.

Nun habe ich mir ein CMemoryBitmap erstellt.

class CMemoryBitmap
{
public:
CMemoryBitmap(void);
virtual ~CMemoryBitmap(void);

void Attach(CBitmap& bmp);
void Release();

DWORD GetBitmapMemorySize();
BITMAP& GetBitmap() { return m_bitMap; }
const BITMAP& GetBitmap() const { return m_bitMap; }
private:
BITMAP m_bitMap;
};

CMemoryBitmap::CMemoryBitmap(void)
{
memset(&m_bitMap, 0, sizeof(m_bitMap));
}

CMemoryBitmap::~CMemoryBitmap(void)
{
Release();
}

DWORD CMemoryBitmap::GetBitmapMemorySize()
{
DWORD dwSize(((((m_bitMap.bmWidth * m_bitMap.bmBitsPixel) + 31) & ~31) >> 3) * m_bitMap.bmHeight);
return dwSize;
}

void CMemoryBitmap::Release()
{
if (m_bitMap.bmBits)
delete [] m_bitMap.bmBits;
memset(&m_bitMap, 0, sizeof(m_bitMap));
}

void CMemoryBitmap::Attach(CBitmap& bmp)
{
bmp.GetBitmap(&m_bitMap);

DWORD dwMemorySize(GetBitmapMemorySize());

void *pData = new BYTE[dwMemorySize];
memcpy(pData, m_bitMap.bmBits, dwMemorySize);
m_bitMap.bmBits = pData;
}


und mit
BOOL DrawBitmap(CDC *pDC, CBitmap* pbm, int x, int y)
{
CDC mdc; // memory DC
BITMAP bm;

mdc.CreateCompatibleDC(pDC);

CBitmap* pOld = mdc.SelectObject(pbm);
pbm->GetObject(sizeof(bm), &bm);

pDC->MoveTo(x, y); pDC->LineTo(x + 200, y);
BOOL bRet = pDC->BitBlt( x, y, bm.bmWidth, bm.bmHeight, &mdc, 0, 0, SRCCOPY);
CString strText;
strText.Format("%u", bm.bmBitsPixel);
pDC->DrawText(strText, CRect(x + 100, y, x + 200, y + 20), DT_LEFT);

mdc.SelectObject(pOld);

return bRet;
}

BOOL DrawBitmap(CDC *pDC, CMemoryBitmap* pBitmap, int x, int y)
{
if (pBitmap)
{
CBitmap bmp;
bmp.CreateBitmapIndirect(&pBitmap->GetBitmap());
return DrawBitmap(pDC, &bmp, pt.x, pt.y);
}
return FALSE;
}

Zeiche ich die Bitmaps.
Aber nur Bitmaps mit bmBitsPixel == 1 werden dargestellt.
die anderen nicht.
Warum ?

Kann man das alles besser machen ?

Danke
Jimmy
.



Relevant Pages

  • Re: Eigene Bitmaps
    ... CBitmap hält GDI Objekte und deren Handels, du kannst von CPens und soweiter ... Du sollst den Speicher der Bitmaps merken nicht die map selbst. ... Den speicher der Bitmap bekommst du zb. über GetObject ... Nun habe ich mir ein CMemoryBitmap erstellt. ...
    (microsoft.public.de.vc)
  • Re: Eigene Bitmaps
    ... CBitmap hält GDI Objekte und deren Handels, du kannst von CPens und soweiter ... Du sollst den Speicher der Bitmaps merken nicht die map selbst. ... Den speicher der Bitmap bekommst du zb. über GetObject ... Nun habe ich mir ein CMemoryBitmap erstellt. ...
    (microsoft.public.de.vc)
  • Re: CDC, Bitmap, CBitmap, etc...
    ... Also CBitmap verkapselt nur HBITMAP, ... MemDC.TextOut(10,10,"Den text will ich im Speicher sehen"); ... Das geht natürlich nur wenn die Birmap mit der Grafikkarte verbunden ist ...
    (microsoft.public.de.vc)
  • Re: CDC, Bitmap, CBitmap, etc...
    ... hast du nicht via GetObjekt die BITMAP struct ... die Bitmap keinen erreichbaren Speicher, und du kannst nicht auf die Bytes ... Also CBitmap verkapselt nur HBITMAP, ...
    (microsoft.public.de.vc)
  • Re: Reading bitmaps into imagelist
    ... > keeping track of the bitmaps in memory and the image list holding not the ... but a pointer to the bitmap. ... CBitmap *pBitmap = new CBitmap; ...
    (microsoft.public.vc.mfc)