Code:
class image
{
private:
ULONG_PTR m_gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
HDC hdcimage=CreateCompatibleDC(NULL);
HGDIOBJ obj=NULL;
HBITMAP btBitmap;
Image *img;
int imageheight=0;
int imageweight=0;
int framecount=0;
int intSelectFrame=0;
int framedelay=0;
string strfilename="";
Gdiplus::Color clrBackColor=Gdiplus::Color::Transparent;
HDC hdcwindow;
bool blnTransparent=true;
HICON HICONFromHBITMAP(HBITMAP bitmap)
{
BITMAP bmp;
GetObject(bitmap, sizeof(BITMAP), &bmp);
HBITMAP hbmMask = CreateCompatibleBitmap(GetDC(NULL), bmp.bmWidth, bmp.bmHeight);
ICONINFO ii = {0};
ii.fIcon = TRUE;
ii.hbmColor = bitmap;
ii.hbmMask = hbmMask;
HICON hIcon = CreateIconIndirect(&ii);
DeleteObject(hbmMask);
return hIcon;
}
public:
image()
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
btBitmap=CreateCompatibleBitmap(hdcimage,1,1);
obj = SelectObject(hdcimage, btBitmap);
}
image(HDC hdcWindow)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
hdcwindow=hdcWindow;
}
image(int width, int height)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
hdcimage = CreateCompatibleDC(NULL);
btBitmap = CreateCompatibleBitmap(hdcimage,width,height);
obj = SelectObject(hdcimage, btBitmap);
framecount=1;
}
image( const string & filename)
{
strfilename=filename;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
if(toupper(filename[filename.size()-3])=='C' && toupper(filename[filename.size()-2])=='U' && toupper(filename[filename.size()-1])=='R')
{
//create the transparent icon handle
HCURSOR hicon = (HCURSOR)LoadImage(NULL, filename.c_str(), IMAGE_CURSOR, imageweight, imageheight, LR_LOADFROMFILE|LR_SHARED|LR_DEFAULTSIZE|LR_LOADTRANSPARENT);
ICONINFO ii;
BOOL fResult = GetIconInfo(hicon, &ii);
if (fResult)
{
BITMAP bm;
fResult = GetObject(ii.hbmMask, sizeof(bm), &bm) == sizeof(bm);
if (fResult)
{
imageweight= bm.bmWidth;
imageheight= ii.hbmColor ? bm.bmHeight : bm.bmHeight / 2;
}
if (ii.hbmMask) DeleteObject(ii.hbmMask);
if (ii.hbmColor) DeleteObject(ii.hbmColor);
}
btBitmap=CreateBitmap(imageweight,imageheight,1,32,NULL);//create the bitmap with icon size
obj = SelectObject(hdcimage, btBitmap);//add the bitmap to memory DC
DrawIconEx(hdcimage,0,0,hicon,imageweight,imageheight,0,0,DI_NORMAL);//draw the icon to DC with right size
//seems the DrawIcon(), always, draw it with 32X32 size
framecount=1;
DestroyCursor(hicon);
}
else
{
Gdiplus::Image img2(towstring(filename).c_str());
btBitmap=CreateBitmap(img2.GetWidth(),img2.GetHeight(),1,32,NULL);
obj = SelectObject(hdcimage, btBitmap);
Gdiplus::Graphics graphics(hdcimage);
graphics.DrawImage(&img2, 0, 0, img2.GetWidth(), img2.GetHeight());
imageweight=img2.GetWidth();
imageheight=img2.GetHeight();
UINT count = 0;
count = img2.GetFrameDimensionsCount();
GUID* pDimensionIDs = (GUID*)malloc(sizeof(GUID)*count);
img2.GetFrameDimensionsList(pDimensionIDs, count);
framecount=img2.GetFrameCount(&pDimensionIDs[0]);
if (framecount>1)
framedelay =img2.GetPropertyItemSize(PropertyTagFrameDelay);
else
framedelay =0;
img=new Image(towstring(filename).c_str());
free(pDimensionIDs);
}
}
image (const image &cSource)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
framecount=cSource.framecount;
framedelay=cSource.framedelay;
clrBackColor=cSource.clrBackColor;
img=cSource.img->Clone();
imageweight=cSource.imageweight;
imageheight=cSource.imageheight;
strfilename=cSource.strfilename;
btBitmap=CreateBitmap(imageweight,imageweight,1,32,NULL);
obj = SelectObject(hdcimage, btBitmap);
BitBlt(hdcimage,0,0,imageweight,imageheight,cSource.hdcimage,0,0,SRCCOPY);
}
image& operator= (const image &cSource)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
framecount=cSource.framecount;
framedelay=cSource.framedelay;
clrBackColor=cSource.clrBackColor;
img=cSource.img->Clone();
imageweight=cSource.imageweight;
imageheight=cSource.imageheight;
strfilename=cSource.strfilename;
btBitmap=CreateBitmap(imageweight,imageweight,1,32,NULL);
obj = SelectObject(hdcimage, btBitmap);
BitBlt(hdcimage,0,0,imageweight,imageheight,cSource.hdcimage,0,0,SRCCOPY);
return *this;
}
property <int> SelectFrame
{
Get(int)
{
return intSelectFrame;
},
Set(int selectframe)
{
intSelectFrame=selectframe;
UINT count = 0;
count = img->GetFrameDimensionsCount();
GUID* pDimensionIDs = (GUID*)malloc(sizeof(GUID)*count);
img->GetFrameDimensionsList(pDimensionIDs, count);
img->SelectActiveFrame(&pDimensionIDs[0],intSelectFrame);
Gdiplus::Graphics graphics(hdcimage);
graphics.Clear(clrBackColor);
graphics.DrawImage(img, 0, 0, img->GetWidth(), img->GetHeight());
free(pDimensionIDs);
}
};
property<int> FramesCount
{
Get(int)
{
return framecount;
}
};
property<string> FileName
{
Get(string)
{
return strfilename;
},
Set(string filename)
{
delete img;
DeleteObject(btBitmap);
DeleteObject(obj);
strfilename=filename;
if(toupper(filename[filename.size()-3])=='C' && toupper(filename[filename.size()-2])=='U' && toupper(filename[filename.size()-1])=='R')
{
//create the transparent icon handle
HCURSOR hicon = (HCURSOR)LoadImage(NULL, filename.c_str(), IMAGE_CURSOR, imageweight, imageheight, LR_LOADFROMFILE|LR_SHARED|LR_DEFAULTSIZE|LR_LOADTRANSPARENT);
ICONINFO ii;
BOOL fResult = GetIconInfo(hicon, &ii);
if (fResult)
{
BITMAP bm;
fResult = GetObject(ii.hbmMask, sizeof(bm), &bm) == sizeof(bm);
if (fResult)
{
imageweight= bm.bmWidth;
imageheight= ii.hbmColor ? bm.bmHeight : bm.bmHeight / 2;
}
if (ii.hbmMask) DeleteObject(ii.hbmMask);
if (ii.hbmColor) DeleteObject(ii.hbmColor);
}
btBitmap=CreateBitmap(imageweight,imageheight,1,32,NULL);//create the bitmap with icon size
obj = SelectObject(hdcimage, btBitmap);//add the bitmap to memory DC
DrawIconEx(hdcimage,0,0,hicon,imageweight,imageheight,0,0,DI_NORMAL);//draw the icon to DC with right size
//seems the DrawIcon(), always, draw it with 32X32 size
framecount=1;
DestroyCursor(hicon);
}
else
{
Gdiplus::Image img2(towstring(filename).c_str());
btBitmap=CreateBitmap(img2.GetWidth(),img2.GetHeight(),1,32,NULL);
obj = SelectObject(hdcimage, btBitmap);
Gdiplus::Graphics graphics(hdcimage);
graphics.DrawImage(&img2, 0,0,img2.GetWidth(),img2.GetHeight());
imageweight=img2.GetWidth();
imageheight=img2.GetHeight();
UINT count = 0;
count = img2.GetFrameDimensionsCount();
GUID* pDimensionIDs = (GUID*)malloc(sizeof(GUID)*count);
img2.GetFrameDimensionsList(pDimensionIDs, count);
framecount=img2.GetFrameCount(&pDimensionIDs[0]);
framedelay =img2.GetPropertyItemSize(PropertyTagFrameDelay);
img=new Image(towstring(filename).c_str());
free(pDimensionIDs);
}
}
};
property<Gdiplus::Color> Backcolor
{
Get(Gdiplus::Color)
{
return clrBackColor;
},
Set(Gdiplus::Color bkcolor)
{
clrBackColor = bkcolor;
SetDCBrushColor(hdcimage,clrBackColor.ToCOLORREF());
}
};
void draw(HDC control)
{
//if (clrBackColor.GetValue() == Gdiplus::Color::Transparent)
if (clrBackColor.GetValue()== Gdiplus::Color::Transparent)
{
TransparentBlt(control, 0, 0,width(),height(),hdcimage, 0, 0,width(), height(), GetPixel(hdcimage,width()-1,height()-1));
}
else
{
BitBlt(control,0,0,width(),height(),hdcimage,0,0,SRCCOPY);
}
//InvalidateRect(WindowFromDC(control),NULL,false);
}
operator HICON()
{
return HICONFromHBITMAP(btBitmap);
}
operator HBITMAP()
{
/*BITMAP bm;
HDC MemDCExercising = CreateCompatibleDC(hdcimage);
GetObject(btBitmap,sizeof(bm),&bm);
HBITMAP outbitmap=CreateBitmap(bm.bmWidth,bm.bmHeight,1,32,NULL);
HBITMAP oldbitmap =(HBITMAP) SelectObject(MemDCExercising, outbitmap);
TransparentBlt(MemDCExercising, 0, 0, bm.bmWidth , bm.bmHeight, hdcimage, 0, 0,bm.bmWidth , bm.bmHeight,GetPixel(hdcimage,0,0) );
SelectObject(MemDCExercising,oldbitmap);
DeleteDC(MemDCExercising);*/
return btBitmap;
}
int height()
{
return imageheight;
}
int width()
{
return imageweight;
}
operator HDC()
{
return hdcimage;
}
~image()
{
//delete btBitmap;
//delete graphic; //memory leak, when i excute the aplication
DeleteObject(obj);
delete img;
Gdiplus::GdiplusShutdown(m_gdiplusToken);
//DeleteObject(btBitmap);//don't show me the image
DeleteDC(hdcimage);
}
};
//on menu class
void bitmap(image imgImage)
{
//HBITMAP bitimage = (HBITMAP)LoadImage( NULL, filename.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HMENU hMenu = NULL;
if(primeiromenu)
hMenu = mnuBar;
else
hMenu = MenuHandle;
SetMenuItemBitmaps(hMenu,ID,MF_BYCOMMAND,(HBITMAP)imgImage ,(HBITMAP)imgImage);
}
i ahve more 1 problem with gif's files, because i get a black color, on background