www.pudn.com > LlxDip.rar > LlxDipDoc.cpp


// LlxDipDoc.cpp : implementation of the CLlxDipDoc class 
// 
 
#include "stdafx.h" 
#include "LlxDip.h" 
 
#include "LlxDipDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipDoc 
 
IMPLEMENT_DYNCREATE(CLlxDipDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CLlxDipDoc, CDocument) 
	//{{AFX_MSG_MAP(CLlxDipDoc) 
	ON_COMMAND(ID_FILE_RELOAD, OnFileReload) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipDoc construction/destruction 
 
CLlxDipDoc::CLlxDipDoc() 
{ 
	// TODO: add one-time construction code here 
	m_sizeDoc.cx = 0; 
	m_sizeDoc.cy = 0; 
 
	m_palDIB = NULL; 
	m_hDIB = NULL; 
 
} 
 
CLlxDipDoc::~CLlxDipDoc() 
{ 
	if (m_hDIB != NULL) 
	{ 
		::GlobalFree((HGLOBAL) m_hDIB); 
		m_hDIB=NULL; 
	}	 
	if (m_palDIB != NULL) 
	{ 
		delete m_palDIB; 
		m_palDIB=NULL; 
	} 
} 
 
BOOL CLlxDipDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	m_hDIB = NewDIB(0, 0,8); 
	InitDIBData(); 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipDoc serialization 
 
void CLlxDipDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipDoc diagnostics 
 
#ifdef _DEBUG 
void CLlxDipDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CLlxDipDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipDoc commands 
BOOL CLlxDipDoc::ReadImgFile(CString sName) 
{ 
	if (m_hDIB != NULL) 
	{ 
		::GlobalFree((HGLOBAL) m_hDIB); 
		::GlobalFree((HGLOBAL) m_hSrcDIB); 
		m_hDIB = NULL; 
		m_hSrcDIB = 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); 
	m_hSrcDIB = (HDIB)CopyHandle((HGLOBAL) m_hDIB); 
	nFile.Close(); 
	InitDIBData(); 
 
	if (m_hDIB == NULL) 
		return FALSE; 
	return TRUE; 
} 
 
BOOL CLlxDipDoc::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 CLlxDipDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{ 
	if (!CDocument::OnOpenDocument(lpszPathName)) 
		return FALSE; 
	 
	// TODO: Add your specialized creation code here 
	BOOL bResult = ReadImgFile(lpszPathName); 
	if(bResult) 
	{ 
		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 bResult; 
} 
 
BOOL CLlxDipDoc::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); 
} 
 
void CLlxDipDoc::OnFileReload()  
{ 
	// TODO: Add your command handler code here 
	OnOpenDocument(this->GetPathName()); 
	this->UpdateAllViews(NULL); 
}