LogCtrl.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:13k
源码类别:

界面编程

开发平台:

Visual C++

  1. // LogCtrl.cpp : implementation of the CLogCtrl class
  2. //
  3. #include "stdafx.h"
  4. #include "MthOutput.h"
  5. #include "LogCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CLogCtrl
  13. CLogCtrl::CLogCtrl()
  14. : m_dwHelperThreadID(0)
  15. , m_nLineCountMax( 400 )
  16. {
  17. }
  18. CLogCtrl::~CLogCtrl()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CLogCtrl,CRichEditCtrl)
  22. //{{AFX_MSG_MAP(CLogCtrl)
  23. ON_WM_CREATE()
  24. ON_WM_TIMER()
  25. ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
  26. ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
  27. //}}AFX_MSG_MAP
  28. ON_MESSAGE( WM_USR_WRITE_LOG_TEXT, On_WM_USR_WRITE_LOG_TEXT )
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CLogCtrl message handlers
  32. BOOL CLogCtrl::PreCreateWindow(CREATESTRUCT& cs) 
  33. {
  34. if( ! CRichEditCtrl :: PreCreateWindow(cs) )
  35. return FALSE;
  36. cs.style &= ~WS_BORDER;
  37. return TRUE;
  38. }
  39. int CLogCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  40. {
  41. if( CRichEditCtrl :: OnCreate(lpCreateStruct) == -1 )
  42. return -1;
  43. _InitRichEditProps();
  44. return 0;
  45. }
  46. void CLogCtrl::OnTimer(__EXT_MFC_UINT_PTR nIDEvent) 
  47. {
  48. if( nIDEvent == ID_TIMER_DELAYED_UPDATE )
  49. {
  50. if( _CanUpdate() )
  51. {
  52. KillTimer( ID_TIMER_DELAYED_UPDATE );
  53. Invalidate();
  54. UpdateWindow();
  55. }
  56. return;
  57. } // if( nIDEvent == ID_TIMER_DELAYED_UPDATE )
  58. CRichEditCtrl::OnTimer(nIDEvent);
  59. }
  60. void CLogCtrl::OnEditCopy() 
  61. {
  62. CHARRANGE _cr;
  63. GetSel( _cr );
  64. if( _cr.cpMin != _cr.cpMax )
  65. CRichEditCtrl::Copy();
  66. }
  67. void CLogCtrl::OnUpdateEditCopy(CCmdUI* pCmdUI) 
  68. {
  69. CHARRANGE _cr;
  70. GetSel( _cr );
  71. pCmdUI->Enable(
  72. ( _cr.cpMin != _cr.cpMax ) ? TRUE : FALSE
  73. );
  74. }
  75. LRESULT CLogCtrl::On_WM_USR_WRITE_LOG_TEXT( WPARAM wParam, LPARAM lParam )
  76. {
  77. ASSERT_VALID( this );
  78. wParam;
  79. _MthMessageDataFor_WM_USR_WRITE_LOG_TEXT & _data =
  80. _MthMessageDataFor_WM_USR_WRITE_LOG_TEXT::FromLPARAM( lParam );
  81. WriteText(
  82. _data.m_bBold,
  83. _data.m_clrText,
  84. _data.m_sText
  85. );
  86. return 0L;
  87. }
  88. void CLogCtrl::_InitRichEditProps()
  89. {
  90. PARAFORMAT _pf;
  91. _pf.cbSize = sizeof(PARAFORMAT);
  92. _pf.dwMask = PFM_TABSTOPS ;
  93. _pf.cTabCount = MAX_TAB_STOPS;
  94. for( int nTabIdx = 0 ; nTabIdx < _pf.cTabCount; nTabIdx++ )
  95. _pf.rgxTabs[nTabIdx] = (nTabIdx + 1) * 1440/5;
  96. CRichEditCtrl::SetParaFormat( _pf );
  97. CHARFORMAT _cf;
  98. memset( &_cf, 0, sizeof(CHARFORMAT) );
  99. _cf.cbSize = sizeof(_cf);
  100. _cf.dwEffects = 0; // CFE_PROTECTED; 
  101. _cf.dwMask =
  102. CFM_FACE|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT
  103. |CFM_SIZE|CFM_CHARSET|CFM_PROTECTED|CFM_COLOR;
  104. _cf.yHeight = 160;
  105. _cf.bCharSet = DEFAULT_CHARSET;
  106. #if _MFC_VER < 0x700
  107. strcpy( _cf.szFaceName, "Courier New" ); // <-- TO FIX <--
  108. #else
  109. __EXT_MFC_STRCPY( _cf.szFaceName, LF_FACESIZE, _T("Courier New") );
  110. #endif
  111. _cf.crTextColor = RGB(0,0,0);
  112. CRichEditCtrl::SetDefaultCharFormat( _cf );
  113. CRichEditCtrl::SetWordCharFormat( _cf );
  114. CRichEditCtrl::SetBackgroundColor( FALSE, RGB(255,255,255) );
  115. CRichEditCtrl::SetSel( -1, -1 );
  116. }
  117. bool CLogCtrl::_CanUpdate()
  118. {
  119. if( CExtControlBar::FindHwndNotSafeForMutualPaint(this) != NULL )
  120. return false;
  121. if( CExtPopupMenuWnd::g_bMenuWithShadows )
  122. {
  123. if( CExtPopupMenuWnd::IsMenuTracking() )
  124. {
  125. CExtPopupMenuWnd * pPopup = CExtPopupMenuSite::g_DefPopupMenuSite.GetInstance();
  126. ASSERT_VALID( pPopup );
  127. if( pPopup->_IsPopupWithShadows() )
  128. return false;
  129. }
  130. else if( CExtToolControlBar::g_bMenuTracking )
  131. return false;
  132. } // if( CExtPopupMenuWnd::g_bMenuWithShadows )
  133. CExtPopupMenuTipWnd & _ATTW = CExtPopupMenuSite::g_DefPopupMenuSite.GetTip();
  134. if( _ATTW.GetSafeHwnd() != NULL
  135. && (_ATTW.GetStyle()&WS_VISIBLE) != 0
  136. && _ATTW.m_ctrlShadow.GetSafeHwnd() == NULL
  137. && _ATTW.GetShadowSize() > 0
  138. )
  139. return false;
  140. return true;
  141. }
  142. void CLogCtrl::WriteText(
  143. bool bBold,
  144. COLORREF clrText,
  145. LPCTSTR sText
  146. )
  147. {
  148. ASSERT( this != NULL );
  149. if( m_dwHelperThreadID != ::GetCurrentThreadId() )
  150. {
  151. _MthMessageDataFor_WM_USR_WRITE_LOG_TEXT _data(
  152. bBold,
  153. clrText,
  154. sText
  155. );
  156. SendMessage(
  157. WM_USR_WRITE_LOG_TEXT,
  158. WPARAM(0),
  159. _data
  160. );
  161. return;
  162. }
  163. ASSERT_VALID( this );
  164. if( sText == NULL
  165. || _tcslen( sText ) == 0
  166. )
  167. return;
  168. bool bCanUpdate = _CanUpdate();
  169. SetRedraw( FALSE );
  170. int nFirstLine1 = CRichEditCtrl::GetFirstVisibleLine();
  171. CHARRANGE crOld1, crOld2;
  172. CRichEditCtrl::GetSel( crOld1 );
  173. CRichEditCtrl::SetSel( -1, -1 );
  174. CRichEditCtrl::GetSel( crOld2 );
  175. bool bResetSel = true;
  176. if( crOld1.cpMin == crOld2.cpMin
  177. && crOld1.cpMax == crOld2.cpMax
  178. )
  179. bResetSel = false;
  180. CRichEditCtrl::ReplaceSel( sText );
  181. CHARFORMAT _cf;
  182. _cf.cbSize = sizeof(CHARFORMAT);
  183. _cf.dwMask = CFM_COLOR|CFM_BOLD;
  184. _cf.dwEffects = bBold ? CFE_BOLD : 0;
  185. _cf.crTextColor = clrText;
  186. CRichEditCtrl::SetSel( crOld2.cpMax, -1 );
  187. CRichEditCtrl::SetSelectionCharFormat( _cf );
  188. if( bResetSel )
  189. {
  190. CRichEditCtrl::SetSel( crOld1 );
  191. int nFirstLine2 = CRichEditCtrl::GetFirstVisibleLine();
  192. if( nFirstLine1 != nFirstLine2 )
  193. LineScroll( nFirstLine1-nFirstLine2, 0) ;
  194. } // if( bResetSel )
  195. if( m_nLineCountMax > 0 )
  196. {
  197. int nLineCount = CRichEditCtrl::GetLineCount();
  198. if( nLineCount > m_nLineCountMax )
  199. {
  200. int nEndRemovePos =
  201. CRichEditCtrl::LineIndex(
  202. nLineCount > m_nLineCountMax 
  203. );
  204. CHARRANGE crRestore;
  205. GetSel( crRestore );
  206. crRestore.cpMin -= nEndRemovePos;
  207. crRestore.cpMax -= nEndRemovePos;
  208. SetSel( 0, nEndRemovePos );
  209. CRichEditCtrl::ReplaceSel( _T("") );
  210. SetSel( crRestore );
  211. }
  212. } // if( m_nLineCountMax > 0 )
  213. if( !bResetSel )
  214. CRichEditCtrl::SetSel( -1, -1 );
  215. SetRedraw( TRUE );
  216. if( bCanUpdate )
  217. Invalidate();
  218. else
  219. SetTimer(
  220. ID_TIMER_DELAYED_UPDATE,
  221. ELAPSE_TIMER_DELAYED_UPDATE,
  222. NULL
  223. );
  224. }
  225. /////////////////////////////////////////////////////////////////////////////
  226. // CDemoEventSourceWnd
  227. static struct
  228. {
  229. bool m_bBold;
  230. COLORREF m_clrText;
  231. LPCTSTR m_sLine;
  232. } arrDemoOutputLines[] =
  233. {
  234. { false, RGB(128,128,128), _T("Deleting intermediate files and output files for project 'ProfUISDLL - Win32 MBCS Debug'.n") },
  235. { false, RGB(128,128,128), _T("Deleting intermediate files and output files for project 'ProfUISDLL - Win32 MBCS Release'.n") },
  236. { true,  RGB(0,0,0), _T("--------------------Configuration: ProfUISDLL - Win32 MBCS Debug--------------------n") },
  237. { false, RGB(128,0,0), _T("Compiling resources...n") },
  238. { false, RGB(128,0,0), _T("Compiling...n") },
  239. { false, RGB(0,0,0), _T("StdAfx.cppn") },
  240. { false, RGB(0,0,128), _T("   Automatically linking with WinMM libraryn") },
  241. { false, RGB(0,0,128), _T("      (Windows Multimedia System)n") },
  242. { false, RGB(128,0,0), _T("Compiling...n") },
  243. { false, RGB(0,0,0), _T("exdlgbase.cppn") },
  244. { false, RGB(0,0,0), _T("ExtBtnOnFlat.cppn") },
  245. { false, RGB(0,0,0), _T("ExtButton.cppn") },
  246. { false, RGB(0,0,0), _T("ExtCmdManager.cppn") },
  247. { false, RGB(0,0,0), _T("ExtColorCtrl.cppn") },
  248. { false, RGB(0,0,128), _T("   Automatically linking with version.libn") },
  249. { false, RGB(0,0,128), _T("      (Version info support)n") },
  250. { false, RGB(0,0,0), _T("ExtColorDlg.cppn") },
  251. { false, RGB(0,0,0), _T("ExtComboBox.cppn") },
  252. { false, RGB(0,0,0), _T("ExtContentExpandWnd.cppn") },
  253. { false, RGB(0,0,0), _T("extcontrolbar.cppn") },
  254. { false, RGB(0,0,0), _T("ExtControlBarTabbedFeatures.cppn") },
  255. { false, RGB(0,0,0), _T("ExtDockBar.cppn") },
  256. { false, RGB(0,0,0), _T("ExtEdit.cppn") },
  257. { false, RGB(0,0,0), _T("ExtHook.cppn") },
  258. { false, RGB(0,0,0), _T("ExtMenuControlBar.cppn") },
  259. { false, RGB(0,0,0), _T("ExtMiniDockFrameWnd.cppn") },
  260. { false, RGB(0,0,0), _T("ExtMouseCaptureSink.cppn") },
  261. { false, RGB(0,0,0), _T("ExtPageContainerWnd.cppn") },
  262. { false, RGB(0,0,0), _T("ExtPaintManager.cppn") },
  263. { false, RGB(0,0,0), _T("ExtPopupMenuWnd.cppn") },
  264. { false, RGB(0,0,0), _T("ExtResizableDialog.cppn") },
  265. { false, RGB(128,0,0), _T("Generating Code...n") },
  266. { false, RGB(128,0,0), _T("Compiling...n") },
  267. { false, RGB(0,0,0), _T("ExtShortcutListWnd.cppn") },
  268. { false, RGB(0,0,0), _T("ExtTabWnd.cppn") },
  269. { false, RGB(0,0,0), _T("ExtToolBoxWnd.cppn") },
  270. { false, RGB(0,0,0), _T("ExtToolControlBar.cppn") },
  271. { false, RGB(0,0,0), _T("ProfUISDLL.cppn") },
  272. { false, RGB(128,0,0), _T("Generating Code...n") },
  273. { false, RGB(128,0,0), _T("Compiling...n") },
  274. { false, RGB(0,0,0), _T("ExtStatusControlBar.cppn") },
  275. { true,  RGB(128,128,0), _T("Linking...n") },
  276. { false, RGB(128,0,128), _T("   Creating library ../Bin_600/ProfUISmd.lib and object ../Bin_600/ProfUISmd.expn") },
  277. { false, RGB(0,0,0), _T("n") },
  278. { true,  RGB(0,128,0), _T("ProfUIS.dll - 0 error(s), 0 warning(s)n") },
  279. { false, RGB(0,0,0), _T("n") },
  280. { true,  RGB(0,0,0), _T("--------------------Configuration: ProfUISDLL - Win32 MBCS Release--------------------n") },
  281. { false, RGB(128,0,0), _T("Compiling resources...n") },
  282. { false, RGB(128,0,0), _T("Compiling...n") },
  283. { false, RGB(0,0,0), _T("StdAfx.cppn") },
  284. { false, RGB(0,0,128), _T("   Automatically linking with WinMM libraryn") },
  285. { false, RGB(0,0,128), _T("      (Windows Multimedia System)n") },
  286. { false, RGB(128,0,0), _T("Compiling...n") },
  287. { false, RGB(0,0,0), _T("exdlgbase.cppn") },
  288. { false, RGB(0,0,0), _T("ExtBtnOnFlat.cppn") },
  289. { false, RGB(0,0,0), _T("ExtButton.cppn") },
  290. { false, RGB(0,0,0), _T("ExtCmdManager.cppn") },
  291. { false, RGB(0,0,0), _T("ExtColorCtrl.cppn") },
  292. { false, RGB(0,0,128), _T("   Automatically linking with version.libn") },
  293. { false, RGB(0,0,128), _T("      (Version info support)n") },
  294. { false, RGB(0,0,0), _T("ExtColorDlg.cppn") },
  295. { false, RGB(0,0,0), _T("ExtComboBox.cppn") },
  296. { false, RGB(0,0,0), _T("ExtContentExpandWnd.cppn") },
  297. { false, RGB(0,0,0), _T("extcontrolbar.cppn") },
  298. { false, RGB(0,0,0), _T("ExtControlBarTabbedFeatures.cppn") },
  299. { false, RGB(0,0,0), _T("ExtDockBar.cppn") },
  300. { false, RGB(0,0,0), _T("ExtEdit.cppn") },
  301. { false, RGB(0,0,0), _T("ExtHook.cppn") },
  302. { false, RGB(0,0,0), _T("ExtMenuControlBar.cppn") },
  303. { false, RGB(0,0,0), _T("ExtMiniDockFrameWnd.cppn") },
  304. { false, RGB(0,0,0), _T("ExtMouseCaptureSink.cppn") },
  305. { false, RGB(0,0,0), _T("ExtPageContainerWnd.cppn") },
  306. { false, RGB(0,0,0), _T("ExtPaintManager.cppn") },
  307. { false, RGB(0,0,0), _T("ExtPopupMenuWnd.cppn") },
  308. { false, RGB(0,0,0), _T("ExtResizableDialog.cppn") },
  309. { false, RGB(128,0,0), _T("Generating Code...n") },
  310. { false, RGB(128,0,0), _T("Compiling...n") },
  311. { false, RGB(0,0,0), _T("ExtShortcutListWnd.cppn") },
  312. { false, RGB(0,0,0), _T("ExtTabWnd.cppn") },
  313. { false, RGB(0,0,0), _T("ExtToolBoxWnd.cppn") },
  314. { false, RGB(0,0,0), _T("ExtToolControlBar.cppn") },
  315. { false, RGB(0,0,0), _T("ProfUISDLL.cppn") },
  316. { false, RGB(128,0,0), _T("Generating Code...n") },
  317. { false, RGB(128,0,0), _T("Compiling...n") },
  318. { false, RGB(0,0,0), _T("ExtStatusControlBar.cppn") },
  319. { true,  RGB(128,128,0), _T("Linking...n") },
  320. { false, RGB(128,0,128), _T("   Creating library ../Bin_600/ProfUISm.lib and object ../Bin_600/ProfUISm.expn") },
  321. { false, RGB(0,0,0), _T("n") },
  322. { true,  RGB(0,128,0), _T("ProfUISm.dll - 0 error(s), 0 warning(s)n") },
  323. { false, RGB(0,0,0), _T("n") },
  324. };
  325. CDemoEventSourceWnd::CDemoEventSourceWnd()
  326. : m_nDemoOutputLineIndex( 0 )
  327. , m_pWndLogCtrl( NULL )
  328. {
  329. }
  330. CDemoEventSourceWnd::~CDemoEventSourceWnd()
  331. {
  332. }
  333. BEGIN_MESSAGE_MAP(CDemoEventSourceWnd,CWnd)
  334. //{{AFX_MSG_MAP(CDemoEventSourceWnd)
  335. ON_WM_CREATE()
  336. ON_WM_TIMER()
  337. //}}AFX_MSG_MAP
  338. END_MESSAGE_MAP()
  339. /////////////////////////////////////////////////////////////////////////////
  340. // CDemoEventSourceWnd message handlers
  341. int CDemoEventSourceWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  342. {
  343. if (CWnd::OnCreate(lpCreateStruct) == -1)
  344. return -1;
  345. SetTimer(
  346. ID_TIMER_EVENT_SOURCE,
  347. ELAPSE_TIMER_EVENT_SOURCE,
  348. NULL
  349. );
  350. return 0;
  351. }
  352. void CDemoEventSourceWnd::OnTimer(__EXT_MFC_UINT_PTR nIDEvent) 
  353. {
  354. if( nIDEvent == ID_TIMER_EVENT_SOURCE )
  355. {
  356. if( m_nDemoOutputLineIndex >=
  357. sizeof(arrDemoOutputLines)/sizeof(arrDemoOutputLines[0])
  358. )
  359. m_nDemoOutputLineIndex = 0;
  360. ASSERT( m_pWndLogCtrl != NULL );
  361. if( m_pWndLogCtrl->GetSafeHwnd() == NULL
  362. || (! ::IsWindow(m_pWndLogCtrl->GetSafeHwnd()) )
  363. )
  364. {
  365. KillTimer( ID_TIMER_EVENT_SOURCE );
  366. return;
  367. }
  368. m_pWndLogCtrl->WriteText(
  369. arrDemoOutputLines[m_nDemoOutputLineIndex].m_bBold,
  370. arrDemoOutputLines[m_nDemoOutputLineIndex].m_clrText,
  371. arrDemoOutputLines[m_nDemoOutputLineIndex].m_sLine
  372. );
  373. m_nDemoOutputLineIndex++;
  374. return;
  375. } // if( nIDEvent == ID_TIMER_EVENT_SOURCE )
  376. if( nIDEvent == ID_TIMER_DELAYED_DESTROY )
  377. {
  378. KillTimer( ID_TIMER_DELAYED_DESTROY );
  379. DestroyWindow();
  380. return;
  381. } // if( nIDEvent == ID_TIMER_DELAYED_DESTROY )
  382. CWnd::OnTimer(nIDEvent);
  383. }