MainFrm.cpp
上传用户:zengxf178
上传日期:2007-01-02
资源大小:22k
文件大小:7k
源码类别:

TreeView控件

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "GHCustomDraw.h"
  5. #include "MainFrm.h"
  6. #include "LeftView.h"
  7. #include "GHCustomDrawView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CMainFrame
  15. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  16. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  17. //{{AFX_MSG_MAP(CMainFrame)
  18. // NOTE - the ClassWizard will add and remove mapping macros here.
  19. //    DO NOT EDIT what you see in these blocks of generated code !
  20. ON_WM_CREATE()
  21. //}}AFX_MSG_MAP
  22. ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnUpdateViewStyles)
  23. ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnViewStyle)
  24. END_MESSAGE_MAP()
  25. static UINT indicators[] =
  26. {
  27. ID_SEPARATOR,           // status line indicator
  28. ID_INDICATOR_CAPS,
  29. ID_INDICATOR_NUM,
  30. ID_INDICATOR_SCRL,
  31. };
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CMainFrame construction/destruction
  34. CMainFrame::CMainFrame()
  35. {
  36. // TODO: add member initialization code here
  37. }
  38. CMainFrame::~CMainFrame()
  39. {
  40. }
  41. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  42. {
  43. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  44. return -1;
  45. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  46. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  47. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  48. {
  49. TRACE0("Failed to create toolbarn");
  50. return -1;      // fail to create
  51. }
  52. if (!m_wndStatusBar.Create(this) ||
  53. !m_wndStatusBar.SetIndicators(indicators,
  54.   sizeof(indicators)/sizeof(UINT)))
  55. {
  56. TRACE0("Failed to create status barn");
  57. return -1;      // fail to create
  58. }
  59. // TODO: Delete these three lines if you don't want the toolbar to
  60. //  be dockable
  61. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  62. EnableDocking(CBRS_ALIGN_ANY);
  63. DockControlBar(&m_wndToolBar);
  64. return 0;
  65. }
  66. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
  67. CCreateContext* pContext)
  68. {
  69. // create splitter window
  70. if (!m_wndSplitter.CreateStatic(this, 1, 2))
  71. return FALSE;
  72. if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(150, 100), pContext) ||
  73. !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CGHCustomDrawView), CSize(100, 100), pContext))
  74. {
  75. m_wndSplitter.DestroyWindow();
  76. return FALSE;
  77. }
  78. return TRUE;
  79. }
  80. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  81. {
  82. if( !CFrameWnd::PreCreateWindow(cs) )
  83. return FALSE;
  84. // TODO: Modify the Window class or styles here by modifying
  85. //  the CREATESTRUCT cs
  86. return TRUE;
  87. }
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CMainFrame diagnostics
  90. #ifdef _DEBUG
  91. void CMainFrame::AssertValid() const
  92. {
  93. CFrameWnd::AssertValid();
  94. }
  95. void CMainFrame::Dump(CDumpContext& dc) const
  96. {
  97. CFrameWnd::Dump(dc);
  98. }
  99. #endif //_DEBUG
  100. /////////////////////////////////////////////////////////////////////////////
  101. // CMainFrame message handlers
  102. CGHCustomDrawView* CMainFrame::GetRightPane()
  103. {
  104. CWnd* pWnd = m_wndSplitter.GetPane(0, 1);
  105. CGHCustomDrawView* pView = DYNAMIC_DOWNCAST(CGHCustomDrawView, pWnd);
  106. return pView;
  107. }
  108. void CMainFrame::OnUpdateViewStyles(CCmdUI* pCmdUI)
  109. {
  110. // TODO: customize or extend this code to handle choices on the
  111. // View menu.
  112. CGHCustomDrawView* pView = GetRightPane(); 
  113. // if the right-hand pane hasn't been created or isn't a view,
  114. // disable commands in our range
  115. if (pView == NULL)
  116. pCmdUI->Enable(FALSE);
  117. else
  118. {
  119. DWORD dwStyle = pView->GetStyle() & LVS_TYPEMASK;
  120. // if the command is ID_VIEW_LINEUP, only enable command
  121. // when we're in LVS_ICON or LVS_SMALLICON mode
  122. if (pCmdUI->m_nID == ID_VIEW_LINEUP)
  123. {
  124. if (dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON)
  125. pCmdUI->Enable();
  126. else
  127. pCmdUI->Enable(FALSE);
  128. }
  129. else
  130. {
  131. // otherwise, use dots to reflect the style of the view
  132. pCmdUI->Enable();
  133. BOOL bChecked = FALSE;
  134. switch (pCmdUI->m_nID)
  135. {
  136. case ID_VIEW_DETAILS:
  137. bChecked = (dwStyle == LVS_REPORT);
  138. break;
  139. case ID_VIEW_SMALLICON:
  140. bChecked = (dwStyle == LVS_SMALLICON);
  141. break;
  142. case ID_VIEW_LARGEICON:
  143. bChecked = (dwStyle == LVS_ICON);
  144. break;
  145. case ID_VIEW_LIST:
  146. bChecked = (dwStyle == LVS_LIST);
  147. break;
  148. default:
  149. bChecked = FALSE;
  150. break;
  151. }
  152. pCmdUI->SetRadio(bChecked ? 1 : 0);
  153. }
  154. }
  155. }
  156. void CMainFrame::OnViewStyle(UINT nCommandID)
  157. {
  158. // TODO: customize or extend this code to handle choices on the
  159. // View menu.
  160. CGHCustomDrawView* pView = GetRightPane();
  161. // if the right-hand pane has been created and is a CGHCustomDrawView,
  162. // process the menu commands...
  163. if (pView != NULL)
  164. {
  165. DWORD dwStyle = -1;
  166. switch (nCommandID)
  167. {
  168. case ID_VIEW_LINEUP:
  169. {
  170. // ask the list control to snap to grid
  171. CListCtrl& refListCtrl = pView->GetListCtrl();
  172. refListCtrl.Arrange(LVA_SNAPTOGRID);
  173. }
  174. break;
  175. // other commands change the style on the list control
  176. case ID_VIEW_DETAILS:
  177. dwStyle = LVS_REPORT;
  178. break;
  179. case ID_VIEW_SMALLICON:
  180. dwStyle = LVS_SMALLICON;
  181. break;
  182. case ID_VIEW_LARGEICON:
  183. dwStyle = LVS_ICON;
  184. break;
  185. case ID_VIEW_LIST:
  186. dwStyle = LVS_LIST;
  187. break;
  188. }
  189. // change the style; window will repaint automatically
  190. if (dwStyle != -1)
  191. pView->ModifyStyle(LVS_TYPEMASK, dwStyle);
  192. }
  193. }
  194. BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
  195. {
  196. LPNMHDR pNmhdr = (LPNMHDR)lParam;
  197. switch (pNmhdr->code)
  198. {
  199. case NM_CUSTOMDRAW:
  200. {
  201. // To make sure that the notification is coming
  202. // from the right control (GGH)
  203. CLeftView *pView = GetLeftPane();
  204. if(pView->GetTreeCtrl().m_hWnd != pNmhdr->hwndFrom)
  205. break;
  206. LPNMTVCUSTOMDRAW pCustomDraw = (LPNMTVCUSTOMDRAW)lParam;
  207. switch (pCustomDraw->nmcd.dwDrawStage)
  208. {
  209. case CDDS_PREPAINT:
  210. // Need to process this case and set pResult to CDRF_NOTIFYITEMDRAW, 
  211. // otherwise parent will never receive CDDS_ITEMPREPAINT notification. (GGH) 
  212. *pResult = CDRF_NOTIFYITEMDRAW;
  213. return true;
  214. case CDDS_ITEMPREPAINT:
  215. switch (pCustomDraw->iLevel)
  216. {
  217. // painting all 0-level items blue,
  218. // and all 1-level items red (GGH)
  219. case 0:
  220. if (pCustomDraw->nmcd.uItemState == (CDIS_FOCUS | CDIS_SELECTED)) // selected
  221. pCustomDraw->clrText = RGB(255, 255, 255);
  222. else
  223. pCustomDraw->clrText = RGB(0, 0, 255);
  224. break;
  225. case 1:
  226. if (pCustomDraw->nmcd.uItemState == (CDIS_FOCUS | CDIS_SELECTED)) // selected
  227. pCustomDraw->clrText = RGB(255, 255, 255);
  228. else
  229. pCustomDraw->clrText = RGB(255, 0, 0);
  230. break;
  231. }
  232. *pResult = CDRF_SKIPDEFAULT;
  233. return false;
  234. }
  235. }
  236. break;
  237. }
  238. return CFrameWnd::OnNotify(wParam, lParam, pResult);
  239. }
  240. CLeftView * CMainFrame::GetLeftPane()
  241. {
  242. CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
  243. CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView, pWnd);
  244. return pView;
  245. }