⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dib.cpp

📁 本上机平台专门为《计算机辅助设计技术基础》课程中的vC语言编程和交互技术与用户接口实验部分设计。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//释放得到的与位图相关的设备
BOOL CDIB::ReleaseDC(CDC *pdc)
{
	ASSERT(pdc != NULL);
	if(pdc->IsKindOf(RUNTIME_CLASS(CDibDC))){
		delete pdc;
		return(TRUE);
	}
	return(FALSE);
}

#ifdef _DEBUG
void CDIB::Dump(CDumpContext& dc) const
{
	CGdiObject::Dump(dc);

	if (m_hObject == NULL)
		return;

	BITMAP bm;
	VERIFY(GetObject(sizeof(bm), &bm));
	dc << "bm.bmType = " << bm.bmType;
	dc << "\nbm.bmHeight = " << bm.bmHeight;
	dc << "\nbm.bmWidth = " << bm.bmWidth;
	dc << "\nbm.bmWidthBytes = " << bm.bmWidthBytes;
	dc << "\nbm.bmPlanes = " << bm.bmPlanes;
	dc << "\nbm.bmBitsPixel = " << bm.bmBitsPixel;

	dc << "\n";
}
#endif


//////////////////////////////////////////////////////////////////
// 
// LoadBmp(LPCSTR filename)
// 
// 完成功能:
//     读入图像文件
//
// 输入参数:
//	   位图文件名 filename
//
// 返回参数:
//	   是否成功(-1为不成功)
//
//////////////////////////////////////////////////////////////////

//读入图像文件
int CDIB::LoadBmp(LPCSTR filename)
{
	//打开文件
	CFile file(filename,CFile::modeRead|CFile::shareDenyNone);

	WORD	bfType;
	DWORD   bfSize; 
	
	//读入文件头
	file.Read(&bfType,sizeof(WORD));
	file.Read(&bfSize,sizeof(DWORD));
	if(bfSize <= 0)
	{
		file.Close();
		return -1;
	}
	
	//是否Bmp文件
	if (bfType != (((WORD)'M'<<8) + 'B'))
	{
		file.Close();
		return -1;
	}

	DWORD   bfOffBits; 
	//找到位图数据起始偏移并读入
	file.Seek(2*sizeof(WORD),CFile::current);
	file.Read(&bfOffBits,sizeof(DWORD));

	LPVOID DibBuf;
	
	DibBuf = (LPVOID)new char[bfSize];

	if(DibBuf == NULL)
	{
		file.Close();
		return -1;
	}

	//读入位图数据
	file.ReadHuge(DibBuf,bfSize);
	file.Close();
	
	LPBITMAPINFO pBMI;
	
	int size = bfOffBits - 14;
	pBMI = (LPBITMAPINFO)new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];

	//生成信息头
	memcpy(pBMI,DibBuf,size);
	LPVOID lpBits = (LPVOID)((LPSTR)DibBuf + size);

	//创建位图
	CreateDIBIndirect(pBMI, lpBits);

	delete pBMI;
	delete DibBuf;
	return 1;
}


//////////////////////////////////////////////////////////////////
// 
// GetColorUsed()
// 
// 完成功能:
//     得到使用的颜色数
//
// 输入参数:
//	   无
//
// 返回参数:
//	   颜色数
//
//////////////////////////////////////////////////////////////////

//得到使用的颜色数
int CDIB::GetColorUsed()
{
	LPBITMAPINFOHEADER pBMIH;
	DIBSECTION DibSection;
	GetDibSection(&DibSection);
	pBMIH = &DibSection.dsBmih;
	return pBMIH->biClrUsed;
}

//////////////////////////////////////////////////////////////////
// 
// GetPalette()
// 
// 完成功能:
//     得到使用的调色板
//
// 输入参数:
//	   无
//
// 返回参数:
//	   调色板指针,用完应释放
//
//////////////////////////////////////////////////////////////////

//得到使用的调色板
CPalette * CDibDC::GetPalette()
{
	LOGPALETTE * pLogPal = (LOGPALETTE *)new char[sizeof(LOGPALETTE) +
		 256 * sizeof(PALETTEENTRY)];

	pLogPal->palVersion = 0x300;
	pLogPal->palNumEntries = 256;

	HDC hdc = GetSafeHdc();
	RGBQUAD pRGB[256];
	::GetDIBColorTable(hdc, 0, 256,pRGB);
	
	for(int i = 0 ; i < 256 ; i ++)
	{
		pLogPal->palPalEntry[i].peRed = pRGB[i].rgbRed;
		pLogPal->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
		pLogPal->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
		pLogPal->palPalEntry[i].peFlags = 0;
	}
	
	CPalette * pPal = NULL;
	pPal = new CPalette;	
	pPal->CreatePalette(pLogPal);

	delete pLogPal;
	return pPal;
}

