DIBDOC.CPP
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:
Windows编程
开发平台:
Visual C++
- // dibdoc.cpp : implementation of the CDibDoc class
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
- #include "stdafx.h"
- #include "diblook.h"
- #include <limits.h>
- #include "dibdoc.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char BASED_CODE THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CDibDoc
- IMPLEMENT_DYNCREATE(CDibDoc, CDocument)
- BEGIN_MESSAGE_MAP(CDibDoc, CDocument)
- //{{AFX_MSG_MAP(CDibDoc)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDibDoc construction/destruction
- CDibDoc::CDibDoc()
- {
- m_hDIB = NULL;
- m_palDIB = NULL;
- m_sizeDoc = CSize(1,1); // dummy value to make CScrollView happy
- }
- CDibDoc::~CDibDoc()
- {
- if (m_hDIB != NULL)
- {
- ::GlobalFree((HGLOBAL) m_hDIB);
- }
- if (m_palDIB != NULL)
- {
- delete m_palDIB;
- }
- }
- BOOL CDibDoc::OnNewDocument()
- {
- if (!CDocument::OnNewDocument())
- return FALSE;
- return TRUE;
- }
- void CDibDoc::InitDIBData()
- {
- if (m_palDIB != NULL)
- {
- delete m_palDIB;
- m_palDIB = NULL;
- }
- if (m_hDIB == NULL)
- {
- return;
- }
- // Set up document size
- LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
- if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX)
- {
- ::GlobalUnlock((HGLOBAL) m_hDIB);
- ::GlobalFree((HGLOBAL) m_hDIB);
- m_hDIB = NULL;
- CString strMsg;
- strMsg.LoadString(IDS_DIB_TOO_BIG);
- MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
- return;
- }
- m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) ::DIBHeight(lpDIB));
- ::GlobalUnlock((HGLOBAL) m_hDIB);
- // Create copy of palette
- m_palDIB = new CPalette;
- if (m_palDIB == NULL)
- {
- // we must be really low on memory
- ::GlobalFree((HGLOBAL) m_hDIB);
- m_hDIB = NULL;
- return;
- }
- if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
- {
- // DIB may not have a palette
- delete m_palDIB;
- m_palDIB = NULL;
- return;
- }
- }
- BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
- {
- CFile file;
- CFileException fe;
- if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
- {
- ReportSaveLoadException(lpszPathName, &fe,
- FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
- return FALSE;
- }
- DeleteContents();
- BeginWaitCursor();
- // replace calls to Serialize with ReadDIBFile function
- TRY
- {
- m_hDIB = ::ReadDIBFile(file);
- }
- CATCH (CFileException, eLoad)
- {
- file.Abort(); // will not throw an exception
- EndWaitCursor();
- ReportSaveLoadException(lpszPathName, eLoad,
- FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
- m_hDIB = NULL;
- return FALSE;
- }
- END_CATCH
- InitDIBData();
- EndWaitCursor();
- if (m_hDIB == NULL)
- {
- // may not be DIB format
- CString strMsg;
- strMsg.LoadString(IDS_CANNOT_LOAD_DIB);
- MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
- return FALSE;
- }
- SetPathName(lpszPathName);
- SetModifiedFlag(FALSE); // start off with unmodified
- return TRUE;
- }
- BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName)
- {
- CFile file;
- CFileException fe;
- if (!file.Open(lpszPathName, CFile::modeCreate |
- CFile::modeReadWrite | CFile::shareExclusive, &fe))
- {
- ReportSaveLoadException(lpszPathName, &fe,
- TRUE, AFX_IDP_INVALID_FILENAME);
- return FALSE;
- }
- // replace calls to Serialize with SaveDIB function
- BOOL bSuccess = FALSE;
- TRY
- {
- BeginWaitCursor();
- bSuccess = ::SaveDIB(m_hDIB, file);
- file.Close();
- }
- CATCH (CException, eSave)
- {
- file.Abort(); // will not throw an exception
- EndWaitCursor();
- ReportSaveLoadException(lpszPathName, eSave,
- TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
- return FALSE;
- }
- END_CATCH
- EndWaitCursor();
- SetModifiedFlag(FALSE); // back to unmodified
- if (!bSuccess)
- {
- // may be other-style DIB (load supported but not save)
- // or other problem in SaveDIB
- CString strMsg;
- strMsg.LoadString(IDS_CANNOT_SAVE_DIB);
- MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
- }
- return bSuccess;
- }
- void CDibDoc::ReplaceHDIB(HDIB hDIB)
- {
- if (m_hDIB != NULL)
- {
- ::GlobalFree((HGLOBAL) m_hDIB);
- }
- m_hDIB = hDIB;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CDibDoc diagnostics
- #ifdef _DEBUG
- void CDibDoc::AssertValid() const
- {
- CDocument::AssertValid();
- }
- void CDibDoc::Dump(CDumpContext& dc) const
- {
- CDocument::Dump(dc);
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CDibDoc commands