|
|
// ImageDoc.cpp : implementation of the CImageDoc class
//
#include "stdafx.h"
#include "shimgvwr.h"
#include "ImageDoc.h"
#include "imageview.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
extern CPreviewApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CImageDoc
IMPLEMENT_DYNCREATE(CImageDoc, CDocument)
BEGIN_MESSAGE_MAP(CImageDoc, CDocument) //{{AFX_MSG_MAP(CImageDoc)
ON_COMMAND(ID_FILE_SCAN, OnFileScan) ON_COMMAND(ID_FILE_PROPERTIES, OnFileProperties) ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail) ON_COMMAND(ID_FILE_PAPER_TILE, OnFilePaperTile) ON_COMMAND(ID_FILE_PAPER_CENTER, OnFilePaperCenter) ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) ON_UPDATE_COMMAND_UI(ID_FILE_SCAN, OnUpdateFileScan) // these items are enabled if the current file is not a temp file
ON_UPDATE_COMMAND_UI(ID_FILE_PROPERTIES, OnUpdateFileMenu) ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileMenu) ON_UPDATE_COMMAND_UI(ID_FILE_PAPER_TILE, OnUpdateFileMenu) ON_UPDATE_COMMAND_UI(ID_FILE_PAPER_CENTER, OnUpdateFileMenu) // 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()
/////////////////////////////////////////////////////////////////////////////
// CImageDoc construction/destruction
CImageDoc::CImageDoc() { m_bUseTempPath = false;
}
CImageDoc::~CImageDoc() { DelTempFile (); }
BOOL CImageDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; DelTempFile ();
return TRUE; } void MySplitPath (const TCHAR *szPath, TCHAR *szDrive, TCHAR *szDir, TCHAR *szName, TCHAR *szExt) { // Found this in tchar.h
_tsplitpath (szPath, szDrive, szDir, szName, szExt); }
// Remove the name part of a file path. Return just the drive and directory, and name.
//
CString StripExtension(const TCHAR* szFilePath) { TCHAR szPath [_MAX_DRIVE + _MAX_DIR + _MAX_FNAME]; TCHAR szDir [_MAX_DIR]; TCHAR szName [_MAX_FNAME]; MySplitPath(szFilePath, szPath, szDir, szName, NULL); lstrcat(szPath, szDir); lstrcat(szPath, szName); return CString(szPath); }
void CImageDoc::OnFileSaveAs () { CString sNewName = StripExtension(GetPathName()); if (theApp.DoPromptFileName (sNewName, AFX_IDS_SAVEFILE, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE)) { if (!OnSaveDocument (sNewName)) { // be sure to delete the file
TRY { CFile::Remove( sNewName ); } CATCH_ALL(e) { TRACE0( "Warning: failed to delete file after failed SaveAs\n" ); } END_CATCH_ALL } } }
BOOL CImageDoc::OnSaveDocument(LPCTSTR szPathName) { // the view deals with the preview control, so ask it to do the save
BOOL bRet = FALSE; POSITION pos = GetFirstViewPosition(); CImageView *pView = dynamic_cast<CImageView*>(GetNextView(pos)); if (pView) { HRESULT hr = pView->SaveImageAs(szPathName); if (SUCCEEDED(hr)) { SetModifiedFlag (FALSE); SetPathName(szPathName); UpdateAllViews(NULL); bRet = TRUE; } else { LPTSTR szMsg = NULL; FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, hr, 0, reinterpret_cast<LPTSTR>(&szMsg), 1, NULL); if (szMsg) { AfxMessageBox (szMsg, MB_ICONHAND|MB_OK); }
} } return bRet; }
/////////////////////////////////////////////////////////////////////////////
// CImageDoc serialization
void CImageDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here
} else { // TODO: add loading code here
} }
/////////////////////////////////////////////////////////////////////////////
// CImageDoc diagnostics
#ifdef _DEBUG
void CImageDoc::AssertValid() const { CDocument::AssertValid(); }
void CImageDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageDoc commands
BOOL CImageDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; DelTempFile ();
return TRUE; }
const CString& CImageDoc::GetImagePathName() const { if (m_bUseTempPath) { return m_strTempPath; } else { return GetPathName(); } }
void CImageDoc::SetTempFileName(const CString &strTempFile) { m_strTempPath = strTempFile; m_bUseTempPath = true; CString strUntitled; strUntitled.LoadString(AFX_IDS_UNTITLED); SetPathName (strUntitled, FALSE); }
void CImageDoc::DelTempFile() { if (m_bUseTempPath) { m_bUseTempPath = false; CFile::Remove(m_strTempPath); } }
void CImageDoc::OnFileScan() { // First, make a new document
OnNewDocument(); GetDevMgr(); // Now do a scan to a temp file
CString strTempPath; LPTSTR szPath; GUID guidFmt = WiaImgFmt_JPEG; GetTempPath (MAX_PATH, szPath = strTempPath.GetBufferSetLength(MAX_PATH)); GetTempFileName (szPath, TEXT("img"),0,szPath); strTempPath.ReleaseBuffer(); POSITION pos = GetFirstViewPosition(); if (S_OK == m_pDevMgr->GetImageDlg(GetNextView(pos)->GetSafeHwnd(), StiDeviceTypeDefault, WIA_DEVICE_DIALOG_SINGLE_IMAGE, WIA_INTENT_NONE, NULL, CComBSTR(strTempPath), &guidFmt))
{ SetTempFileName(strTempPath); SetModifiedFlag(TRUE); UpdateAllViews(NULL); }
}
void CImageDoc::OnUpdateFileScan(CCmdUI* pCmdUI) { pCmdUI->Enable(bWIADeviceInstalled());
}
bool CImageDoc::bWIADeviceInstalled() { bool bRet = false; GetDevMgr(); if (m_pDevMgr.p) { CComPtr<IEnumWIA_DEV_INFO> pEnum; if (SUCCEEDED(m_pDevMgr->EnumDeviceInfo (0, &pEnum))) { ULONG ul = 0; if (SUCCEEDED(pEnum->GetCount(&ul))) { bRet = ul ? true : false; } } } return bRet; }
void CImageDoc::OnFileProperties () { SHELLEXECUTEINFO sei; CString strPath = GetImagePathName(); ZeroMemory (&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_INVOKEIDLIST; POSITION pos = GetFirstViewPosition(); sei.hwnd = GetNextView(pos)->GetSafeHwnd(); sei.lpVerb = TEXT("properties"); sei.lpFile = strPath; sei.nShow = SW_SHOW; ShellExecuteEx (&sei); }
void CImageDoc::OnFilePaperCenter () { SetWallpaper (false); }
void CImageDoc::OnFilePaperTile () { SetWallpaper (true); }
void CImageDoc::SetWallpaper(bool bTile) { // need to modify the registry directly in addition to the SPI
DWORD dwDisp; HKEY hKey = 0;
if (RegCreateKeyEx( HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), REG_OPTION_RESERVED, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisp ) == ERROR_SUCCESS) { RegSetValueEx( hKey, TEXT("TileWallpaper"), 0, REG_SZ, reinterpret_cast<BYTE *>(bTile? TEXT("1"): TEXT("0")), 2*sizeof(TCHAR) ); RegCloseKey( hKey ); } CString strPath = GetImagePathName(); SystemParametersInfo( SPI_SETDESKWALLPAPER, bTile? 1: 0, (LPVOID)(strPath.GetBuffer( strPath.GetLength() )), SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE ); strPath.ReleaseBuffer(); }
void CImageDoc::OnUpdateFileMenu (CCmdUI* pCmdUI) { BOOL bEnable = GetPathName().GetLength(); switch (pCmdUI->m_nID) { case ID_FILE_SEND_MAIL: OnUpdateFileSendMail(pCmdUI); return; default: bEnable = bEnable && !m_bUseTempPath; break; } pCmdUI->Enable(bEnable); }
void CImageDoc::GetDevMgr () { if (!m_pDevMgr) // Create our WIA device manager pointer
CoCreateInstance (CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, reinterpret_cast<LPVOID*>(&m_pDevMgr));
}
|