OutputWnd.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include "stdafx.h"
  2. #include "OutputWnd.h"
  3. #include "Resource.h"
  4. #include "MainFrm.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // COutputBar
  12. COutputWnd::COutputWnd()
  13. {
  14. }
  15. COutputWnd::~COutputWnd()
  16. {
  17. }
  18. BEGIN_MESSAGE_MAP(COutputWnd, CDockablePane)
  19. ON_WM_CREATE()
  20. ON_WM_SIZE()
  21. END_MESSAGE_MAP()
  22. int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  23. {
  24. if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  25. return -1;
  26. m_Font.CreateStockObject(DEFAULT_GUI_FONT);
  27. CRect rectDummy;
  28. rectDummy.SetRectEmpty();
  29. // 创建选项卡窗口:
  30. if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1))
  31. {
  32. TRACE0("未能创建输出选项卡窗口\n");
  33. return -1; // 未能创建
  34. }
  35. // 创建输出窗格:
  36. const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
  37. if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) ||
  38. !m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3) ||
  39. !m_wndOutputFind.Create(dwStyle, rectDummy, &m_wndTabs, 4))
  40. {
  41. TRACE0("未能创建输出窗口\n");
  42. return -1; // 未能创建
  43. }
  44. m_wndOutputBuild.SetFont(&m_Font);
  45. m_wndOutputDebug.SetFont(&m_Font);
  46. m_wndOutputFind.SetFont(&m_Font);
  47. CString strTabName;
  48. BOOL bNameValid;
  49. // 将列表窗口附加到选项卡:
  50. bNameValid = strTabName.LoadString(IDS_BUILD_TAB);
  51. ASSERT(bNameValid);
  52. m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0);
  53. bNameValid = strTabName.LoadString(IDS_DEBUG_TAB);
  54. ASSERT(bNameValid);
  55. m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1);
  56. bNameValid = strTabName.LoadString(IDS_FIND_TAB);
  57. ASSERT(bNameValid);
  58. m_wndTabs.AddTab(&m_wndOutputFind, strTabName, (UINT)2);
  59. // 使用一些虚拟文本填写输出选项卡(无需复杂数据)
  60. FillBuildWindow();
  61. FillDebugWindow();
  62. FillFindWindow();
  63. return 0;
  64. }
  65. void COutputWnd::OnSize(UINT nType, int cx, int cy)
  66. {
  67. CDockablePane::OnSize(nType, cx, cy);
  68. // 选项卡控件应覆盖整个工作区:
  69. m_wndTabs.SetWindowPos (NULL, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
  70. }
  71. void COutputWnd::AdjustHorzScroll(CListBox& wndListBox)
  72. {
  73. CClientDC dc(this);
  74. CFont* pOldFont = dc.SelectObject(&m_Font);
  75. int cxExtentMax = 0;
  76. for (int i = 0; i < wndListBox.GetCount(); i ++)
  77. {
  78. CString strItem;
  79. wndListBox.GetText(i, strItem);
  80. cxExtentMax = max(cxExtentMax, dc.GetTextExtent(strItem).cx);
  81. }
  82. wndListBox.SetHorizontalExtent(cxExtentMax);
  83. dc.SelectObject(pOldFont);
  84. }
  85. void COutputWnd::FillBuildWindow()
  86. {
  87. m_wndOutputBuild.AddString(_T("生成输出正显示在此处。"));
  88. m_wndOutputBuild.AddString(_T("输出正显示在列表视图的行中"));
  89. m_wndOutputBuild.AddString(_T("但您可以根据需要更改其显示方式..."));
  90. }
  91. void COutputWnd::FillDebugWindow()
  92. {
  93. m_wndOutputDebug.AddString(_T("调试输出正显示在此处。"));
  94. m_wndOutputDebug.AddString(_T("输出正显示在列表视图的行中"));
  95. m_wndOutputDebug.AddString(_T("但您可以根据需要更改其显示方式..."));
  96. }
  97. void COutputWnd::FillFindWindow()
  98. {
  99. m_wndOutputFind.AddString(_T("查找输出正显示在此处。"));
  100. m_wndOutputFind.AddString(_T("输出正显示在列表视图的行中"));
  101. m_wndOutputFind.AddString(_T("但您可以根据需要更改其显示方式..."));
  102. }
  103. /////////////////////////////////////////////////////////////////////////////
  104. // COutputList1
  105. COutputList::COutputList()
  106. {
  107. }
  108. COutputList::~COutputList()
  109. {
  110. }
  111. BEGIN_MESSAGE_MAP(COutputList, CListBox)
  112. ON_WM_CONTEXTMENU()
  113. ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
  114. ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
  115. ON_COMMAND(ID_VIEW_OUTPUTWND, OnViewOutput)
  116. ON_WM_WINDOWPOSCHANGING()
  117. END_MESSAGE_MAP()
  118. /////////////////////////////////////////////////////////////////////////////
  119. // COutputList 消息处理程序
  120. void COutputList::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
  121. {
  122. CMenu menu;
  123. menu.LoadMenu(IDR_OUTPUT_POPUP);
  124. CMenu* pSumMenu = menu.GetSubMenu(0);
  125. if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
  126. {
  127. CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;
  128. if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE))
  129. return;
  130. ((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
  131. UpdateDialogControls(this, FALSE);
  132. }
  133. SetFocus();
  134. }
  135. void COutputList::OnEditCopy()
  136. {
  137. MessageBox(_T("复制输出"));
  138. }
  139. void COutputList::OnEditClear()
  140. {
  141. MessageBox(_T("清除输出"));
  142. }
  143. void COutputList::OnViewOutput()
  144. {
  145. CDockablePane* pParentBar = DYNAMIC_DOWNCAST(CDockablePane, GetOwner());
  146. CMDIFrameWndEx* pMainFrame = DYNAMIC_DOWNCAST(CMDIFrameWndEx, GetTopLevelFrame());
  147. if (pMainFrame != NULL && pParentBar != NULL)
  148. {
  149. pMainFrame->SetFocus();
  150. pMainFrame->ShowPane(pParentBar, FALSE, FALSE, FALSE);
  151. pMainFrame->RecalcLayout();
  152. }
  153. }