ChooseDirDlg.cpp
上传用户:netltd
上传日期:2013-02-12
资源大小:7234k
文件大小:7k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // ChooseDirDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "resource.h"
  5. #include "ChooseDirDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CChooseDirDlg dialog
  13. CChooseDirDlg::CChooseDirDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CChooseDirDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CChooseDirDlg)
  17. m_Path = _T("");
  18. //}}AFX_DATA_INIT
  19. }
  20. void CChooseDirDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. //{{AFX_DATA_MAP(CChooseDirDlg)
  24. DDX_Control(pDX, IDC_DIRECTORY, m_Directory);
  25. DDX_Text(pDX, IDC_PATH, m_Path);
  26. //}}AFX_DATA_MAP
  27. }
  28. BEGIN_MESSAGE_MAP(CChooseDirDlg, CDialog)
  29. //{{AFX_MSG_MAP(CChooseDirDlg)
  30. ON_NOTIFY(TVN_ITEMEXPANDING, IDC_DIRECTORY, OnItemexpandingDirectory)
  31. ON_NOTIFY(TVN_SELCHANGED, IDC_DIRECTORY, OnSelchangedDirectory)
  32. //}}AFX_MSG_MAP
  33. END_MESSAGE_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CChooseDirDlg message handlers
  36. //获得选定的路径
  37. CString CChooseDirDlg::GetDirectory(CString path)
  38. {
  39. m_Path = path;
  40. DoModal();
  41. return m_Path;
  42. }
  43. int CChooseDirDlg::DoModal() 
  44. {
  45. // TODO: Add your specialized code here and/or call the base class
  46. //加入图标
  47. m_ImageList.Create(16, 16, ILC_MASK, 2, 2);
  48. m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_MYCOMPUTER));
  49. m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLOPPY));
  50.     m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_HARDDISK));
  51.     m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_CDROM));
  52.     m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_CLSFOLD));
  53.     m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_OPENFOLD));
  54. return CDialog::DoModal();
  55. }
  56. BOOL CChooseDirDlg::OnInitDialog() 
  57. {
  58. CDialog::OnInitDialog();
  59. // TODO: Add extra initialization here
  60. HTREEITEM hLevel;
  61. //初始化目录列表框
  62. m_Directory.SetImageList(&m_ImageList, TVSIL_NORMAL);
  63. hLevelRoot = m_Directory.InsertItem("我的电脑",
  64. 0, 0, TVI_ROOT, TVI_SORT);
  65.     char strDriver[_MAX_PATH];   
  66. char temp[_MAX_PATH];
  67. int index =0 ;
  68. int IconIndex;
  69. CString DriverName;
  70. if(GetLogicalDriveStrings(MAX_PATH, strDriver)==0)
  71. return TRUE;
  72. for(;;)
  73. {
  74. strncpy(temp, strDriver+index, 2);
  75. //加入字符串结束标志
  76. temp[2] = NULL;
  77. index = index + 4;
  78. switch( GetDriveType(temp) )
  79. {
  80. case DRIVE_REMOVABLE:
  81. IconIndex = 1;
  82. break;
  83. case DRIVE_CDROM:
  84.             IconIndex = 3;
  85. break;
  86. default:
  87. IconIndex = 2;
  88. }
  89. DriverName = temp;
  90. DriverName.MakeUpper();
  91. //不显示 A 驱
  92. if(DriverName != "A:")
  93. {
  94. hLevel= m_Directory.InsertItem((LPCTSTR)DriverName, 
  95. IconIndex, IconIndex, hLevelRoot);
  96. FindDir(hLevel, DriverName);
  97. }
  98.         if(strDriver[index] == NULL)
  99. break;
  100. }
  101. m_Directory.Expand(hLevelRoot, TVE_EXPAND);
  102. ExpandPath(m_Path);
  103. SetDlgItemText(IDC_PATH, m_Path);
  104. return TRUE;  // return TRUE unless you set the focus to a control
  105.               // EXCEPTION: OCX Property Pages should return FALSE
  106. }
  107. void CChooseDirDlg::FindDir(HTREEITEM level, CString strDirect)
  108. {
  109. HANDLE hFind;
  110. WIN32_FIND_DATA fd;
  111. HTREEITEM Childlevel;
  112. CString direct;
  113. CString filename;
  114.     strDirect +=  "\*.*";
  115. //查找指定目录下的的所有文件,包括子目录
  116. if( ( hFind = FindFirstFile(strDirect  , &fd) ) == INVALID_HANDLE_VALUE )
  117. return;
  118. while(TRUE)
  119. {
  120. if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
  121. {
  122. //不显示".",".."这两个目录
  123. if(fd.cFileName[0] == '.')
  124. ;
  125. else
  126. {
  127. filename = fd.cFileName;
  128. Childlevel = m_Directory.InsertItem((LPCSTR)filename, 
  129. 4, 5, level);
  130. }
  131. }
  132.         //查找下一个文件 
  133. if(FindNextFile(hFind, &fd) == 0)
  134. {
  135. FindClose(hFind);
  136. //对level的子项排序
  137. m_Directory.SortChildren(level);
  138. break;
  139. }
  140. }
  141. }
  142. void CChooseDirDlg::OnItemexpandingDirectory(NMHDR* pNMHDR, LRESULT* pResult) 
  143. {
  144. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  145. // TODO: Add your control notification handler code here
  146. HTREEITEM hLevel;
  147. hLevel = pNMTreeView->itemNew.hItem;
  148. if( pNMTreeView->action == TVE_EXPAND)
  149. {
  150. if((hLevel = m_Directory.GetChildItem(hLevel)) == NULL)
  151. return;
  152. else
  153. if(!m_Directory.ItemHasChildren(hLevel))
  154. FindDir(hLevel, GetstrDirect(hLevel));
  155. while((hLevel = m_Directory.GetNextSiblingItem(hLevel))
  156. !=NULL)
  157. {
  158. if(!m_Directory.ItemHasChildren(hLevel))
  159. FindDir(hLevel, GetstrDirect(hLevel));
  160. }
  161. }
  162. *pResult = 0;
  163. }
  164. /*保留
  165. void CChooseDirDlg::FindAllDir(HTREEITEM level,  CString strDirect)
  166. {
  167. HTREEITEM parentlevel;
  168. HTREEITEM friendlevel;
  169. CString str;
  170. CString filename;
  171. parentlevel = level;
  172. str = strDirect;
  173. while(TRUE)
  174. {
  175.   FindDir(parentlevel, str);
  176.   if(!m_Directory.ItemHasChildren(parentlevel))
  177.   {
  178.   if(parentlevel==level)
  179.   return;
  180.   filename = m_Directory.GetItemText(parentlevel);
  181.   //have problem,use "Delete" function, such as
  182.   //CString s1 = "abcaabd", s2 = "abc";
  183.   //s1.TrimLeft((LPCTSTR)s2);
  184.   //s1={"bd"};
  185.   str.TrimRight((LPCTSTR)filename);
  186.   str.TrimRight("\");
  187.   while((friendlevel = m_Directory.GetNextSiblingItem(parentlevel))
  188.  ==NULL)
  189.   {
  190.   parentlevel = m_Directory.GetParentItem(parentlevel);
  191.   filename = m_Directory.GetItemText(parentlevel);
  192.       str.TrimRight((LPCTSTR)filename);
  193.       str.TrimRight("\");
  194.   if(parentlevel==level)
  195.  return;
  196.   }
  197.           parentlevel = friendlevel;
  198.   filename = m_Directory.GetItemText(parentlevel);
  199.   str = str + "\" + filename;
  200.   continue;
  201.   }
  202.   parentlevel = m_Directory.GetChildItem(parentlevel);
  203.   str += "\" + m_Directory.GetItemText(parentlevel);
  204. }
  205. }
  206. */
  207. CString CChooseDirDlg::GetstrDirect(HTREEITEM level)
  208. {
  209. CString str;
  210. str = m_Directory.GetItemText(level);
  211. while((level = m_Directory.GetParentItem(level)) != hLevelRoot)
  212. {
  213. str = m_Directory.GetItemText(level) + "\" + str;
  214. }
  215. return str;
  216. }
  217. void CChooseDirDlg::ExpandPath(CString path)
  218. {
  219. CString str;
  220. CString s;
  221. int index;
  222. HTREEITEM level;
  223. level = m_Directory.GetChildItem(hLevelRoot);
  224. while((index = path.Find("\")) != -1)
  225. {
  226. str = path.Left(index);
  227. path.Delete(0, index+1);
  228. if(str == m_Directory.GetItemText(level))
  229. m_Directory.Expand(level, TVE_EXPAND);
  230. else
  231. while(TRUE)
  232. {
  233. if((level =  m_Directory.GetNextSiblingItem(level))
  234. ==NULL)
  235. return;
  236. s = m_Directory.GetItemText(level);
  237. if(str.CompareNoCase((LPCTSTR)m_Directory.GetItemText(level))
  238. == 0)
  239. {
  240. m_Directory.Expand(level, TVE_EXPAND);
  241. level = m_Directory.GetChildItem(level);
  242. break;
  243. }
  244. }
  245. }
  246. }
  247. void CChooseDirDlg::OnSelchangedDirectory(NMHDR* pNMHDR, LRESULT* pResult) 
  248. {
  249. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  250. // TODO: Add your control notification handler code here
  251. //当被选择的目录改变后,改变EDIT 控件的内容
  252. HTREEITEM hLevel;
  253. CString str;
  254. hLevel = pNMTreeView->itemNew.hItem;
  255. if(hLevel == hLevelRoot)
  256. return;
  257. str = GetstrDirect(hLevel);
  258. if(str.Find("\") == -1)
  259. str += "\";
  260. m_Path = str;
  261. UpdateData(FALSE);
  262. *pResult = 0;
  263. }