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

📄 cdbiobject.cpp

📁 这是机械工业张德丰《MATLAB与外部程序接口编程》随书源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	InitVars();
	KillImage();
	m_nWidth = pDibObject->m_nWidth;
	m_nHeight = pDibObject->m_nHeight;
	m_nPlanes = pDibObject->m_nPlanes;
	m_nBits = pDibObject->m_nBits;
	m_nColors = pDibObject->m_nColors;
	m_nImageType = pDibObject->m_nImageType;
	m_nX = pDibObject->m_nX;
	m_nY = pDibObject->m_nY;
	m_nLastError = pDibObject->m_nLastError;
	m_nScreenPlanes = pDibObject->m_nScreenPlanes;
	m_nScreenBits = pDibObject->m_nScreenBits;
	m_nPaletteBytes = pDibObject->m_nPaletteBytes;
	m_nQuality = pDibObject->m_nQuality;
	m_nPaletteCreationType = pDibObject->m_nPaletteCreationType;
	
	int nNumColors = m_nColors;
	int nWidthBytes = WidthBytes( m_nBits, m_nWidth );
	if( pDibObject->m_hDib != NULL )
	{
		DWORD dwSize = ::GlobalSize( pDibObject->m_hDib );
		char *pData = (char *) ::GlobalLock( pDibObject->m_hDib );
		if( pData != NULL )
		{
			HGLOBAL hGlobal = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );
			if( hGlobal != NULL ){
				char *pDestData = (char *) ::GlobalLock( hGlobal );
				if( pDestData != NULL )
				{
					memcpy( pDestData, pData, dwSize );
					::GlobalUnlock( hGlobal );
					m_hDib = hGlobal;
				}
				else ::GlobalFree( hGlobal );
			}
			::GlobalUnlock( pDibObject->m_hDib );
		}
	}
}
////////////////////////////////////////////////////////////////////////
//CDibObject类的构造函数		    
//----------------------------------------------------------------------
//基本功能:构造一个CDibObject对象。唯一的要求的一个参数是文件名。如果
//给出了CDC设备上下文参数,图像加载后会立即在该设备上下文中显示
//出来。如果给出了nX或nY参数,图像会显示在该坐标指定的位置,否
//则,图像总是显示在坐标为(0, 0)的位置。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//CDC *pDC,默认为NULL
//int nX,默认为-1
//int nY,默认为-1
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CDibObject::CDibObject( const char *pszFilename,
						   CDC *pDC, int nX, int nY )
{
	InitVars();
	Load( pszFilename, pDC, nX, nY );
}
////////////////////////////////////////////////////////////////////////
//CDibObject类的析构函数		    
//----------------------------------------------------------------------
//基本功能:析构CDibObject对象,删除该对象中的图像及相应的变量
//----------------------------------------------------------------------
//参数说明:无
////////////////////////////////////////////////////////////////////////
CDibObject::~CDibObject()
{
	if( m_hDib ) ::GlobalFree( m_hDib );
	if( m_pszFilename != NULL ) delete [] m_pszFilename;
	if( m_pLogPal != NULL ) delete [] m_pLogPal;
}
////////////////////////////////////////////////////////////////////////
//BOOL Load()		    
//----------------------------------------------------------------------
//基本功能:本函数把一个图像文件载入CDibObject类。必需的一个参数是文件
//名。如果给出了CDC设备上下文参数,图像一加载就被绘制。如果给
//出了nX或nY参数,图像将显示在该坐标指定的位置。否则,图像总是
//显示在坐标为(0,0)的位置。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//			CDC *pDC,默认为NULL
//			int nX,默认为-1
//			int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::Load( const char *pszFilename, 
						CDC *pDC, int nX, int nY )
{
	//获取图像文件类型
	m_nImageType = FileType( pszFilename );
	if( m_nImageType == 0 )
	{
		m_nLastError = IMAGELIB_UNSUPPORTED_FILETYPE;
		return( FALSE );
	}
	//删除已存在的图像
	KillImage();
	m_pszFilename = new char [strlen(pszFilename)+1];
	if( m_pszFilename != NULL ) strcpy( m_pszFilename, pszFilename );
	//根据文件类型调用ImageLoad.dll动态链接库中的相应函数打开图像文件
	switch( m_nImageType )
	{
	case IMAGETYPE_BMP:
		m_hDib = ::LoadBMP( pszFilename );
		if( m_hDib == NULL ){
			m_nLastError = ::GetLastPicLibError();
			return( FALSE );
		}
		break;
	case IMAGETYPE_GIF:
		m_hDib = ::LoadGIF( pszFilename );
		if( m_hDib == NULL ){
			m_nLastError = ::GetLastPicLibError();
			return( FALSE );
		}
		break;
	case IMAGETYPE_JPG:
		m_hDib = ::LoadJPG( pszFilename );
		if( m_hDib == NULL ){
			m_nLastError = ::GetLastPicLibError();
			return( FALSE );
		}
		break;
	case IMAGETYPE_PCX:
		m_hDib = ::LoadPCX( pszFilename );
		if( m_hDib == NULL ){
			m_nLastError = ::GetLastPicLibError();
			return( FALSE );
		}
		break;
	case IMAGETYPE_TGA:
		m_hDib = ::LoadTGA( pszFilename );
		if( m_hDib == NULL ){
			m_nLastError = ::GetLastPicLibError();
			return( FALSE );
		}
		break;
	case IMAGETYPE_TIF:
		m_hDib = ::LoadTIF( pszFilename );
		if( m_hDib == NULL ){
			m_nLastError = ::GetLastPicLibError();
			return( FALSE );
		}
		break;
	}
	//处理图像信息头
	ProcessImageHeader();
	//处理调色板
	ProcessPalette();
	//若传入了设备上下文指针,就在指定的设备上下文中绘制图像
	if( pDC != NULL ) Draw( pDC, nX, nY );
	return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL Save()		    
//----------------------------------------------------------------------
//基本功能:本函数保存驻留于CDibObject对象中的当前图像(图像类型定义见
//GetImageType( )函数。
//----------------------------------------------------------------------
//参数说明:const char *pszFilename
//int nType,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::Save( const char *pszFilename, int nType )
{
	//若没有指定文件类型,则根据文件名判断其文件类型
	if( nType == -1 ) nType = ExtensionIndex( pszFilename );
	if( nType < IMAGETYPE_FIRSTTYPE || nType > IMAGETYPE_LASTTYPE ) 
return( FALSE );
	m_nImageType = nType;
	delete [] m_pszFilename;
	m_pszFilename = new char [strlen(pszFilename)+1];
	if( m_pszFilename != NULL ) strcpy( m_pszFilename, pszFilename );
	//根据文件类型调用ImageLoad.dll动态链接库中的相应函数保存图像
	switch( m_nImageType )
	{
	case IMAGETYPE_BMP:
		return( ::SaveBMP( pszFilename, m_hDib ) );
		break;
	case IMAGETYPE_GIF:
		return( ::SaveGIF( pszFilename, m_hDib ) );
		break;
	case IMAGETYPE_JPG:
		return( ::SaveJPG( pszFilename, m_hDib, m_nQuality ) );
		break;
	case IMAGETYPE_PCX:
		return( ::SavePCX( pszFilename, m_hDib ) );
		break;
	case IMAGETYPE_TGA:
		return( ::SaveTGA( pszFilename, m_hDib ) );
		break;
	case IMAGETYPE_TIF:
		return( ::SaveTIF( pszFilename, m_hDib ) );
		break;
	}
	return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL Draw( CDC *pDC, int nX, int nY )		    
//----------------------------------------------------------------------
//基本功能:本函数是在设备描述表上绘制图像。如果X和Y坐标没有给出,图像会
//被画在(0,0)坐标或上次传入的有效坐标处。
//----------------------------------------------------------------------
//参数说明:CDC *pDC
//			int nX,默认为-1
//			int nY,默认为-1
//----------------------------------------------------------------------
//返 回 值:BOOL:成功返回TRUE,失败返回FALSE
////////////////////////////////////////////////////////////////////////
BOOL CDibObject::Draw( CDC *pDC, int nX, int nY )
{
	if( nX != -1 ) m_nX = nX;
	if( nY != -1 ) m_nY = nY;
	m_nLastError = IMAGELIB_HDIB_NULL;
	//没有打开图像
	if( m_hDib == NULL ) return( FALSE );
	char *pTemp;
	//锁定图像对象句柄
	pTemp = (char *) ::GlobalLock( m_hDib );
	m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
	if( pTemp == NULL ) return( NULL );
	//图像信息头
	BITMAPINFOHEADER *pBIH;
	pBIH = (BITMAPINFOHEADER *) &pTemp[sizeof(BITMAPFILEHEADER)];
	int nRet = ::StretchDIBits( pDC->m_hDC, m_nX, m_nY, m_nWidth, m_nHeight, 0, 0, 
m_nWidth, m_nHeight, (const void FAR *) &pTemp[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+m_nPaletteBytes], (BITMAPINFO *)  pBIH,   
DIB_RGB_COLORS, SRCCOPY );
	::GlobalUnlock( m_hDib );
	m_nLastError = IMAGELIB_STRETCHDIBITS_ERROR;
	if( nRet != m_nHeight ) return( FALSE );
	m_nLastError = IMAGELIB_SUCCESS;
	return( TRUE );
}

⌨️ 快捷键说明

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