| | |
Bitmap class
Please support our C++ advertiser: Intel Parallel Studio Home
[/code] #define MAXWRITE (1024*16) class Bitmap{ private: //This function is slow, and thus not good for animation purposes //but for displaying a transparent bitmap that doesn't get redrawn //constantly this is a good function void DrawTransparentBitmap(HDC hdc,HBITMAP hbm,int ix=0,int iy=0,COLORREF transClr=RGB(255,255,255)){ BITMAP bm; int tempx=ix,tempy=iy; GetObject(hbm,sizeof(bm),&bm); HDC hdc2=CreateCompatibleDC(hdc); SelectObject(hdc2,hbm); int xx=0,yy=0; for(int y=tempy;y<tempy+bm.bmHeight;y++){ for(int x=tempx;x<tempx+bm.bmWidth;x++){ COLORREF clr=GetPixel(hdc2,xx,yy); if(clr!=transClr){ SetPixel(hdc,x,y,clr); } xx++; } xx=0; yy++; } DeleteDC(hdc2); } //I added this function from win32 api.hlp, I plan to write my own some day PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp) { BITMAP bmp; PBITMAPINFO pbmi; WORD cClrBits; if(!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)){ MessageBox(0,"Bitmap failed to save","Error...",MB_OK); } cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); if(cClrBits == 1){ cClrBits = 1; } else if(cClrBits <= 4){ cClrBits = 4; } else if(cClrBits <= 8){ cClrBits = 8; } else if(cClrBits <= 16){ cClrBits = 16; } else if(cClrBits <= 24){ cClrBits = 24; } else{ cClrBits = 32; } if(cClrBits != 24){ pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * (2^cClrBits)); } else{ pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)); } pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth = bmp.bmWidth; pbmi->bmiHeader.biHeight = bmp.bmHeight; pbmi->bmiHeader.biPlanes = bmp.bmPlanes; pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; if(cClrBits < 24){ pbmi->bmiHeader.biClrUsed = 2^cClrBits; } pbmi->bmiHeader.biCompression = BI_RGB; pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) /8 * pbmi->bmiHeader.biHeight * cClrBits; pbmi->bmiHeader.biClrImportant = 0; return pbmi; } //I added this function from win32 api.hlp, I plan to write my own some day void CreateBMPFile(LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP,HDC hDC){ HANDLE hf; BITMAPFILEHEADER hdr; PBITMAPINFOHEADER pbih; LPBYTE lpBits; DWORD dwTotal; DWORD cb; BYTE *hp; DWORD dwTmp; pbih = (PBITMAPINFOHEADER) pbi; lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); if(!lpBits){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } if(!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS)){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } hf=CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, (LPSECURITY_ATTRIBUTES) NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if(hf==INVALID_HANDLE_VALUE){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } hdr.bfType=0x4d42; hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+pbih->biSize + pbih->biClrUsed*sizeof(RGBQUAD)+pbih->biSizeImage); hdr.bfReserved1=0; hdr.bfReserved2=0; hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize + pbih->biClrUsed*sizeof (RGBQUAD); if(!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),(LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } if(!WriteFile(hf,(LPVOID)pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrUsed * sizeof (RGBQUAD),(LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } dwTotal = cb = pbih->biSizeImage; hp = lpBits; while(cb > MAXWRITE){ if(!WriteFile(hf,(LPSTR)hp,(int)MAXWRITE,(LPDWORD)&dwTmp,(LPOVERLAPPED)NULL)){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } cb-=MAXWRITE; hp+=MAXWRITE; } if(!WriteFile(hf, (LPSTR) hp, (int) cb,(LPDWORD) &dwTmp, (LPOVERLAPPED) NULL)){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } if(!CloseHandle(hf)){ MessageBox(0,"Failed to save bitmap.","Error...",MB_OK); } GlobalFree((HGLOBAL)lpBits); } HBITMAP hbitmap;//The bitmap public: //Constructor Bitmap(){}; //Constructor specifying either a resource name or a bitmap file path\name.txt Bitmap(char* FOR){ this->hbitmap=LoadBitmap(0,FOR); if(!this->hbitmap){ this->hbitmap=(HBITMAP)LoadImage(NULL,FOR,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); } } //If the bitmap contains data or not BOOL Exists(){ if(!this->hbitmap){ return FALSE; } return TRUE; } //Skipping through the obvious ones now... HBITMAP GetHandle(){ return this->hbitmap; } HBITMAP SetHandle(HBITMAP hbm,HWND hwnd=(HWND)NULL,RECT* r=(RECT*)NULL){ HBITMAP temp; temp=this->hbitmap; this->hbitmap=hbm; if(hwnd){ RECT rect; if(!r){ GetClientRect(hwnd,&rect); } else{ rect=*r; } UpdateWindow(hwnd); RedrawWindow(hwnd,&rect,0,RDW_ERASE|RDW_INVALIDATE); } return temp; } HBITMAP SetHandle(char*FOR,HWND hwnd=(HWND)NULL,RECT* r=(RECT*)NULL){ HBITMAP temp=this->hbitmap; this->hbitmap=LoadBitmap(GetModuleHandle(0),FOR); if(!this->hbitmap){ this->hbitmap=(HBITMAP)LoadImage(NULL,FOR,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); } if(hwnd){ RECT rect; if(!r){ GetClientRect(hwnd,&rect); } else{ rect=*r; } UpdateWindow(hwnd); RedrawWindow(hwnd,&rect,0,RDW_ERASE|RDW_INVALIDATE); } return temp; } //This one nullifies the bitmap void ClearHandle(HWND hwnd=(HWND)NULL,RECT* r=(RECT*)NULL){ this->hbitmap=(HBITMAP)NULL; if(hwnd){ RECT rect; if(!r){ GetClientRect(hwnd,&rect); } else{ rect=*r; } UpdateWindow(hwnd); RedrawWindow(hwnd,&rect,0,RDW_ERASE|RDW_INVALIDATE); } } //Draw the bitmap to a DC, arguments are obvious, bitmap is sized //automatically according to it's actual size. void Draw(HDC hdc,DWORD mode=SRCCOPY,int x=0,int y=0){ BITMAP bm; GetObject(this->hbitmap,sizeof(BITMAP),&bm); int w=bm.bmWidth; int h=bm.bmHeight; HDC src=CreateCompatibleDC(hdc); SelectObject(src,this->hbitmap); BitBlt(hdc,x,y,w,h,src,0,0,mode); DeleteDC(src); } void DrawTransparent(HDC hdc,COLORREF transparentColor=RGB(255,255,255),int x=0,int y=0){ DrawTransparentBitmap(hdc,this->hbitmap,x,y,transparentColor); } //Save to the specified file void SaveToFile(char* file){ BITMAPINFO* bmi=CreateBitmapInfoStruct(this->hbitmap); CreateBMPFile(file,bmi,this->hbitmap,GetDC(GetDesktopWindow())); } }; [/code]
Similar Threads
- Bitmap pointer in a bitmap slide bar; Visual C++ 2008 (C++)
- Help Bitmap Image! (Visual Basic 4 / 5 / 6)
- bitmap (C++)
- bitmap display (C++)
- Bitmap in C++ (C++)
| Thread Tools | Search this Thread |
Tag cloud for C++
api application array arrays assignment beginner binary bitmap c++ c/c++ calculator char char* class classes code coding compile compiler console conversion convert count data database delete developer display dll email encryption error file forms fstream function functions game generator getline givemetehcodez graph homeworkhelper iamthwee ifstream image input int java lazy lib loop looping loops map math matrix memory multidimensional multiple newbie news node number numbertoword output parameter pointer problem program programming project proxy python random read recursion recursive reference return sorting string strings struct template templates text tree url variable vector video visual visualstudio win32 windows winsock word wordfrequency wxwidgets



