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);
}