| | |
Bitmap class
[/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 |
addition api array base based binary bitmap c++ c/c++ char class classes code coding compile console conversion count delete deploy desktop developer directshow dll download dynamic dynamiccharacterarray email embed encryption error erroraftercompilation excel file forms fstream function functions game getline givemetehcodez gmail graph gui homework homeworkhelp homeworkhelper iamthwee ifstream input int integer java lib linkedlist linker loop looping loops map math matrix matrix3d memory multiple news node output parameter pointer problem program programming project python random read recursion reference rpg std::coutwstring string strings temperature template test text text-file tree url variable vector video visualization win32 windows winsock word wordfrequency wxwidgets



