OutputWnd.cpp 4.9 KB

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