www.pudn.com > c02 vc6.rar > KSFileDialog.cpp


// MyFileDialog.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "KSFileDialog.h" 
#ifdef AFX_AUX_SEG 
#pragma code_seg(AFX_AUX_SEG) 
#endif 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
#include    
#include    
#include     // common dialog APIs 
#include  
//#include  
 
///////////////////////////////////////////////////////////////////////////// 
// CKSFileDialog 
#define _countof(array) (sizeof(array)/sizeof(array[0])) 
 
IMPLEMENT_DYNAMIC(CKSFileDialog, CFileDialog) 
 
CKSFileDialog::CKSFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, 
		DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) : 
		CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd) 
{ 
	 
    m_ofn.Flags             = NULL; 
	m_ofn.Flags				= dwFlags;//|OFN_ENABLEHOOK; 
	m_pMyParent=pParentWnd; 
	m_pApp=NULL; 
	m_pDoc=NULL; 
	m_StrFilter.Empty(); 
 
 
} 
 
 
BEGIN_MESSAGE_MAP(CKSFileDialog, CFileDialog) 
	//{{AFX_MSG_MAP(CKSFileDialog) 
		// NOTE - the ClassWizard will add and remove mapping macros here. 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
int CKSFileDialog::DoModal() 
{ 
	ASSERT_VALID(this); 
	ASSERT_VALID(m_pMyParent);  //must set the parent window 
	DWORD nOffset = lstrlen(m_ofn.lpstrFile)+1; 
	memset(m_ofn.lpstrFile+nOffset, 0, (m_ofn.nMaxFile-nOffset)*sizeof(TCHAR)); 
 
	HWND hWndFocus = ::GetFocus(); 
	BOOL bEnableParent = FALSE; 
	//m_ofn.hwndOwner = PreModal(); 
	CWnd dummy; 
	 
		 
		dummy.CreateEx(WS_EX_TRANSPARENT,AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),NULL,NULL,CRect(0,0,0,0),(AfxGetMainWnd()),NULL); 
		 
		CRect rect; 
		KSCenterWindow(dummy.GetSafeHwnd()); 
		dummy.GetWindowRect(rect); 
		dummy.SetWindowPos(&wndTop, rect.left-230, rect.top-180, -1, -1, 
			SWP_NOSIZE | /*SWP_NOZORDER |*/ SWP_NOACTIVATE);	 
		dummy.ShowWindow(SW_HIDE); 
		m_ofn.hwndOwner=dummy.GetSafeHwnd(); 
	 
	if (m_ofn.hwndOwner==NULL||m_pMyParent==NULL) m_ofn.hwndOwner=PreModal(); 
	if (m_ofn.hwndOwner != NULL && ::IsWindowEnabled(m_pMyParent->GetSafeHwnd())) 
	{ 
		bEnableParent = TRUE; 
		//::EnableWindow(m_ofn.hwndOwner, FALSE); 
		::EnableWindow(m_pMyParent->GetSafeHwnd(), FALSE); 
	} 
 
	_AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); 
	ASSERT(pThreadState->m_pAlternateWndInit == NULL); 
 
	m_ofn.lpfnHook = NULL; 
	m_ofn.lpTemplateName = NULL; 
	int nResult; 
	if (m_bOpenFileDialog) 
		nResult = ::GetOpenFileName(&m_ofn); 
	else 
		nResult = ::GetSaveFileName(&m_ofn); 
	m_ofn.hwndOwner=AfxGetMainWnd()->GetSafeHwnd(); 
	if (nResult) 
		ASSERT(pThreadState->m_pAlternateWndInit == NULL); 
	pThreadState->m_pAlternateWndInit = NULL; 
 
	// WINBUG: Second part of special case for file open/save dialog. 
	if (bEnableParent) 
		::EnableWindow(m_pMyParent->GetSafeHwnd(), TRUE); 
	if (::IsWindow(hWndFocus)) 
		::SetFocus(hWndFocus); 
 
	PostModal(); 
	return nResult ? nResult : IDCANCEL; 
} 
 
 
BOOL CKSFileDialog::DoPromptFileName(CString& fileName, UINT nIDSTitle, DWORD lFlags, 
	BOOL bOpenFileDialog, CDocTemplate* pTemplate) 
{ 
	CString title; 
	VERIFY(title.LoadString(nIDSTitle)); 
	if (m_pApp==NULL) {ASSERT (FALSE);} //set the m_pApp app point before you call this function 
	ASSERT(m_pApp->m_pDocManager != NULL); 
	m_ofn.Flags |= lFlags; 
 
	CString strFilter; 
	CString strDefault; 
	 
	if (nIDSTitle==AFX_IDS_SAVEFILE || nIDSTitle==AFX_IDS_SAVEFILECOPY) 
	{ 
		POSITION pos = m_pApp->GetFirstDocTemplatePosition(); 
		BOOL bFirst = TRUE; 
		while (pos != NULL) 
		{ 
			CDocTemplate* pTemplate = (CDocTemplate*)m_pApp->GetNextDocTemplate(pos); 
			AppendFilterSuffix(strFilter, m_ofn, pTemplate, 
				bFirst ? &strDefault : NULL); 
			bFirst = FALSE; 
		} 
	} 
	else 
	{ 
		if (m_StrFilter.GetLength()==0) 
			strFilter = "Edit Files (*.edt)|*.edt"; 
		else 
			strFilter = m_StrFilter; 
	} 
	m_ofn.nMaxCustFilter++; 
 
	 
	LPTSTR pch = strFilter.GetBuffer(0); // modify the buffer in place 
		// MFC delimits with '|' not '\0' 
	while ((pch = _tcschr(pch, '|')) != NULL) 
			*pch++ = '\0'; 
	m_ofn.lpstrFilter = strFilter; 
	m_ofn.lpstrTitle = title; 
	m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH); 
	m_ofn.hwndOwner=m_pApp->m_pMainWnd->GetSafeHwnd() ; 
	m_ofn.Flags&=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;//|OFN_ENABLEHOOK; 
	int nResult = DoModal(); 
	fileName.ReleaseBuffer(); 
	return nResult == IDOK; 
} 
 
