MyEditerView.cpp
上传用户:icamtech05
上传日期:2020-11-24
资源大小:10883k
文件大小:11k
源码类别:

编辑框

开发平台:

Visual C++

  1. // MyEditerView.cpp : CMyEditerView 类的实现
  2. //
  3. #include "stdafx.h"
  4. #include "MyEditer.h"
  5. #include "MyEditerDoc.h"
  6. #include "CntrItem.h"
  7. #include "MyEditerView.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. // CMyEditerView
  14. IMPLEMENT_DYNCREATE(CMyEditerView, CRichEditView)
  15. BEGIN_MESSAGE_MAP(CMyEditerView, CRichEditView)
  16. ON_WM_DESTROY()
  17. // 标准打印命令
  18. ON_COMMAND(ID_FILE_PRINT, &CRichEditView::OnFilePrint)
  19. ON_COMMAND(ID_FILE_PRINT_DIRECT, &CRichEditView::OnFilePrint)
  20. ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CRichEditView::OnFilePrintPreview)
  21. // ON_WM_CHAR()
  22. ON_WM_CREATE()
  23. ON_CONTROL_REFLECT(EN_CHANGE, &CMyEditerView::OnEnChange)
  24. ON_NOTIFY_REFLECT(EN_PROTECTED, &CMyEditerView::OnEnProtected)
  25. END_MESSAGE_MAP()
  26. // CMyEditerView 构造/析构
  27. CMyEditerView::CMyEditerView() :ctrlEdit(NULL)
  28. {
  29. // TODO: 在此处添加构造代码
  30. AddColors();
  31. AddKeyWords();
  32. m_bInForceChange = FALSE;
  33. m_changeType = ctUndo;
  34. m_crOldSel.cpMin = m_crOldSel.cpMax = 0;
  35. }
  36. CMyEditerView::~CMyEditerView()
  37. {
  38. }
  39. BOOL CMyEditerView::PreCreateWindow(CREATESTRUCT& cs)
  40. {
  41. // TODO: 在此处通过修改
  42. //  CREATESTRUCT cs 来修改窗口类或样式
  43. return CRichEditView::PreCreateWindow(cs);
  44. }
  45. void CMyEditerView::OnInitialUpdate()
  46. {
  47. CRichEditView::OnInitialUpdate();
  48. // 设置打印边距(720 缇 = 1/2 英寸)
  49. SetMargins(CRect(720, 720, 720, 720));
  50. }
  51. // CMyEditerView 打印
  52. BOOL CMyEditerView::OnPreparePrinting(CPrintInfo* pInfo)
  53. {
  54. // 默认准备
  55. return DoPreparePrinting(pInfo);
  56. }
  57. void CMyEditerView::OnDestroy()
  58. {
  59. // 停用处于析构中的项;这在
  60. // 使用拆分器视图时非常重要 
  61.    COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);
  62.    if (pActiveItem != NULL && pActiveItem->GetActiveView() == this)
  63.    {
  64.       pActiveItem->Deactivate();
  65.       ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL);
  66.    }
  67.    CRichEditView::OnDestroy();
  68. }
  69. // CMyEditerView 诊断
  70. #ifdef _DEBUG
  71. void CMyEditerView::AssertValid() const
  72. {
  73. CRichEditView::AssertValid();
  74. }
  75. void CMyEditerView::Dump(CDumpContext& dc) const
  76. {
  77. CRichEditView::Dump(dc);
  78. }
  79. CMyEditerDoc* CMyEditerView::GetDocument() const // 非调试版本是内联的
  80. {
  81. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyEditerDoc)));
  82. return (CMyEditerDoc*)m_pDocument;
  83. }
  84. #endif //_DEBUG
  85. // CMyEditerView 消息处理程序
  86. //void CMyEditerView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
  87. //{
  88. // // TODO: Add your message handler code here and/or call default
  89. //
  90. // CRichEditView::OnChar(nChar, nRepCnt, nFlags);
  91. //}
  92. void CMyEditerView::FormatText(int iStart, int iEnd)
  93. {
  94. if ( iStart >= iEnd )
  95. return;
  96. m_bInForceChange = true;
  97. // Start changing..
  98. CHARRANGE crOldSel;
  99. GetRichEditCtrl().GetSel(crOldSel);
  100. LockWindowUpdate(); // Update not allowed.
  101. GetRichEditCtrl().HideSelection(true, false);
  102. CString strBuffer;
  103. try
  104. {
  105. GetRichEditCtrl().SetSel(iStart, iEnd);
  106. GetRichEditCtrl().GetTextRange(iStart, iEnd, strBuffer);
  107. int nStart, nPtr;
  108. nStart = nPtr = 0;
  109. while( nPtr < strBuffer.GetLength() )
  110. {
  111. Color clrCur = m_clrNormalColor;
  112. TCHAR ch = strBuffer[nPtr];
  113. // TODO: Process comments /* .. */.
  114. if( ch == '/' && strBuffer[nPtr +1] == '*' )
  115. {
  116. nStart = nPtr;
  117. ++nPtr;
  118. while( nPtr < strBuffer.GetLength() && 
  119. ( strBuffer[ nPtr ] != '/' || strBuffer[ nPtr-1 ] != '*') )
  120. ++nPtr;
  121. clrCur = m_clrCommentColor;
  122. }
  123. // TODO: Process comments //.. .
  124. else if( ch == '/' && strBuffer[nPtr + 1] == '/' )
  125. {
  126. nStart = nPtr;
  127. while( nPtr < strBuffer.GetLength() && strBuffer[ ++nPtr ] != 'r')
  128. ;
  129. clrCur = m_clrCommentColor;
  130. }
  131. // TODO: Process keywords.
  132. else if( _istalpha(ch) || ch == '_' )
  133. {
  134. nStart = nPtr;
  135. while( nPtr < strBuffer.GetLength() && ( _istalnum(strBuffer[nPtr]) || strBuffer[nPtr] == '_' ) )
  136. nPtr ++;
  137. CString strTemp = strBuffer.Mid( nStart, nPtr - nStart );
  138. int iTemp;
  139. if( m_mpKeyword.Lookup(strTemp, iTemp) )
  140. clrCur = m_clrKeywordColor;
  141. else
  142. clrCur = m_clrNormalColor;
  143. }
  144. // TODO: Process strings.
  145. else if( ch == '"' )
  146. {
  147. nStart = nPtr++;
  148. while( nPtr < strBuffer.GetLength() &&  strBuffer[nPtr] != '"' && AddIndex(strBuffer, nPtr) )
  149. ;
  150. ++nPtr;
  151. clrCur = m_clrStringColor;
  152. }
  153. // TODO: Process characters.
  154. else if( ch == ''' )
  155. {
  156. nStart = nPtr++;
  157. while( nPtr < strBuffer.GetLength() && strBuffer[nPtr] != ''' && AddIndex(strBuffer, nPtr) )
  158. ;
  159. ++nPtr;
  160. clrCur = m_clrStringColor;
  161. }
  162. // TODO: Others.
  163. else 
  164. ++ nPtr;
  165. ASSERT( nStart < strBuffer.GetLength() );
  166. SetFormat(iStart + nStart, iStart + nPtr, clrCur);
  167. nStart = nPtr;
  168. if( nPtr < strBuffer.GetLength() )
  169. ch = strBuffer[nPtr];
  170. }
  171. }
  172. catch(...)
  173. {}
  174. GetRichEditCtrl().SetSel( crOldSel );
  175. GetRichEditCtrl().HideSelection( false, false );
  176. UnlockWindowUpdate();
  177. // End changing..
  178. m_bInForceChange = false;
  179. }
  180. int CMyEditerView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  181. {
  182. if (CRichEditView::OnCreate(lpCreateStruct) == -1)
  183. return -1;
  184. // TODO:  Add your specialized creation code here
  185. Initialize();
  186. return 0;
  187. }
  188. void CMyEditerView::OnEnChange()
  189. {
  190. // TODO:  If this is a RICHEDIT control, the control will not
  191. // send this notification unless you override the CRichEditView::OnInitDialog()
  192. // function and call CRichEditCtrl().SetEventMask()
  193. // with the ENM_CHANGE flag ORed into the mask.
  194. // TODO:  Add your control notification handler code here
  195. if(m_bInForceChange)
  196. return;
  197. CHARRANGE crCurSel;
  198. GetRichEditCtrl().GetSel(crCurSel);
  199. if( m_changeType == ctMove && crCurSel.cpMin == crCurSel.cpMax )
  200. { // 如果操作是移动,并且crCurSel.cpMin == crCurSel.cpMax时, 该操作相当于粘贴操作
  201. m_changeType = ctPaste;
  202. }
  203. switch(m_changeType)
  204. {
  205. case ctReplSel:
  206. case ctPaste:
  207. FormatLine(m_crOldSel.cpMin, crCurSel.cpMax);
  208. break;
  209. case ctDelete:
  210. case ctBack:
  211. case ctCut:
  212. case ctUndo:
  213. FormatLine(crCurSel.cpMin, crCurSel.cpMax);
  214. break;
  215. case ctMove:
  216. FormatLine(crCurSel.cpMin, crCurSel.cpMax);
  217. if(crCurSel.cpMin > m_crOldSel.cpMin)
  218. FormatLine(m_crOldSel.cpMin, m_crOldSel.cpMin);
  219. else
  220. FormatLine(m_crOldSel.cpMax, m_crOldSel.cpMax);
  221. break;
  222. default:
  223. FormatText(0, GetTextLength());
  224. }
  225. m_changeType = ctUndo;
  226. }
  227. // 初始化每一种颜色值
  228. void CMyEditerView::SetColor(COLORREF clr, bool bBold, Color & sc)
  229. {
  230. sc.crClr = clr;
  231. sc.bBold = bBold;
  232. }
  233. // 初始化颜色值
  234. void CMyEditerView::AddColors(void)
  235. {
  236. SetColor(RGB(0, 128, 0), false, m_clrCommentColor);
  237. SetColor(RGB(0, 0, 255), false, m_clrKeywordColor);
  238. SetColor(RGB(0, 0, 0), false, m_clrNormalColor);
  239. SetColor(RGB(255, 0, 255), false, m_clrStringColor);
  240. SetColor(RGB(255, 0, 255), false, m_clrCharColor);
  241. SetColor(RGB(255, 0, 255), false, m_clrNumberColor);
  242. SetColor(RGB(0, 0, 0), true, m_clrConstantColor);
  243. }
  244. void CMyEditerView::OnEnProtected(NMHDR *pNMHDR, LRESULT *pResult)
  245. {
  246. ENPROTECTED *pEnProtected = reinterpret_cast<ENPROTECTED *>(pNMHDR);
  247. // TODO:  The control will not send this notification unless you override the
  248. // CRichEditView::OnInitDialog() function to send the EM_SETEVENTMASK message
  249. // to the control with the ENM_PROTECTED flag ORed into the lParam mask.
  250. // TODO:  Add your control notification handler code here
  251. // TODO: 判断消息类型,并存储在m_changeType中。
  252. ENPROTECTED * pEP = (ENPROTECTED *)pNMHDR;
  253. switch(pEP->msg)
  254. {
  255. case WM_KEYDOWN:
  256. switch(pEP->wParam)
  257. {
  258. case VK_DELETE:
  259. m_changeType = ctDelete;
  260. break;
  261. case VK_BACK:
  262. m_changeType = ctBack;
  263. break;
  264. default:
  265. m_changeType = ctUnknown;
  266. break;
  267. }
  268. break;
  269. case EM_REPLACESEL:
  270. case WM_CHAR:
  271. m_changeType = ctReplSel;
  272. break;
  273. case WM_PASTE: // 剪切 + 粘贴 = 移动
  274. m_changeType = (m_changeType == ctCut) ? ctMove : ctPaste;
  275. break;
  276. case WM_CUT:
  277. m_changeType = ctCut;
  278. break;
  279. case EM_SETCHARFORMAT: // 不处理用户设置格式
  280. break;
  281. default:
  282. m_changeType = ctUnknown;
  283. break;
  284. }
  285. if (pEP->msg != EM_SETCHARFORMAT && m_changeType != ctMove)
  286. m_crOldSel = pEP->chrg;
  287. *pResult = 0;
  288. }
  289. // 添加关键字
  290. void CMyEditerView::AddKeyWords(void)
  291. {
  292. // TODO; 为m_mpKeyword添加关键字
  293. CString strKeyword[] = 
  294. {
  295. L"auto", L"break",L"case",L"char",
  296. L"const",L"continue",L"default",L"do",
  297. L"double",L"else",L"enum",L"extern",
  298. L"float",L"for",L"goto",L"if",
  299. L"int",L"long",L"register",L"return",
  300. L"short",L"signed",L"sizeof",L"static",
  301. L"struct",L"switch",L"typedef",L"union",
  302. L"unsigned",L"void",L"volatile",L"while"
  303. };
  304. m_mpKeyword.RemoveAll();
  305. for(int i = 0; i < sizeof(strKeyword) / sizeof(CString) ; i++)
  306. m_mpKeyword.SetAt(strKeyword[i], i);
  307. }
  308. // 为当前行设置格式
  309. void CMyEditerView::FormatLine(int iStart, int iEnd)
  310. {
  311. // 设置包括iStart和iEnd之间的所有行的格式。
  312. long nStart = GetRichEditCtrl().LineIndex(GetRichEditCtrl().LineFromChar(iStart));
  313. long nEnd = GetRichEditCtrl().LineIndex(GetRichEditCtrl().LineFromChar(iEnd));
  314. nEnd += GetRichEditCtrl().LineLength(iEnd);
  315. FormatText(nStart, nEnd);
  316. }
  317. // 设置从 iStart 开始到 iEnd 结束的字符格式
  318. void CMyEditerView::SetFormat(int iStart, int iEnd, Color clr)
  319. {
  320. if(iStart >= iEnd)
  321. return;
  322. CHARRANGE crOldSel;
  323. GetRichEditCtrl().GetSel(crOldSel);
  324. GetRichEditCtrl().SetSel(iStart, iEnd);
  325. DWORD dwEffect = clr.bBold ? CFE_BOLD : 0;
  326. CHARFORMAT cf;
  327. cf.cbSize = sizeof(cf);
  328. GetRichEditCtrl().GetSelectionCharFormat(cf);
  329. if ((cf.dwMask & CFM_COLOR)  && cf.crTextColor == clr.crClr && 
  330. (cf.dwMask & CFM_BOLD) && (cf.dwEffects & CFE_BOLD) == dwEffect)
  331. return;
  332. cf.dwEffects = dwEffect;
  333. cf.crTextColor = clr.crClr;
  334. cf.dwMask = CFM_BOLD | CFM_COLOR;
  335. GetRichEditCtrl().SetSelectionCharFormat(cf);
  336. GetRichEditCtrl().SetSel(crOldSel);
  337. }
  338. // 初始化程序,将文件设为保护模式
  339. void CMyEditerView::Initialize(void)
  340. {
  341. PARAFORMAT2 pf;
  342. pf.cbSize = sizeof(PARAFORMAT2);
  343. pf.dwMask = PFM_TABSTOPS ;
  344. pf.cTabCount = MAX_TAB_STOPS;
  345. for( int itab = 0 ; itab < pf.cTabCount  ; itab++ )
  346. pf.rgxTabs[itab] = (itab + 1) * 1440/5 ;
  347. SetParaFormat( pf );
  348. CHARFORMAT cfDefault;
  349. cfDefault.cbSize = sizeof(cfDefault);
  350. cfDefault.dwEffects = CFE_PROTECTED; 
  351. cfDefault.dwMask = CFM_BOLD | CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_PROTECTED;
  352. cfDefault.yHeight = 200;
  353. cfDefault.bCharSet = 0xEE; 
  354. GetRichEditCtrl().SetDefaultCharFormat(cfDefault);
  355. GetRichEditCtrl().SetEventMask(ENM_CHANGE | ENM_SELCHANGE | ENM_PROTECTED);
  356. }
  357. // 向后移动指针
  358. bool CMyEditerView::AddIndex(CString & strBuffer, int & Index)
  359. {
  360. if(strBuffer[Index] == 'r')
  361. return false;
  362. if(strBuffer[Index] == '\')
  363. {
  364. if(strBuffer[Index+1] == 'r' || strBuffer[Index+1] == 'b' || 
  365. strBuffer[Index+1] == 'n' || strBuffer[Index+1] == '\' || 
  366. strBuffer[Index+1] == 'v' || strBuffer[Index+1] == ''' || 
  367. strBuffer[Index+1] == 't' || strBuffer[Index+1] == 'a' || 
  368. strBuffer[Index+1] == 'f' || strBuffer[Index+1] == '"')
  369. {
  370. Index += 2;
  371. return true;
  372. }
  373. }
  374. Index ++;
  375. return true;
  376. }