首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于MFC里头位图相关的操作

2012-11-10 
关于MFC里面位图相关的操作说实话,最近一段时间由于项目的关系,不得不和MFC里面的图形东西打交道。在mfc里

关于MFC里面位图相关的操作

说实话,最近一段时间由于项目的关系,不得不和MFC里面的图形东西打交道。

在mfc里面感觉CBITMAP里面的一些函数像是被微软抛弃了,按部就班的创建一个24位图像却始终不能成功。

最后转向DIB来创建。

然后显示也是一样的,感觉MFC里面很多东西都被抛弃了,很多都不能成功。

下面是创建24位位图,并且将位图保存到bmp文件里面的代码:

CDC *pdeskdc = GetDesktopWindow()->GetWindowDC() ; CDC memdc;memdc.CreateCompatibleDC(pdeskdc);int nWidth = GetSystemMetrics(SM_CXSCREEN);int nHeight = GetSystemMetrics(SM_CYSCREEN); BITMAPINFO bi; ZeroMemory(&bi, sizeof(BITMAPINFO));bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bi.bmiHeader.biWidth = nWidth;bi.bmiHeader.biHeight = nHeight;bi.bmiHeader.biPlanes = 1;bi.bmiHeader.biBitCount = 24;BITMAPINFOHEADER bih;memset( &bih , 0 , sizeof(bih) );HCURSOR hCursor = GetCursor();POINT ptCursor;GetCursorPos(&ptCursor);ICONINFO IconInfo = {0};if(GetIconInfo(hCursor, &IconInfo)){ptCursor.x -= IconInfo.xHotspot;ptCursor.y -= IconInfo.yHotspot;if(NULL != IconInfo.hbmMask)DeleteObject(IconInfo.hbmMask);if(NULL != IconInfo.hbmColor)DeleteObject(IconInfo.hbmColor);}bmp.m_hObject = ::CreateDIBSection(memdc.m_hDC, &bi, DIB_RGB_COLORS, (LPVOID*)&lpBitmapBits, NULL, 0);CBitmap *old = memdc.SelectObject(&bmp);memdc.BitBlt(0 , 0 , nWidth ,nHeight , pdeskdc , 0 , 0 , SRCCOPY);DrawIconEx(memdc.m_hDC, ptCursor.x, ptCursor.y, hCursor, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT);int s;s = nWidth*3 %4 ;BITMAPFILEHEADER bh;ZeroMemory(&bh, sizeof(BITMAPFILEHEADER));bh.bfType = 0x4d42;  //bitmap  //bh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bh.bfOffBits = 54 ; bh.bfSize = bh.bfOffBits + (nWidth*3+s)*nHeight;bi.bmiHeader.biCompression = BI_RGB ; bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bi.bmiHeader.biSizeImage = (nWidth*3+s)*nHeight ; bih.biBitCount= 24 ;bih.biCompression= BI_RGB ;bih.biHeight=nHeight;bih.biPlanes=1;bih.biSize=sizeof(BITMAPINFOHEADER);bih.biSizeImage=(nWidth*3+s)*nHeight;bih.biWidth=nWidth;CFile file;if(file.Open(_TEXT("1.bmp"), CFile::modeCreate | CFile::modeWrite)){  file.Write(&bh, sizeof(BITMAPFILEHEADER));file.Write(&bih, sizeof(BITMAPINFOHEADER));//file.Write(lpBitmapBits, 3 * nWidth * nHeight);file.Write(lpBitmapBits, bih.biSizeImage);file.Close();}memdc.DeleteDC() ; 

 

获取上面的代码一开始是用DDB方法,始终不能成功,最后转向DIB。

没有相关书籍作为指导,只能自己摸索。

然后通过  jpeg压缩,jpeg压缩算法不能使32位的图片,所以获取24位图片。

 

获取之后就是解压和显示了 。

显示的时候也是同样的问题,DDB始终不能成功,用DIB就可以,不知道里面到底是什么问题。

 

BITMAPINFO bin;memset(&bin , 0 , sizeof(BITMAPINFO) );bin.bmiHeader.biBitCount = 24 ; bin.bmiHeader.biHeight = 768 ; bin.bmiHeader.biPlanes = 1 ; bin.bmiHeader.biWidth = 1366;bin.bmiHeader.biSize = sizeof(BITMAPINFO);bin.bmiHeader.biSizeImage = (1366*3+2)*768;CRect re;GetWindowRect(&re);StretchDIBits( GetWindowDC()->m_hDC , 0,0,re.Width(),re.Height(),0,0,1366,768,data , &bin , DIB_RGB_COLORS , SRCCOPY );


 

 

就这几行代码就成功了 ,

但是如果用,cbitmap类里面的  createbitmap、setbitbls等函数,基本上是显示不了的。

原因不知道为什么,要是哪位知道可以告诉一下。

这其中页出现很多问题。

比如,保存32位位图的时候,只把bitmapinfo结构体里面的bincounts的值改成24位,其余的不变,大小还是按照32位的存进去,当你读取的时候,居然得到24位的图像。

微软搞得一些东西真是伤脑筋!

 

 

 

 


 

热点排行