void CKSFileDialog::AppendFilterSuffix(CString& filter, OPENFILENAME& ofn, 
	CDocTemplate* pTemplate, CString* pstrDefaultExt) 
{ 
	ASSERT_VALID(pTemplate); 
	ASSERT_KINDOF(CDocTemplate, pTemplate); 
	 
	CString strFilterExt, strFilterName; 
	if (pTemplate->GetDocString(strFilterExt, CDocTemplate::filterExt) && 
	 !strFilterExt.IsEmpty() && 
	 pTemplate->GetDocString(strFilterName, CDocTemplate::filterName) && 
	 !strFilterName.IsEmpty()) 
	{ 
		// a file based document template - add to filter list 
		ASSERT(strFilterExt[0] == '.'); 
		if (pstrDefaultExt != NULL) 
		{ 
			// set the default extension 
			*pstrDefaultExt = ((LPCTSTR)strFilterExt) + 1;  // skip the '.' 
			ofn.lpstrDefExt = (LPTSTR)(LPCTSTR)(*pstrDefaultExt); 
			ofn.nFilterIndex = ofn.nMaxCustFilter + 1;  // 1 based number 
		} 
 
		// add to filter 
		filter += strFilterName; 
		ASSERT(!filter.IsEmpty());  // must have a file type name 
		filter += (TCHAR)'\0';  // next string please 
		filter += (TCHAR)'*'; 
		filter += strFilterExt; 
		filter += (TCHAR)'\0';  // next string please 
		ofn.nMaxCustFilter++; 
	} 
} 
 
void CKSFileDialog::SetAppPointer(CWinApp *pApp) 
{ 
	m_pApp=pApp; 
} 
 
BOOL CKSFileDialog::DoSave(LPCTSTR lpszPathName, BOOL bReplace) 
{ 
	if (m_pDoc==NULL){ASSERT (FALSE);return FALSE;} 
	CString newName = lpszPathName; 
	if (newName.IsEmpty()) 
	{ 
		CDocTemplate* pTemplate = m_pDoc->GetDocTemplate(); 
		ASSERT(pTemplate != NULL); 
 
		newName = m_pDoc->GetPathName(); 
		if (bReplace && newName.IsEmpty()) 
		{ 
			newName = m_pDoc->GetTitle(); 
			// check for dubious filename 
			int iBad = newName.FindOneOf(_T(" #%;/\\")); 
			if (iBad != -1) 
				newName.ReleaseBuffer(iBad); 
 
			// append the default suffix if there is one 
			CString strExt; 
			if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) && 
			  !strExt.IsEmpty()) 
			{ 
				ASSERT(strExt[0] == '.'); 
				newName += strExt; 
			} 
		} 
 
		if (!(DoPromptFileName(newName,bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY, 
		  OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, FALSE, pTemplate))) 
			return FALSE;       // don't even attempt to save 
	} 
 
	CWaitCursor wait; 
 
	if (!m_pDoc->OnSaveDocument(newName)) 
	{ 
		if (lpszPathName == NULL) 
		{ 
			// be sure to delete the file 
			TRY 
			{ 
				CFile::Remove(newName); 
			} 
			CATCH_ALL(e) 
			{ 
				TRACE0("Warning: failed to delete file after failed SaveAs.\n"); 
				do { e->Delete(); } while (0); 
			} 
			END_CATCH_ALL 
		} 
		return FALSE; 
	} 
 
	// reset the title and change the document name 
	if (bReplace) 
		m_pDoc->SetPathName(newName); 
 
	return TRUE;        // success 
} 
 
void CKSFileDialog::SetDocumentPointer(CDocument *pDoc) 
{ 
	m_pDoc=pDoc; 
} 
 
void CKSFileDialog::SetStringFilter(LPCSTR filter) 
{ 
	m_StrFilter=filter; 
} 
 
void CKSFileDialog::SetMyParent(CWnd *pwnd) 
{ 
	m_pMyParent=pwnd; 
} 
 
void CKSFileDialog::KSCenterWindow(HWND hWnd) 
{	 
	RECT rcWnd; 
	::GetWindowRect(hWnd,&rcWnd); 
	rcWnd.left=((GetSystemMetrics(SM_CXSCREEN)-(rcWnd.right-rcWnd.left))/2); 
	rcWnd.top=((GetSystemMetrics(SM_CYSCREEN)-(rcWnd.bottom-rcWnd.top))/2); 
	::SetWindowPos(hWnd,NULL,rcWnd.left,rcWnd.top,0,0,SWP_NOSIZE|SWP_NOZORDER| 
		SWP_NOACTIVATE); 
}