heres my image class:
class image
{
private:
ULONG_PTR m_gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
HDC hdcimage=CreateCompatibleDC(NULL);
HGDIOBJ obj=NULL;
HBITMAP btBitmap=NULL;
Image *img;
bool isimgused=false;
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);
imageheight=1;
imageweight=1;
}
image(HDC hdcWindow)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
hdcwindow=hdcWindow;
}
image(const int width, const int height)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
hdcimage = CreateCompatibleDC(NULL);
btBitmap = CreateBitmap(width,height,1,32,NULL);
obj = SelectObject(hdcimage, btBitmap);
framecount=1;
imageheight=height;
imageweight=width;
}
image( const string & filename)
{
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
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
{
isimgused=true;
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;
clrBackColor=cSource.clrBackColor;
img=cSource.img->Clone();
framedelay =img->GetPropertyItemSize(PropertyTagFrameDelay);
imageweight=cSource.imageweight;
imageheight=cSource.imageheight;
strfilename=cSource.strfilename;
btBitmap=CreateBitmap(imageweight,imageheight,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;
clrBackColor=cSource.clrBackColor;
FileName=cSource.FileName;
img=cSource.img->Clone();
framedelay =img->GetPropertyItemSize(PropertyTagFrameDelay);
imageweight=cSource.imageweight;
imageheight=cSource.imageheight;
strfilename=cSource.strfilename;
btBitmap=CreateBitmap(imageweight,imageheight,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)
{
if(intSelectFrame<0)
intSelectFrame=0;
else if (intSelectFrame>=framecount)
intSelectFrame=framecount-1;
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);
}
};
void RePaint(bool blackandwhite)
{
//clean the hdc
Gdiplus::Graphics graphics(hdcimage);
graphics.Clear(clrBackColor);
//draw image to hdc
graphics.DrawImage(img, 0, 0, img->GetWidth(), img->GetHeight());
BITMAPINFO bitmap_info;
color ave_color;
int bytes_per_scanLine;
int pad_per_scanLine;
int X;
int Y;
//add values to bitmap_info
bitmap_info.bmiHeader.biSize = 40;
bitmap_info.bmiHeader.biWidth = img->GetWidth();
bitmap_info.bmiHeader.biHeight = -img->GetHeight();
bitmap_info.bmiHeader.biPlanes = 1;
bitmap_info.bmiHeader.biBitCount = 32;
bitmap_info.bmiHeader.biCompression = BI_RGB;
bytes_per_scanLine = ((((bitmap_info.bmiHeader.biWidth * bitmap_info.bmiHeader.biBitCount) + 31) / 32) * 4);
pad_per_scanLine = bytes_per_scanLine - (((bitmap_info.bmiHeader.biWidth * bitmap_info.bmiHeader.biBitCount) + 7) / 8);
bitmap_info.bmiHeader.biSizeImage = bytes_per_scanLine * abs(bitmap_info.bmiHeader.biHeight);
//prepared for recive the pixels
BYTE pixels[3][img->GetWidth()] [img->GetHeight()];
GetDIBits (hdcimage,btBitmap , 0, img->GetHeight(), &pixels, &bitmap_info, DIB_RGB_COLORS);
//grayscale the pixels
for (Y = 0; Y< img->GetHeight(); Y++)
{
for (X = 0; X< img->GetWidth(); X++)
{
if(blackandwhite==true)
{
ave_color = (pixels[0] [X] [Y] + pixels[1] [X] [Y] + pixels[2] [X] [Y]) / 3;
pixels[0] [X] [Y] = pixels[0] [X] [Y]+2;
pixels[1] [X] [Y] = pixels[1] [X] [Y]+2;
pixels[1] [X] [Y] = pixels[1] [X] [Y]+2;
}
}
}
//save the new pixels on btBitmap
SetDIBits(hdcimage,btBitmap , 0, img->GetHeight(), &pixels, &bitmap_info, DIB_RGB_COLORS);
}
property<int> FramesCount
{
Get(int)
{
return framecount;
}
};
property<int> FrameDelay
{
Get(int)
{
return framedelay;
}
};
property<string> FileName
{
Get(string)
{
return strfilename;
},
Set(string filename)
{
if(isimgused==true)
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());
isimgused=true;
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 string()
{
return strfilename;
}
operator HICON()
{
return HICONFromHBITMAP(btBitmap);
}
operator HBITMAP()
{
return btBitmap;
}
int height()
{
return imageheight;
}
int width()
{
return imageweight;
}
operator HDC()
{
return hdcimage;
}
bool operator != ( nullptr_t ) const
{
return btBitmap != nullptr;
}
bool operator==(const image &other) const
{
return (other.btBitmap == this->btBitmap);
}
bool operator!=(const image &other) const
{
return !(*this == other);
}
bool haveimage()
{
if(btBitmap==NULL)
return false;
else
return true;
}
~image()
{
Gdiplus::GdiplusShutdown(m_gdiplusToken);
SelectObject(hdcimage, obj);
DeleteObject(btBitmap);
DeleteDC(hdcimage);
}
};
heres how use it:
void Picture(image imgIcon)
{
imgtest=imgIcon;
if(imgtest.FramesCount>1)//it's allawys zero
{
animation.Interval=imgtest.FrameDelay;
animation.timerprocedure=[this]()
{
static int a;
a=a+1;
if(a==imgtest.FramesCount)
a=0;
imgtest.SelectFrame=a;
RECT d;
GetClientRect(hwnd,&d);
RedrawWindow(hwnd,&d,nullptr,RDW_UPDATENOW);
};
animation.Start();
}
else
{
animation.Stop();
}
if(blnAutoSize==true)
setAutoSize(true);
else if(imgtest.FramesCount==0)
InvalidateRect(hwnd,NULL,FALSE);
}
imgtest.FramesCount is give me, allways, zero :(
why?
but if i do these:
image test("C:\\Nova pasta\\10888212_1605526859675480_781339964_n.jpg"), test2(test);
//on main
test.FileName="C:\\Nova pasta\\007.gif";
test2=test;
works fine. but why these problem?