imageflatdoc.cpp
来自「VC++6开发指南的源代码第24章-第25章」· C++ 代码 · 共 185 行
CPP
185 行
// ImageFlatDoc.cpp : implementation of the CImageFlatDoc class
//
#include "stdafx.h"
#include "ImageFlat.h"
#include "ImageFlatDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImageFlatDoc
IMPLEMENT_DYNCREATE(CImageFlatDoc, CDocument)
BEGIN_MESSAGE_MAP(CImageFlatDoc, CDocument)
//{{AFX_MSG_MAP(CImageFlatDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageFlatDoc construction/destruction
CImageFlatDoc::CImageFlatDoc()
{
// TODO: add one-time construction code here
m_hDIB = NULL; //初始化变量
m_palDIB = NULL;
m_sizeDoc = CSize(1,1);
}
CImageFlatDoc::~CImageFlatDoc()
{
if (m_hDIB != NULL) //判断是否有DIB对象
{
::GlobalFree((HGLOBAL) m_hDIB);
}
if (m_palDIB != NULL) //判断调色板是否存在
{
delete m_palDIB;
}
}
BOOL CImageFlatDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CImageFlatDoc serialization
void CImageFlatDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CImageFlatDoc diagnostics
#ifdef _DEBUG
void CImageFlatDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CImageFlatDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageFlatDoc commands
void CImageFlatDoc::SetDib()
{
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
//判断图像是否过大
if (m_dib.GetWidth(lpDIB) > INT_MAX ||m_dib.GetHeight(lpDIB) > INT_MAX){
::GlobalUnlock((HGLOBAL) m_hDIB);
::GlobalFree((HGLOBAL) m_hDIB); //释放DIB对象
m_hDIB = NULL; //设置DIB为空
AfxMessageBox("初始化失败");
return;
}
//设置文档大小
m_sizeDoc = CSize((int)m_dib.GetWidth(lpDIB), (int)m_dib.GetHeight(lpDIB));
::GlobalUnlock((HGLOBAL) m_hDIB);
m_palDIB = new CPalette; //创建新调色板
if (m_palDIB == NULL) //判断是否创建成功
{
::GlobalFree((HGLOBAL) m_hDIB); //失败
m_hDIB = NULL; //设置DIB对象为空
return;
}
// 调用ConstructPalette来创建调色板
if (m_dib.ConstructPalette(m_hDIB, m_palDIB) == NULL)
{
delete m_palDIB; //删除
m_palDIB = NULL; //设置为空
return; //返回空
}
}
void CImageFlatDoc::UpdateObject(HGLOBAL hDIB)
{
if (m_hDIB != NULL) //判断DIB是否为空
{
::GlobalFree((HGLOBAL) m_hDIB); //非空,则清除
}
m_hDIB = hDIB; //替换成新的DIB对象
}
BOOL CImageFlatDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized creation code here
CFile file;
if (!file.Open(lpszPathName, CFile::modeRead |
CFile::shareDenyWrite)) //打开文件
{
return FALSE; //返回FALSE
}
DeleteContents();
m_hDIB=m_dib.LoadFile(file); //调用ReadDIBFile()读取图像
if(m_hDIB==NULL)
{
AfxMessageBox("图像格式不正确!"); //提示出错
return FALSE;
}
SetDib(); //初始化DIB
if (m_hDIB == NULL) //判断读取文件是否成功
{
AfxMessageBox("读取图像时出错"); //提示出错
return FALSE; //返回FALSE
}
SetPathName(lpszPathName); //设置文件名称
SetModifiedFlag(FALSE); //初始化脏标记为FALSE
return TRUE; //返回TRUE
}
BOOL CImageFlatDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized code here and/or call the base class
CFile file;
if(!file.Open(lpszPathName, CFile::modeCreate | //打开文件
CFile::modeReadWrite | CFile::shareExclusive))
{
return FALSE; //返回FALSE
}
BOOL bSuccess = FALSE;
bSuccess = m_dib.SaveFile(m_hDIB, file); //保存图像
file.Close(); //关闭文件
SetModifiedFlag(FALSE); //重置胀标记为FALSE
if (!bSuccess)
{
AfxMessageBox("保存BMP图像时出错"); //提示出错
}
return bSuccess;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?