www.gusucode.com > VC++直方图均衡处理实例源码程序 > VC++直方图均衡处理实例源码程序/code/源代码/MyDIPDoc.cpp

    //Download by http://www.NewXing.com
// MyDIPDoc.cpp : implementation of the CMyDIPDoc class
//

#include "stdafx.h"
#include "MyDIP.h"

#include "MyDIPDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyDIPDoc

IMPLEMENT_DYNCREATE(CMyDIPDoc, CDocument)

BEGIN_MESSAGE_MAP(CMyDIPDoc, CDocument)
	//{{AFX_MSG_MAP(CMyDIPDoc)
		// 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()

/////////////////////////////////////////////////////////////////////////////
// CMyDIPDoc construction/destruction

CMyDIPDoc::CMyDIPDoc()
{
	// TODO: add one-time construction code here
	m_sizeDoc.cx = 800;
	m_sizeDoc.cy = 600;

	m_palDIB = NULL;
	m_hDIB = NULL;
}

CMyDIPDoc::~CMyDIPDoc()
{
	if (m_hDIB != NULL)
	{
		::GlobalFree((HGLOBAL) m_hDIB);
		m_hDIB=NULL;
	}	
	if (m_palDIB != NULL)
	{
		delete m_palDIB;
		m_palDIB=NULL;
	}
}

BOOL CMyDIPDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	m_hDIB = NewDIB(m_sizeDoc.cx, m_sizeDoc.cy,8);
	InitDIBData();
	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CMyDIPDoc serialization

void CMyDIPDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMyDIPDoc diagnostics

#ifdef _DEBUG
void CMyDIPDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CMyDIPDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyDIPDoc commands

BOOL CMyDIPDoc::ReadImgFile(CString sName)
{
	if (m_hDIB != NULL)
	{
		::GlobalFree((HGLOBAL) m_hDIB);
		m_hDIB=NULL;
	}	
	if (m_palDIB != NULL)
	{
		delete m_palDIB;
		m_palDIB=NULL;
	}

	// replace calls to Serialize with ReadDIBFile function
	CFile nFile;
	if(!nFile.Open(sName,CFile::modeRead))
		return false;
	m_hDIB = ReadDIBFile(nFile);
	nFile.Close();
	InitDIBData();

	if (m_hDIB == NULL)
		return FALSE;
	return TRUE;
}

BOOL CMyDIPDoc::InitDIBData()
{
	if (m_palDIB != NULL)
	{
		delete m_palDIB;
		m_palDIB = NULL;
	}
	if (m_hDIB == NULL)
	{
		return FALSE;
	}
	m_palDIB = new CPalette;
	if (m_palDIB == NULL)
	{
		// we must be really low on memory
		::GlobalFree((HGLOBAL) m_hDIB);
		m_hDIB = NULL;
		return FALSE;
	}

	if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
	{
		// DIB may not have a palette
		delete m_palDIB;
		m_palDIB = NULL;
	}

	return TRUE;
}

BOOL CMyDIPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	// TODO: Add your specialized creation code here
	BOOL b = ReadImgFile(lpszPathName);
	if(b)
	{
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
		m_sizeDoc.cx = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
		m_sizeDoc.cy = (int) ::DIBHeight(lpDIB);        // Size of DIB - y
		::GlobalUnlock((HGLOBAL) m_hDIB);
	}
	POSITION pos;
	pos = GetFirstViewPosition();
	while(pos != NULL)
	{
		CScrollView * pView = (CScrollView *)GetNextView(pos);
		if(pView != NULL)
		{
			pView->SetScrollSizes(MM_TEXT, m_sizeDoc);

		}
	}
	return b;
}

BOOL CMyDIPDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
	// TODO: Add your specialized code here and/or call the base class
	CFile nFile;
	if(m_hDIB == NULL)
		return  false;
	nFile.Open(lpszPathName,CFile::modeWrite | CFile::modeCreate);
	SaveDIB(m_hDIB, nFile);
	nFile.Close();
	return true;
	//return CDocument::OnSaveDocument(lpszPathName);
}