//////////////////////////////////////////////////////////////////
// 
// GetBitmapInfo(void)
// 
// 完成功能:
//     得到位图信息
//
// 输入参数:
//	   无
//
// 返回参数:
//	   位图信息指针,用完应释放
//
//////////////////////////////////////////////////////////////////

//得到位图信息
LPBITMAPINFO CDIB::GetBitmapInfo(void)
{
	DIBSECTION DibSection;
	GetDibSection(&DibSection);
	int nSize = DibSection.dsBmih.biClrUsed*sizeof(RGBQUAD) + sizeof(BITMAPINFOHEADER);
	
	BYTE *pByte = new BYTE[nSize];
	memcpy(pByte, &(DibSection.dsBmih), sizeof(BITMAPINFOHEADER));
	CDC *pdc = GetDC();
	::GetDIBColorTable(pdc->GetSafeHdc(), 0, DibSection.dsBmih.biClrUsed,
						(RGBQUAD*)(pByte+sizeof(BITMAPINFOHEADER)));
	ReleaseDC(pdc);
	BITMAPINFO *pBMI = (BITMAPINFO*)pByte;
	return(pBMI);
}


//////////////////////////////////////////////////////////////////
// 
// SaveBmp(LPCSTR filename)
// 
// 完成功能:
//     保存位图文件
//
// 输入参数:
//	   文件名 filename
//
// 返回参数:
//	   是否成功
//
//////////////////////////////////////////////////////////////////

//保存文件
int CDIB::SaveBmp(LPCSTR filename)
{
	BITMAPFILEHEADER hdr;

	//打开文件
	CFile file(filename,CFile::modeWrite|CFile::modeCreate);

	//文件头
	hdr.bfType = ((WORD)'M'<<8) + 'B';
	LPBITMAPINFO pbi = GetBitmapInfo(); 
	PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER) pbi; 

	hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); 

    hdr.bfReserved1 = 0; 
    hdr.bfReserved2 = 0; 

    // Compute the offset to the array of color indices. 
    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD); 
	
    //写入文件头
	file.Write((LPVOID) &hdr, sizeof(BITMAPFILEHEADER));

	//写入信息头
    file.Write((LPVOID) pbih, sizeof(BITMAPINFOHEADER) 
                  + pbih->biClrUsed * sizeof (RGBQUAD)); 

    // Copy the array of color indices into the .BMP file. 
	//写入数据
    int nTotal = pbih->biSizeImage; 
	
    LPVOID lpBits = GetBits(); 
    file.WriteHuge(lpBits, nTotal);

	//关闭文件
	file.Close();	
	
	delete pbi;

	return 1;
}
void CDIB::Show(CWnd *pWnd)
{
HDC hdc=::GetDC(pWnd->m_hWnd);
HBITMAP bmp=HBITMAP(m_hObject);
HDC hdcmem=::CreateCompatibleDC(hdc);
::SelectObject(hdcmem,bmp);
::BitBlt(hdc,0,0,GetWidth(),GetHeight(),hdcmem,0,0,SRCCOPY);
::DeleteObject(bmp);
}

//////////////////////////////////////////////////////////////////
// 
// CaptureDIB(CWnd * pWnd, const CRect& capRect)
// 
// 完成功能:
//     捕捉窗口图象
//
// 输入参数:
//	   窗口指针 pWnd
//     捕捉的大小 capRect
//
// 返回参数:
//	   是否成功
//
//////////////////////////////////////////////////////////////////

//捕捉窗口图象
BOOL CDIB::CaptureDIB(CWnd * pWnd, const CRect& capRect)
{
	BOOL ret = false;

	if(pWnd == NULL)
		return false;

	CDC * pPlayDc = pWnd->GetDC();

	if(pPlayDc == NULL)
		return false;

	CRect Rect;
	if(capRect.IsRectEmpty())
		pWnd->GetClientRect(Rect);
	else
		Rect = capRect;

	//得到图像颜色数
	UINT nBitCount = pPlayDc->GetDeviceCaps(BITSPIXEL);

	//创建位图
	if(CreateDIB(Rect.Width(), Rect.Height(), nBitCount))
	{
		CDC * pCopyDc = GetDC();
		
		if(pCopyDc == NULL)
		{
			pWnd->ReleaseDC(pPlayDc);		
			return false;
		}

		pWnd->ShowWindow(SW_SHOW);
		//捕捉
		if(pCopyDc->BitBlt(0, 0, Rect.Width(), Rect.Height(), pPlayDc, 0, 0, SRCCOPY))
			ret = true;
		
		ReleaseDC(pCopyDc);
	}

	pWnd->ReleaseDC(pPlayDc);		
	return ret;
}


////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
//
// CDibDC
//
// 设备无关位图设备类(版本1.0)
//
// 完成功能:
//     与设备无关位图的相关联
//
// 版本所有: 罗隽,曾志
//
//////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CDibDC, CDC);

CDibDC::CDibDC()
{
	m_hOld = NULL;
}

CDibDC::~CDibDC()
{
	if(m_hOld != NULL){
		::SelectObject(GetSafeHdc(), m_hOld);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -