OutputWnd.cpp 5.4 KB

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