BmpTree.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:8k
源码类别:

CA认证

开发平台:

Visual C++

  1. // BmpTree.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "....minica.h"
  5. #include "BmpTree.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CBmpTree
  13. CBmpTree::CBmpTree()
  14. {
  15. m_hCursor = ::LoadCursor(NULL, IDC_HAND); // Load Windows' hand cursor
  16. }
  17. CBmpTree::~CBmpTree()
  18. {
  19. if( m_bitmap.m_hObject != NULL )
  20. m_bitmap.DeleteObject();
  21. }
  22. BEGIN_MESSAGE_MAP(CBmpTree, CTreeCtrl)
  23. //{{AFX_MSG_MAP(CBmpTree)
  24. // ON_WM_DROPFILES()
  25. // ON_WM_ERASEBKGND()
  26. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
  27. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
  28. ON_WM_SETCURSOR()
  29. // ON_WM_PAINT()
  30. // ON_WM_CTLCOLOR()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CBmpTree message handlers
  35. void CBmpTree::ExpandParent(HTREEITEM item,UINT nCode )////展开,收缩
  36. {
  37. SetRedraw(FALSE);
  38. if(item)
  39. Expand( item, nCode );
  40. else
  41. return;
  42. HTREEITEM hParentItem =  GetParentItem( item );
  43. if(hParentItem)//是否有父
  44. {
  45. Expand( hParentItem, nCode );
  46. ExpandParent(hParentItem, nCode);
  47. }
  48. else
  49. return;
  50. // EnsureVisible( GetSelectedItem());
  51. SetRedraw();
  52. }
  53. HTREEITEM CBmpTree::FindItem(HTREEITEM hItem, CString pageName)
  54. {
  55. if(NULL == hItem)
  56. return NULL;
  57. HTREEITEM hChildItem,hBrotherItem,hResult = NULL;
  58. CString strName = GetItemText(hItem);
  59. if(strName == pageName)
  60. {
  61. return hItem;
  62. }
  63. //查找子节点,没有就结束
  64. hChildItem = GetChildItem(hItem);
  65. if(hChildItem!=NULL)
  66. {
  67. //设置子节点的状态与当前节点的状态一致
  68. //再递归处理子节点的子节点和兄弟节点
  69. hResult = FindItem(hChildItem, pageName);
  70. if(hResult)
  71. return hResult;
  72. //处理子节点的兄弟节点和其子节点
  73. hBrotherItem = GetNextSiblingItem(hChildItem);
  74. while (hBrotherItem)
  75. {
  76. //设置子节点的兄弟节点状态与当前节点的状态一致
  77. //再递归处理子节点的兄弟节点的子节点和兄弟节点
  78. hResult = FindItem(hBrotherItem, pageName);
  79. if(hResult)
  80. return hResult;
  81. hBrotherItem = GetNextSiblingItem(hBrotherItem);
  82. }
  83. }
  84. return NULL;
  85. }
  86. /*void CBmpTree::OnDropFiles(HDROP hDropInfo) 
  87. {
  88. // TODO: Add your message handler code here and/or call default
  89. WORD wNumFilesDropped = DragQueryFile(hDropInfo, -1, NULL, 0);
  90.     // 
  91. POINT  pt;
  92. DragQueryPoint(hDropInfo, &pt);
  93. CString FileName;
  94.     for (WORD x = 0 ; x < wNumFilesDropped; x++)
  95. {
  96.         // 得到PathName的长度,由于第三个参数为NULL,所以调用会失败并返回所需长度
  97.         WORD wPathnameSize = DragQueryFile(hDropInfo, x, NULL, 0);
  98.         // 分配memory
  99.         char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1);
  100.         // 分配错
  101.         if (npszFile == NULL) continue;
  102.         // 再次得到文件名
  103.         DragQueryFile(hDropInfo, x, npszFile, wPathnameSize);
  104. // 如果是快捷方式则进行转换得到正确的文件名,expandedFile为最后的文件名
  105. FileName = ExpandShortcut(npszFile);
  106.         // 释放memory
  107.         LocalFree(npszFile);
  108.     }
  109.     //完成
  110.     DragFinish(hDropInfo);
  111. //得到文件扩展名 信息安全 *.* ; OCSP客户端 数证解析 *.pfx *.cer,*.der,*.pem ;  ASN1解码 ; 系统注册
  112. //展开树控件
  113. UINT uFlags = 0;
  114. HTREEITEM  hItem = HitTest(pt,&uFlags);
  115. if(hItem == NULL)
  116. return;
  117. if(uFlags & TVHT_ONITEMICON || uFlags & TVHT_ONITEMLABEL)
  118. {
  119. CString strName = GetItemText(hItem);
  120. // if(strName == "信息安全")
  121. GotoPage(strName);
  122. }
  123. CTreeCtrl::OnDropFiles(hDropInfo);
  124. }*/
  125. /*CString CBmpTree::ExpandShortcut(char * inFile)
  126. {
  127.     CString outFile = "";
  128. // Make sure we have a path
  129. ASSERT(inFile != _T(""));
  130. IShellLink * psl;
  131. HRESULT hres;
  132. // Create instance for shell link
  133. hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
  134. IID_IShellLink, (LPVOID*) &psl);
  135. if (SUCCEEDED(hres))
  136. {
  137. // Get a pointer to the persist file interface
  138. IPersistFile* ppf;
  139. hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
  140. if (SUCCEEDED(hres))
  141. {
  142. // Make sure it's ANSI
  143. WORD wsz[MAX_PATH];
  144. ::MultiByteToWideChar(CP_ACP, 0, inFile, -1, wsz, MAX_PATH);
  145. // Load shortcut
  146. hres = ppf->Load(wsz, STGM_READ);
  147. if (SUCCEEDED(hres))
  148. {
  149.                 WIN32_FIND_DATA wfd;
  150.                 // find the path from that
  151.                 HRESULT hres = psl->GetPath(outFile.GetBuffer(MAX_PATH), 
  152. MAX_PATH,
  153. &wfd, 
  154. SLGP_UNCPRIORITY);
  155.                 outFile.ReleaseBuffer();
  156. }
  157. else 
  158. outFile = inFile;
  159. ppf->Release();
  160. }
  161. psl->Release();
  162. }
  163.     // if this fails, outFile == ""
  164. return outFile;
  165. }*/
  166. BOOL CBmpTree::GotoPage(CString pageName)//转到某页
  167. {
  168. //遍历树,查找名称,展开父,选择
  169. if(pageName.IsEmpty())
  170. return FALSE;
  171. HTREEITEM hItem = FindItem(GetRootItem(),pageName);
  172. if(hItem!=NULL)
  173. {
  174. SelectItem(hItem);
  175. EnsureVisible(hItem);
  176. // ExpandParent(hItem,TVE_EXPAND);
  177. return TRUE;
  178. }
  179. else
  180. return FALSE;
  181. }
  182. BOOL CBmpTree::SetBkImage(UINT nIDResource)
  183. {
  184. if( m_bitmap.m_hObject != NULL )
  185. m_bitmap.DeleteObject();
  186. HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
  187. MAKEINTRESOURCE(nIDResource), IMAGE_BITMAP, 0, 0, 
  188. LR_CREATEDIBSECTION);
  189. if( hbmp == NULL ) 
  190. return FALSE;
  191. m_bitmap.Attach( hbmp );
  192. return TRUE;
  193. }
  194. /*BOOL CBmpTree::OnEraseBkgnd(CDC* pDC) 
  195. {
  196. // TODO: Add your message handler code here and/or call default
  197. CRect rcclient;
  198. GetClientRect(&rcclient);
  199. // create a compatible memory dc 
  200. CDC memdc;
  201. memdc.CreateCompatibleDC(pDC); 
  202. CBitmap bitmap;
  203. bitmap.CreateCompatibleBitmap(pDC, rcclient.Width(), rcclient.Height());
  204. memdc.SelectObject( &bitmap );
  205. DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
  206. CDC maskdc;
  207. maskdc.CreateCompatibleDC(pDC);
  208. CBitmap maskbitmap;
  209. maskbitmap.CreateCompatibleBitmap(pDC, rcclient.Width(), rcclient.Height());
  210. maskdc.SelectObject( &maskbitmap );
  211. CBrush brush;
  212. brush.CreatePatternBrush(&m_bitmap);
  213. maskdc.FillRect(rcclient, &brush);
  214. maskdc.BitBlt(0,0,rcclient.Width(), rcclient.Height(),&memdc,0,0,SRCAND);
  215. pDC->BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
  216. &maskdc,rcclient.left, rcclient.top,SRCCOPY);
  217. return TRUE;
  218. return CTreeCtrl::OnEraseBkgnd(pDC);
  219. }*/
  220. void CBmpTree::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) 
  221. {
  222. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  223. // TODO: Add your control notification handler code here
  224. Invalidate();
  225. SetRedraw(TRUE);
  226. *pResult = 0;
  227. }
  228. void CBmpTree::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
  229. {
  230. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  231. // TODO: Add your control notification handler code here
  232. SetRedraw(FALSE);
  233. *pResult = 0;
  234. }
  235. //void CBmpTree::OnPaint() 
  236. //{
  237.    /* CRect rcclient;
  238.    GetClientRect(&rcclient);//区域大小
  239.    
  240.  CDC dcMem;
  241.  dcMem.CreateCompatibleDC(&dc);
  242.  CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
  243.  dc.BitBlt(0,0,rcclient.Width(),rcclient.Height(),&dcMem,
  244.  rcclient.left, rcclient.top,SRCCOPY);
  245. dcMem.SelectObject(pOldBitmap);*/
  246. // CPaintDC dc(this); // device context for painting
  247. //不能注视这句话,否则界面会停止刷新
  248. /* CRect rcclient;
  249. GetClientRect(&rcclient);
  250. // create a compatible memory dc 
  251. CDC memdc;
  252. memdc.CreateCompatibleDC(&dc); 
  253. CBitmap bitmap;
  254. bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
  255. memdc.SelectObject( &bitmap );
  256. DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
  257. CDC maskdc;
  258. maskdc.CreateCompatibleDC(&dc);
  259. CBitmap maskbitmap;
  260. maskbitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
  261. maskdc.SelectObject( &maskbitmap );
  262. CBrush brush;
  263. brush.CreatePatternBrush(&m_bitmap);
  264. maskdc.FillRect(rcclient, &brush);
  265. maskdc.BitBlt(0,0,rcclient.Width(), rcclient.Height(),&memdc,0,0,SRCAND);
  266. dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
  267. &maskdc,rcclient.left, rcclient.top,SRCCOPY);*/
  268. //}
  269. /*HBRUSH CBmpTree::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  270. {
  271. HBRUSH hbr = CTreeCtrl::OnCtlColor(pDC, pWnd, nCtlColor);
  272. // TODO: Change any attributes of the DC here
  273. pDC->SetBkMode(TRANSPARENT);
  274. // TODO: Return a different brush if the default is not desired
  275. return hbr;
  276. }*/
  277. BOOL CBmpTree::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  278. {
  279. // TODO: Add your message handler code here and/or call default
  280. ::SetCursor(m_hCursor);
  281. return TRUE;
  282. // return CTreeCtrl::OnSetCursor(pWnd, nHitTest, message);
  283. }