?? 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;i<pbi->bmiHeader.biHeight;i++)
image[i]=lpshowbuf+i*linewidth;
originimage=new BYTE*[bi.biHeight];
for(i=0;i<bi.biHeight;i++)
originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight;
//賦值
if(bi.biBitCount<24)
{
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<linewidth;j++)
image[i][j]=originimage[i/zoomfactor][j/zoomfactor];
}
else if(bi.biBitCount==24)
{//24位真彩色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.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;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.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;i<pbi->bmiHeader.biHeight;i++)
image[i]=lpshowbuf+i*linewidth;
originimage=new BYTE*[bi.biHeight];
for(i=0;i<bi.biHeight;i++)
originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight;
//賦值
if(bi.biBitCount<24)
{
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<linewidth;j++)
image[i][j]=originimage[i*(-zoomfactor)][j*(-zoomfactor)];
}
else if(bi.biBitCount==24)
{//24位真彩色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.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;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.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<<bi.biBitCount;
}
//為圖像信息pbi申請空間
pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));
//讀取調色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
}
//為圖像數據申請空間
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
//讀取圖像數據
file.Read(lpBuf,bi.biSizeImage);
//圖像讀取完畢,關閉文件,設置標志
file.Close();
flag=1;
zoomfactor=1;
lpshowbuf=NULL;
PrepareShowdata();
UpdateAllViews(NULL,0,NULL);
}
}
void CLoadDoc::OnZoomout()
{
// TODO: Add your command handler code here
if(zoomfactor>=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);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -