www.pudn.com > Load.rar > LoadDoc.cpp


// LoadDoc.cpp : implementation of the CLoadDoc class 
// 
 
#include "stdafx.h" 
#include "Load.h" 
 
#include "LoadDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLoadDoc 
 
IMPLEMENT_DYNCREATE(CLoadDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CLoadDoc, CDocument) 
	//{{AFX_MSG_MAP(CLoadDoc) 
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen) 
	ON_COMMAND(ID_ZOOMOUT, OnZoomout) 
	ON_COMMAND(ID_ZOOMIN, OnZoomin) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLoadDoc construction/destruction 
 
CLoadDoc::CLoadDoc() 
{ 
	// TODO: add one-time construction code here 
 
} 
 
CLoadDoc::~CLoadDoc() 
{ 
} 
 
BOOL CLoadDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CLoadDoc serialization 
 
void CLoadDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLoadDoc diagnostics 
 
#ifdef _DEBUG 
void CLoadDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CLoadDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CLoadDoc commands 
 
 
 
 
 
 
 
BOOL CLoadDoc::PrepareShowdata() 
{ 
	BYTE** image; 
	BYTE** originimage; 
	int i,j; 
	int linewidth; 
 
	if(lpshowbuf!=NULL) 
		HeapFree(GetProcessHeap(),0,lpshowbuf); 
	if(zoomfactor>=1) 
	{//放大 
		pbi->bmiHeader.biHeight=bi.biHeight*zoomfactor; 
		pbi->bmiHeader.biWidth=bi.biWidth*zoomfactor; 
	 
		//每行四字节补齐,计算每行字节数: 
		linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4; 
		 
		//计算显示图像所需内存大小 
		pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight; 
		 
		//申请内存 
		lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage); 
		 
		//生成对lpshowbuf的二维数组索引: 
		image=new BYTE*[pbi->bmiHeader.biHeight]; 
		for(i=0;ibmiHeader.biHeight;i++) 
			image[i]=lpshowbuf+i*linewidth; 
		 
		originimage=new BYTE*[bi.biHeight]; 
		for(i=0;ibmiHeader.biHeight;i++) 
			 for(j=0;jbmiHeader.biHeight;i++) 
			 for(j=0;jbmiHeader.biWidth;j++) 
			 { 
				image[i][j*3]=originimage[i/zoomfactor][(j/zoomfactor)*3]; 
				image[i][j*3+1]=originimage[i/zoomfactor][(j/zoomfactor)*3+1]; 
				image[i][j*3+2]=originimage[i/zoomfactor][(j/zoomfactor)*3+2]; 
			 } 
		} 
		else 
		{//32位色 
			for(i=0;ibmiHeader.biHeight;i++) 
			 for(j=0;jbmiHeader.biWidth;j++) 
			 { 
				image[i][j*4]=originimage[i/zoomfactor][(j/zoomfactor)*4]; 
				image[i][j*4+1]=originimage[i/zoomfactor][(j/zoomfactor)*4+1]; 
				image[i][j*4+2]=originimage[i/zoomfactor][(j/zoomfactor)*4+2]; 
 				image[i][j*4+3]=originimage[i/zoomfactor][(j/zoomfactor)*4+3]; 
			 } 
		} 
	} 
	else 
	{//缩小 
		pbi->bmiHeader.biHeight=bi.biHeight/(-zoomfactor); 
		pbi->bmiHeader.biWidth=bi.biWidth/(-zoomfactor); 
	 
		//每行四字节补齐,计算每行字节数: 
		linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4; 
		 
		//计算显示图像所需内存大小 
		pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight; 
		 
		//申请内存 
		lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage); 
		 
		//生成对lpshowbuf的二维数组索引: 
		image=new BYTE*[pbi->bmiHeader.biHeight]; 
		for(i=0;ibmiHeader.biHeight;i++) 
			image[i]=lpshowbuf+i*linewidth; 
		 
		originimage=new BYTE*[bi.biHeight]; 
		for(i=0;ibmiHeader.biHeight;i++) 
			 for(j=0;jbmiHeader.biHeight;i++) 
			 for(j=0;jbmiHeader.biWidth;j++) 
			 { 
				image[i][j*3]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3]; 
				image[i][j*3+1]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3+1]; 
				image[i][j*3+2]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3+2]; 
			 } 
		} 
		else 
		{//32位色 
			for(i=0;ibmiHeader.biHeight;i++) 
			 for(j=0;jbmiHeader.biWidth;j++) 
			 { 
				image[i][j*4]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4]; 
				image[i][j*4+1]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+1]; 
				image[i][j*4+2]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+2]; 
				image[i][j*4+3]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+3]; 
			 } 
		} 
	} 
 
	return TRUE; 
 
 
} 
 
void CLoadDoc::OnFileOpen()  
{ 
	// TODO: Add your command handler code here 
  /*  CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,TEXT("BMP Files(*.BMP)|*.BMP||")); 
	if(FileDlg.DoModal()==IDOK) 
	{ 
		Filename=FileDlg.GetPathName(); 
		InvalidateRect(NULL,TRUE); 
		 
		UpdateWindow(); 
	}*/ 
 
	LPCTSTR lpszFilter=_T( "BMP Files(*.bmp)|*.bmp|任何文件|*.*||" ); 
	CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL); 
	CString filename; 
	CFile file; 
	BITMAPFILEHEADER bf; 
 
	//打开文件对话框 
	if(dlg1.DoModal()==IDOK) 
	{ 
	filename=dlg1.GetPathName(); 
	if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0) 
		{	 
			//读取文件失败 
//			AfxMessageBox( "Cannot open BMP"); 
			return; 
		} 
		//读取文件头 
		file.Read(&bf,sizeof(bf)); 
		//判断是否是BMP文件 
		if(bf.bfType!=0x4d42)//'BM' 
		{ 
//			AfxMessageBox("非BMP文件!",MB_OK,0); 
			return; 
		} 
	   //判断文件是否损坏 
		if(file.GetLength()!=bf.bfSize) 
		{ 
//			AfxMessageBox("文件已损坏,请检查!",MB_OK,0); 
			return; 
		} 
	 
 
		//读文件信息头 
		file.Read(&bi,sizeof(bi)); 
					 
		//计算调色板数目 
		numQuad=0; 
		if(bi.biBitCount<24) 
		{ 
			numQuad=1<=4||zoomfactor<-4) 
        zoomfactor=zoomfactor+4; 
	else if(zoomfactor=-4) 
		zoomfactor=4; 
	    PrepareShowdata(); 
	    UpdateWindow(NULL);	 
} 
 
void CLoadDoc::OnZoomin()  
{ 
	// TODO: Add your command handler code here 
	if(zoomfactor>4||zoomfactor<-4) 
	    zoomfactor=zoomfactor-4; 
	else if(zoomfactor=4) 
		zoomfactor=-4; 
	    PrepareShowdata(); 
	    UpdateWindow(NULL); 
}