Tree Control 控件的使用Dlg.cpp
上传用户:by888888
上传日期:2019-03-04
资源大小:1854k
文件大小:9k
源码类别:

TreeView控件

开发平台:

Visual C++

  1. // Tree Control 控件的使用Dlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Tree Control 控件的使用.h"
  5. #include "Tree Control 控件的使用Dlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CTreeControlDlg dialog
  50. CTreeControlDlg::CTreeControlDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CTreeControlDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CTreeControlDlg)
  54. // NOTE: the ClassWizard will add member initialization here
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. }
  59. void CTreeControlDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CTreeControlDlg)
  63. // NOTE: the ClassWizard will add DDX and DDV calls here
  64. //}}AFX_DATA_MAP
  65. }
  66. BEGIN_MESSAGE_MAP(CTreeControlDlg, CDialog)
  67. //{{AFX_MSG_MAP(CTreeControlDlg)
  68. ON_WM_SYSCOMMAND()
  69. ON_WM_PAINT()
  70. ON_WM_QUERYDRAGICON()
  71. ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
  72. ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, OnEndlabeleditTree1)
  73. //}}AFX_MSG_MAP
  74. END_MESSAGE_MAP()
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CTreeControlDlg message handlers
  77. BOOL CTreeControlDlg::OnInitDialog()
  78. {
  79. CDialog::OnInitDialog();
  80. // Add "About..." menu item to system menu.
  81. // IDM_ABOUTBOX must be in the system command range.
  82. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  83. ASSERT(IDM_ABOUTBOX < 0xF000);
  84. CMenu* pSysMenu = GetSystemMenu(FALSE);
  85. if (pSysMenu != NULL)
  86. {
  87. CString strAboutMenu;
  88. strAboutMenu.LoadString(IDS_ABOUTBOX);
  89. if (!strAboutMenu.IsEmpty())
  90. {
  91. pSysMenu->AppendMenu(MF_SEPARATOR);
  92. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  93. }
  94. }
  95. // Set the icon for this dialog.  The framework does this automatically
  96. //  when the application's main window is not a dialog
  97. SetIcon(m_hIcon, TRUE); // Set big icon
  98. SetIcon(m_hIcon, FALSE); // Set small icon
  99. // TODO: Add extra initialization here
  100.     ////////////////////////////////////////////////////////////////////
  101. static char *color[]={"white","blank","red","blue","yellow","cyan","purple","green"};
  102. HICON hIcon[8];
  103. int n;
  104. m_list.Create(16,16,0,8,8);
  105. hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_WHITE);
  106. hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BLANK);
  107. hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_RED);
  108. hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BLUE);
  109. hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_YELLOW);
  110. hIcon[5]=AfxGetApp()->LoadIcon(IDI_ICON_CYAN);
  111. hIcon[6]=AfxGetApp()->LoadIcon(IDI_ICON_PURPLE);
  112. hIcon[7]=AfxGetApp()->LoadIcon(IDI_ICON_GREEN);
  113. for(n=0;n<8;n++)
  114.      m_list.Add(hIcon[n]);
  115. ///////////////////////////////////////////////////////
  116. //////////////////////////////////////////////////////////////
  117.      CTreeCtrl *pTree=(CTreeCtrl *) GetDlgItem(IDC_TREE1);
  118.  pTree->SetImageList(&m_list,TVSIL_NORMAL); //设置图片列表
  119.      TV_INSERTSTRUCT tvinsert;    //创建待加入的TV_INSERTSTRUCT的结构
  120.  tvinsert.hParent=NULL;       //无父节点
  121.  tvinsert.hInsertAfter=TVI_LAST;  //插入到本层最后
  122.  tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
  123.                                          //掩码,图标、选选中图标、文字
  124.  tvinsert.item.hItem=NULL;//句柄为空
  125.  tvinsert.item.state=0;   //状态
  126.  tvinsert.item.stateMask=0;//状态为掩码
  127.  tvinsert.item.cchTextMax=6;//最大文字长度
  128.  tvinsert.item.iSelectedImage=1;//选中图标索引
  129.      tvinsert.item.cChildren=0;   //唯有子节点
  130.  tvinsert.item.lParam=0;     //自定义数据
  131.                                  //创建第一层
  132.  tvinsert.item.iImage=2;     //一般图标
  133.  tvinsert.item.pszText="father";//插入第一层的一个节点“father”
  134.  HTREEITEM hDad=pTree->InsertItem(&tvinsert);
  135.  tvinsert.item.pszText="mother";//插入第一层的第二个节点“mother”
  136.      HTREEITEM hMom=pTree->InsertItem(&tvinsert);
  137.                                  //创建第二层
  138.  tvinsert.hParent=hDad;            //父节点为"father"
  139.  tvinsert.item.iImage=3;               //一般图标
  140.  tvinsert.item.pszText="david";          // 插入第二层father的第一个节点son
  141.      pTree->InsertItem(&tvinsert);         
  142.  tvinsert.item.pszText="lili";          // 插入第二层father的第一个节点son
  143.      pTree->InsertItem(&tvinsert); 
  144.  tvinsert.item.pszText="kate";          // 插入第二层father的第一个节点son
  145.      pTree->InsertItem(&tvinsert);         
  146.  tvinsert.item.pszText="jime";          // 插入第二层father的第一个节点son
  147.      pTree->InsertItem(&tvinsert);  
  148.   
  149.  
  150.  tvinsert.hParent=hMom;                   //父节点为hMom
  151.  tvinsert.item.iImage=4;                 // 
  152.  tvinsert.item.pszText="david";          // 插入第二层mother的第一个节点son
  153.      pTree->InsertItem(&tvinsert);         
  154.  tvinsert.item.pszText="lili";          // 插入第二层mother的第一个节点son
  155.      pTree->InsertItem(&tvinsert); 
  156.  tvinsert.item.pszText="kate";          // 插入第二层mother的第一个节点son
  157.      pTree->InsertItem(&tvinsert);         
  158.  tvinsert.item.pszText="jime";          // 插入第二层mother的第一个节点son
  159.      
  160.  HTREEITEM hOther=pTree->InsertItem(&tvinsert);
  161.               //创建第三层
  162.  tvinsert.hParent=hOther;   //父节点为jime
  163.  tvinsert.item.iImage=7;
  164.  tvinsert.item.pszText="tom";          // 插入第二层hOther的第一个节点tom
  165.      pTree->InsertItem(&tvinsert);         
  166.  tvinsert.item.pszText="baidi";          // 插入第二层hOther的第一个节点baidu
  167.      pTree->InsertItem(&tvinsert);
  168.     
  169. ///////////////////////////////////////////////////////////////
  170. return TRUE;  // return TRUE  unless you set the focus to a control
  171. }
  172. void CTreeControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
  173. {
  174. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  175. {
  176. CAboutDlg dlgAbout;
  177. dlgAbout.DoModal();
  178. }
  179. else
  180. {
  181. CDialog::OnSysCommand(nID, lParam);
  182. }
  183. }
  184. // If you add a minimize button to your dialog, you will need the code below
  185. //  to draw the icon.  For MFC applications using the document/view model,
  186. //  this is automatically done for you by the framework.
  187. void CTreeControlDlg::OnPaint() 
  188. {
  189. if (IsIconic())
  190. {
  191. CPaintDC dc(this); // device context for painting
  192. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  193. // Center icon in client rectangle
  194. int cxIcon = GetSystemMetrics(SM_CXICON);
  195. int cyIcon = GetSystemMetrics(SM_CYICON);
  196. CRect rect;
  197. GetClientRect(&rect);
  198. int x = (rect.Width() - cxIcon + 1) / 2;
  199. int y = (rect.Height() - cyIcon + 1) / 2;
  200. // Draw the icon
  201. dc.DrawIcon(x, y, m_hIcon);
  202. }
  203. else
  204. {
  205. CPaintDC dc(this);
  206. CPen pen;
  207. CRect rc;
  208. GetClientRect(&rc);   //获取客户其大小
  209. for(int i=0;i<rc.Height();i++)
  210. {
  211. pen.CreatePen(PS_SOLID,50,RGB(100,200,200));   //创建画笔              通过改变RGB()函数的参数可以改变背景颜色,经过复杂的算法可以画出很复杂的背景图
  212. CPen *pOldPen=dc.SelectObject(&pen);
  213. dc.MoveTo(0,i);                  //将比尖移到起点
  214. dc.LineTo(rc.right,i);                 //画线到终点
  215. dc.SelectObject(pOldPen);
  216. pen.DeleteObject();                
  217. }
  218. }
  219. }
  220. // The system calls this to obtain the cursor to display while the user drags
  221. //  the minimized window.
  222. HCURSOR CTreeControlDlg::OnQueryDragIcon()
  223. {
  224. return (HCURSOR) m_hIcon;
  225. }
  226. void CTreeControlDlg::OnOK() 
  227. {
  228. // TODO: Add extra validation here
  229. CDialog::OnOK();
  230. }
  231. void CTreeControlDlg::OnCancel() 
  232. {
  233. // TODO: Add extra cleanup here
  234. CDialog::OnCancel();
  235. }
  236. void CTreeControlDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
  237. {
  238. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  239. // TODO: Add your control notification handler code here
  240. CTreeCtrl *pTree=(CTreeCtrl *)GetDlgItem(IDC_TREE1);
  241. HTREEITEM hSelected=pNMTreeView->itemNew.hItem;
  242. if(hSelected!=NULL)
  243. {
  244. char text[31];
  245. TV_ITEM item;
  246. item.mask=TVIF_HANDLE|TVIF_TEXT;
  247. item.hItem=hSelected;
  248. item.pszText=text;
  249. item.cchTextMax=30;
  250. VERIFY(pTree->GetItem(&item));
  251. SetDlgItemText(IDC_STATIC_TREE,text);
  252. }
  253. *pResult = 0;
  254. }
  255. void CTreeControlDlg::OnEndlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult) 
  256. {
  257. TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
  258. // TODO: Add your control notification handler code here
  259.     TV_ITEM item=pTVDispInfo->item;
  260. CString str=item.pszText;
  261. str.TrimLeft();
  262. str.TrimRight();
  263. if(str.GetLength()>0)
  264. {
  265. CTreeCtrl  *pTree=(CTreeCtrl *)GetDlgItem(IDC_TREE1);
  266. pTree->SetItemText(item.hItem,item.pszText);
  267. }
  268. *pResult = 0;
  269. }