MainFrm.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "Demo2_CPropertyGrid_Src.h"
  5. #include "MainFrm.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMainFrame
  13. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  14. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  15. //{{AFX_MSG_MAP(CMainFrame)
  16. ON_WM_CREATE()
  17. ON_MESSAGE(WM_USER_TREE_SELCHANGED, OnTreeSelchanged)
  18. ON_MESSAGE(PGWM_PROPERTYGRID_NOTIFY, OnPropertyGridNotify)
  19. //}}AFX_MSG_MAP
  20. END_MESSAGE_MAP()
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CMainFrame construction/destruction
  23. CMainFrame::CMainFrame()
  24. {
  25. // TODO: add member initialization code here
  26. }
  27. CMainFrame::~CMainFrame()
  28. {
  29. }
  30. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  31. {
  32. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  33. return -1;
  34. // 创建分隔视图
  35. m_wndSplitter1.CreateStatic(this, 1, 2);
  36. m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0));
  37. m_wndTree.Create(WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, CRect(0,0,1,1), &m_wndSplitter2, m_wndSplitter2.IdFromRowCol(0,0));
  38. m_wndProperty.Create(CRect(0,0,1,1), &m_wndSplitter2, m_wndSplitter2.IdFromRowCol(1,0));
  39. m_wndInfo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOHSCROLL, CRect(0,0,1,1), &m_wndSplitter1, m_wndSplitter1.IdFromRowCol(0,1));
  40. m_wndProperty.SetOwner(this); // 使属性窗口的通知消息发给主窗口
  41. m_wndProperty.ShowToolBar(TRUE);// 显示属性表的内置工具条
  42. m_wndSplitter1.SetColumnInfo(0, 175, 1);
  43. m_wndSplitter2.SetRowInfo(0, 100, 1);
  44. // 设置树窗口的图标
  45. static CImageList iml;
  46. iml.Create(16, 16, ILC_COLOR | ILC_MASK, 5, 1);
  47. iml.Add( ::LoadIcon(NULL, IDI_APPLICATION) );
  48. iml.Add( ::LoadIcon(NULL, IDI_ERROR) );
  49. iml.Add( ::LoadIcon(NULL, IDI_QUESTION ) );
  50. iml.Add( ::LoadIcon(NULL, IDI_WARNING) );
  51. iml.Add( ::LoadIcon(NULL, IDI_INFORMATION) );
  52. m_wndTree.SetImageList(&iml, TVSIL_NORMAL);
  53. // 创建树窗口的结点
  54. HTREEITEM hRoot = m_wndTree.InsertItem( _T("根结点"), 0, 0 );
  55. HTREEITEM hChild1 = m_wndTree.InsertItem( _T("子结点1"), 1, 1, hRoot );
  56. HTREEITEM hChild2 = m_wndTree.InsertItem( _T("子结点2"), 2, 2, hRoot );
  57. m_wndTree.Expand(hRoot, TVE_EXPAND);
  58. // 设置状态信息窗口
  59. static CFont font;
  60. font.CreatePointFont(105, _T("宋体"));
  61. m_wndInfo.SetFont(&font);
  62. m_wndInfo.SetMargins(3,3);
  63. m_wndInfo.ReplaceSel( _T("选中树窗口中的结点后, 可以在属性窗口修改其属性.") );
  64. return 0;
  65. }
  66. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  67. {
  68. if( !CFrameWnd::PreCreateWindow(cs) )
  69. return FALSE;
  70. // TODO: Modify the Window class or styles here by modifying
  71. // the CREATESTRUCT cs
  72. cs.cx = 600;
  73. cs.cy = 400;
  74. return TRUE;
  75. }
  76. /////////////////////////////////////////////////////////////////////////////
  77. // CMainFrame diagnostics
  78. #ifdef _DEBUG
  79. void CMainFrame::AssertValid() const
  80. {
  81. CFrameWnd::AssertValid();
  82. }
  83. void CMainFrame::Dump(CDumpContext& dc) const
  84. {
  85. CFrameWnd::Dump(dc);
  86. }
  87. #endif //_DEBUG
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CMainFrame message handlers
  90. LRESULT CMainFrame::OnTreeSelchanged(WPARAM wParam, LPARAM lParam)
  91. {
  92. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)lParam;
  93. HTREEITEM hSelected = pNMTreeView->itemNew.hItem;
  94. // 根据选中的结点生成属性项
  95. m_wndProperty.ResetContent();
  96. CPropertyGridItem* pCategory = m_wndProperty.AddCategory( _T("树结点属性") );
  97. CPropertyGridItem* pItemName = new CPropertyGridItem( _T("结点名称"), m_wndTree.GetItemText(hSelected) );
  98. pItemName->SetDescription( _T("设置结点的名称") );
  99. pItemName->SetItemData( (DWORD)hSelected );
  100. pCategory->AddChildItem(pItemName);
  101. CPropertyGridItemList* pItemIcon = new CPropertyGridItemList( _T("结点图标") );
  102. pItemIcon->SetDescription( _T("设置结点的图标") );
  103. pItemIcon->SetItemData( (DWORD)hSelected );
  104. pItemIcon->GetConstraints()->AddConstraint( _T("0 - Application") );
  105. pItemIcon->GetConstraints()->AddConstraint( _T("1 - Error") );
  106. pItemIcon->GetConstraints()->AddConstraint( _T("2 - Question") );
  107. pItemIcon->GetConstraints()->AddConstraint( _T("3 - Warning") );
  108. pItemIcon->GetConstraints()->AddConstraint( _T("4 - Information") );
  109. int nImage;
  110. m_wndTree.GetItemImage(hSelected, nImage, nImage);
  111. pItemIcon->SetListIndex(nImage);
  112. pCategory->AddChildItem(pItemIcon);
  113. pCategory->Expand();
  114. return 0;
  115. }
  116. LRESULT CMainFrame::OnPropertyGridNotify(WPARAM wParam, LPARAM lParam)
  117. {
  118. int nAction = HIWORD(wParam); // 属性表的通知事件
  119. int nID = LOWORD(wParam); // 属性表的控件ID
  120. CPropertyGridItem* pItem = (CPropertyGridItem*)lParam; // 引发事件的属性项
  121. // 只处理属性值改变的消息
  122. if (nAction == PGN_ITEMVALUE_CHANGED)
  123. {
  124. // 获取属性项对应的树结点
  125. HTREEITEM hTreeItem = (HTREEITEM)pItem->GetItemData();
  126. if (pItem->GetCaption() == _T("结点名称"))
  127. {
  128. // 设置结点的名称
  129. m_wndTree.SetItemText(hTreeItem, pItem->GetValue());
  130. }
  131. else if (pItem->GetCaption() == _T("结点图标"))
  132. {
  133. // 设置结点的图标
  134. int nImage = ((CPropertyGridItemList*)pItem)->GetListIndex();
  135. m_wndTree.SetItemImage(hTreeItem, nImage, nImage);
  136. }
  137. }
  138. return 0;
  139. }