OpenFileDlg.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // OpenFileDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include <shlobj.h>
  25. #include <dlgs.h>
  26. #include "OpenFileDlg.h"
  27. #define __DUMMY__ _T("*.*")
  28. bool COpenFileDlg::m_fAllowDirSelection = false;
  29. WNDPROC COpenFileDlg::m_wndProc = NULL;
  30. // COpenFileDlg
  31. IMPLEMENT_DYNAMIC(COpenFileDlg, CFileDialog)
  32. COpenFileDlg::COpenFileDlg(CAtlArray<CString>& mask, bool fAllowDirSelection, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
  33. DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd)
  34. : CFileDialog(TRUE, lpszDefExt, lpszFileName, dwFlags|OFN_NOVALIDATE, lpszFilter, pParentWnd, 0)
  35. , m_mask(mask)
  36. {
  37. m_fAllowDirSelection = fAllowDirSelection;
  38. m_pOFN->lpstrInitialDir = lpszFileName;
  39. m_buff = new TCHAR[10000];
  40. m_buff[0] = 0;
  41. m_pOFN->lpstrFile = m_buff;
  42. m_pOFN->nMaxFile = 10000;
  43. }
  44. COpenFileDlg::~COpenFileDlg()
  45. {
  46. delete [] m_buff;
  47. }
  48. BEGIN_MESSAGE_MAP(COpenFileDlg, CFileDialog)
  49. ON_WM_DESTROY()
  50. END_MESSAGE_MAP()
  51. // COpenFileDlg message handlers
  52. LRESULT CALLBACK COpenFileDlg::WindowProcNew(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  53. {
  54. if(message ==  WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK
  55. && m_fAllowDirSelection)
  56. {
  57. CAutoVectorPtr<TCHAR> path;
  58. path.Allocate(MAX_PATH+1); // MAX_PATH should be bigger for multiple selection, but we are only interested if it's zero length
  59. // note: allocating MAX_PATH only will cause a buffer overrun for too long strings, and will result in a silent app disappearing crash, 100% reproducable
  60. if(::GetDlgItemText(hwnd, cmb13, (TCHAR*)path, MAX_PATH) == 0)
  61. ::SendMessage(hwnd, CDM_SETCONTROLTEXT, edt1, (LPARAM)__DUMMY__);
  62. }
  63. return CallWindowProc(COpenFileDlg::m_wndProc, hwnd, message, wParam, lParam);
  64. }
  65. BOOL COpenFileDlg::OnInitDialog()
  66. {
  67. CFileDialog::OnInitDialog();
  68. m_wndProc = (WNDPROC)SetWindowLong(GetParent()->m_hWnd, GWL_WNDPROC, (LONG)WindowProcNew);
  69. return TRUE;  // return TRUE unless you set the focus to a control
  70. // EXCEPTION: OCX Property Pages should return FALSE
  71. }
  72. void COpenFileDlg::OnDestroy()
  73. {
  74. int i = GetPathName().Find(__DUMMY__);
  75. if(i >= 0) m_pOFN->lpstrFile[i] = m_pOFN->lpstrFile[i+1] = 0;
  76. CFileDialog::OnDestroy();
  77. }
  78. BOOL COpenFileDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  79. {
  80. ASSERT(pResult != NULL);
  81. OFNOTIFY* pNotify = (OFNOTIFY*)lParam;
  82. // allow message map to override
  83. if (__super::OnNotify(wParam, lParam, pResult))
  84. {
  85. ASSERT(pNotify->hdr.code != CDN_INCLUDEITEM);
  86. return TRUE;
  87. }
  88. switch(pNotify->hdr.code)
  89. {
  90. case CDN_INCLUDEITEM:
  91. if(OnIncludeItem((OFNOTIFYEX*)lParam, pResult))
  92. return TRUE;
  93. break;
  94. }
  95. return FALSE;   // not handled
  96. }
  97. BOOL COpenFileDlg::OnIncludeItem(OFNOTIFYEX* pOFNEx, LRESULT* pResult)
  98. {
  99. TCHAR buff[MAX_PATH];
  100. if(!SHGetPathFromIDList((LPCITEMIDLIST)pOFNEx->pidl, buff)) 
  101. {
  102. STRRET s;
  103. HRESULT hr = ((IShellFolder*)pOFNEx->psf)->GetDisplayNameOf((LPCITEMIDLIST)pOFNEx->pidl, SHGDN_NORMAL|SHGDN_FORPARSING, &s);
  104. if(S_OK != hr) return FALSE;
  105. switch(s.uType)
  106. {
  107. case STRRET_CSTR: _tcscpy(buff, CString(s.cStr)); break;
  108. case STRRET_WSTR: _tcscpy(buff, CString(s.pOleStr)); CoTaskMemFree(s.pOleStr); break;
  109. default: return FALSE;
  110. }
  111. }
  112. CString fn(buff);
  113. /*
  114. WIN32_FILE_ATTRIBUTE_DATA fad;
  115. if(GetFileAttributesEx(fn, GetFileExInfoStandard, &fad)
  116. && (fad.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
  117. return FALSE;
  118. */
  119. int i = fn.ReverseFind('.'), j = fn.ReverseFind('\');
  120. if(i < 0 || i < j) 
  121. return FALSE;
  122. CString mask = m_mask[pOFNEx->lpOFN->nFilterIndex-1] + _T(";");
  123. CString ext = fn.Mid(i).MakeLower() + _T(";");
  124. *pResult = mask.Find(ext) >= 0 || mask.Find(_T("*.*")) >= 0;
  125. return TRUE;
  126. }