Sign in to follow this  

C++ BitBlt Draw Bitmap

This topic is 3595 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

So, I've loaded a bitmap to my app with the code below, but I am trying to use bitblt to mask the black out of it, and then draw it to a specific place on the screen, does anyone have any ideas how to do it? Thanks, help is appreciated.
//BitMapObject.h
#ifndef BITMAPOBJECT_H
#define BITMAPOBJECT_H
#pragma once
#include <windows.h>

class BitMapObject
{
private:
	HDC hdcMemory;
	HBITMAP hbmNewBitMap;
	HBITMAP hbmOldBitMap;
	int iWidth;
	int iHeight;
public:
	//constructor
	BitMapObject();
	//destructor
	~BitMapObject();

	void Load(HDC hdcCompatible,LPCTSTR lpszFilename);
	void Create(HDC hdcCompatible, int width, int height);
	//destroys bitmap and dc
	void Destroy();
	int GetWidth();
	int GetHeight();
	//converts to HDC
	operator HDC();
};

#endif

//Bitmapobject.cpp
#include "bitmapobject.h"

BitMapObject::BitMapObject()
{
	hdcMemory=NULL;
	hbmNewBitMap=NULL;
	hbmOldBitMap=NULL;
	iWidth=0;
	iHeight=0;
}

BitMapObject::~BitMapObject()
{
	//if the hdcMemory hasn't been destroyed, do so
	if(hdcMemory)
		Destroy();
}

void BitMapObject::Load(HDC hdcCompatible, LPCTSTR lpszFilename)
{
	//if hdcMemory isn't null, make it so captain!
	if(hdcMemory)
		Destroy();
	//create memory dc.
	hdcMemory=CreateCompatibleDC(hdcCompatible);
	//load the bitmap
	hbmNewBitMap=(HBITMAP)LoadImage(NULL,lpszFilename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
	//shove the image into the dc
	hbmOldBitMap=(HBITMAP)SelectObject(hdcMemory,hbmNewBitMap);
	//grab the bitmap's properties
	BITMAP bmp;
	GetObject(hbmNewBitMap,sizeof(BITMAP),(LPVOID)&bmp);
	iWidth=bmp.bmWidth;
	iHeight=bmp.bmHeight;
}

void BitMapObject::Create(HDC hdcCompatible, int width, int height)
{
	//if hdcMemory isn't null, blow it up!
	if(hdcMemory)
		Destroy();

	//create the memory dc.
	hdcMemory=CreateCompatibleDC(hdcCompatible);
	//create the bitmap
	hbmNewBitMap=CreateCompatibleBitmap(hdcCompatible, width, height);
	//shove the image into the dc
	hbmOldBitMap=(HBITMAP)SelectObject(hdcMemory, hbmNewBitMap);
	iWidth=width;
	iHeight=height;
}

void BitMapObject::Destroy()
{
	//restore old bitmap.
	SelectObject(hdcMemory, hbmOldBitMap);
	//delete new bitmap.
	DeleteObject(hbmNewBitMap);
	//delete device context.
	DeleteDC(hdcMemory);
	//set members to 0/NULL
	hdcMemory=NULL;
	hbmNewBitMap=NULL;
	hbmOldBitMap=NULL;
	iWidth=0;
	iHeight=0;
}

BitMapObject::operator HDC()
{
	return(hdcMemory);
}

int BitMapObject::GetWidth()
{
	return(iWidth);
}

int BitMapObject::GetHeight()
{
	return(iHeight);
}

Share this post


Link to post
Share on other sites



hBackA = (HBITMAP) LoadImage (hInst, "coat.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE);
hdcBackA = CreateCompatibleDC (NULL) ;
SelectObject(hdcBackA, hBackA);

hdcBack = CreateCompatibleDC(NULL);
hdcObject = CreateCompatibleDC(NULL);
hdcMem = CreateCompatibleDC(NULL);
hdcSave = CreateCompatibleDC(NULL);

bmAndBack = CreateBitmap(300, 300,1,1,NULL); //MONOCHROME BITMAPs!!
bmAndObject = CreateBitmap(300, 300,1,1,NULL);
bmAndMem = CreateCompatibleBitmap(hdc, 300, 300);
hSave = CreateCompatibleBitmap(hdc, 300, 300);

SelectObject(hdcBack, bmAndBack);
SelectObject(hdcObject, bmAndObject);
SelectObject(hdcMem, bmAndMem);
SelectObject(hdcSave, hSave);





BOOL cGraphics::GDI_Blit(int bx, int by, int bw, int bh, int lx, int ly, BOOL Transparent)
{
//hWnd=GethWnd();
//BitBlt (hdc, bx, by, bw, bh, hdcBackA, lx, ly, SRCCOPY) ;

if (Transparent==Trans)
{
COLORREF cColor;
BitBlt(hdcSave, 0, 0, 300, 300, hdcTemp, 0, 0, SRCCOPY); // Backup hTemp into hSave ERROR, should be whole bitmap

cColor = SetBkColor(hdcTemp, RGB(0,0,0)); // SET TRANSPARENT COLOR !!
BitBlt(hdcObject, 0, 0, bw, bh, hdcTemp, lx, ly, SRCCOPY);
SetBkColor(hdcTemp, cColor);

BitBlt(hdcBack, 0, 0, bw, bh, hdcObject, 0, 0, NOTSRCCOPY);
BitBlt (hdcMem, 0, 0, bw, bh, hdcFlip, bx, by, SRCCOPY) ;
BitBlt(hdcMem, 0, 0, bw, bh, hdcObject, 0, 0, SRCAND);

BitBlt(hdcTemp, lx, ly, bw, bh, hdcBack, 0, 0, SRCAND);
BitBlt(hdcMem, 0, 0, bw, bh, hdcTemp, lx, ly, SRCPAINT);
BitBlt(hdcFlip, bx, by, bw, bh, hdcMem, 0, 0, SRCCOPY);
BitBlt(hdcTemp, 0, 0, bw, bh, hdcSave, 0, 0, SRCCOPY); // Move back save to temp
} // End if (Transparent==Trans)
else
BitBlt(hdcFlip, bx, by, bw, bh, hdcTemp, lx, ly, SRCCOPY);

return TRUE;
} // End GDI_Blit

Share this post


Link to post
Share on other sites

This topic is 3595 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this