EditView.cpp
上传用户:shilei2004
上传日期:2020-07-18
资源大小:83k
文件大小:12k
源码类别:

RichEdit

开发平台:

Visual C++

  1. // EditView.cpp : implementation of the CMyEditView class
  2. // Download by http://www.codefans.net
  3. #include "stdafx.h"
  4. #include "Edit.h"
  5. #include "FormatBar.h"
  6. #include "EditDoc.h"
  7. #include "CntrItem.h"
  8. #include "EditView.h"
  9. #include "ParagraphDialog.h"
  10. #include "DateDialog.h"
  11. #include <io.h>
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. class RichEditLoader
  18. {
  19. public:
  20. RichEditLoader() : hInst(0)
  21. {
  22. }
  23. ~RichEditLoader() 
  24. {
  25. if (hInst)
  26. FreeLibrary(hInst);
  27. }
  28. HINSTANCE Load()
  29. {
  30. return LoadLibraryA("RICHED20.DLL");
  31. HINSTANCE hInst;
  32. }
  33. Loader;
  34. BOOL CMyEditView::ExtAfxInitRichEdit(BOOL bUnicode)
  35. {
  36. if (!Loader.Load())
  37. {
  38. AfxMessageBox(IDS_MFRM2);
  39. AfxInitRichEdit();
  40. }  
  41. if (bUnicode)
  42. m_strClass = "RichEdit20W";
  43. else
  44. m_strClass = "RichEdit20A";
  45. return TRUE;
  46. }
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CMyEditView
  49. IMPLEMENT_DYNCREATE(CMyEditView, CRichEditView)
  50. BEGIN_MESSAGE_MAP(CMyEditView, CRichEditView)
  51. //{{AFX_MSG_MAP(CMyEditView)
  52. ON_WM_DESTROY()
  53. ON_COMMAND(ID_CHAR_STRIKEOUT, OnCharStrikeout)
  54. ON_UPDATE_COMMAND_UI(ID_CHAR_STRIKEOUT, OnUpdateCharStrikeout)
  55. ON_WM_CONTEXTMENU()
  56. ON_WM_RBUTTONUP()
  57. ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
  58. ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
  59. ON_WM_CHAR()
  60. ON_COMMAND(ID_CHAR_HIGHLIGHT, OnCharHighlight)
  61. ON_COMMAND(ID_PARAGRAPH, OnParagraph)
  62. ON_COMMAND(ID_DATE, OnDate)
  63. ON_COMMAND(ID_SUBSCRIPT, OnSubscript)
  64. ON_UPDATE_COMMAND_UI(ID_SUBSCRIPT, OnUpdateSubscript)
  65. ON_COMMAND(ID_SUPERSCRIPT, OnSuperscript)
  66. ON_UPDATE_COMMAND_UI(ID_SUPERSCRIPT, OnUpdateSuperscript)
  67. ON_COMMAND(ID_INSERT_NUMBERING, OnInsertNumbering)
  68. ON_UPDATE_COMMAND_UI(ID_INSERT_NUMBERING, OnUpdateInsertNumbering)
  69. ON_COMMAND(ID_CHAR_BOLD, OnCharBold)
  70. ON_UPDATE_COMMAND_UI(ID_CHAR_BOLD, OnUpdateCharBold)
  71. ON_COMMAND(ID_CHAR_ITALIC, OnCharItalic)
  72. ON_UPDATE_COMMAND_UI(ID_CHAR_ITALIC, OnUpdateCharItalic)
  73. ON_COMMAND(ID_CHAR_UNDERLINE, OnCharUnderline)
  74. ON_UPDATE_COMMAND_UI(ID_CHAR_UNDERLINE, OnUpdateCharUnderline)
  75. ON_COMMAND(ID_PARA_CENTER, OnParaCenter)
  76. ON_UPDATE_COMMAND_UI(ID_PARA_CENTER, OnUpdateParaCenter)
  77. ON_COMMAND(ID_PARA_LEFT, OnParaLeft)
  78. ON_UPDATE_COMMAND_UI(ID_PARA_LEFT, OnUpdateParaLeft)
  79. ON_COMMAND(ID_PARA_RIGHT, OnParaRight)
  80. ON_UPDATE_COMMAND_UI(ID_PARA_RIGHT, OnUpdateParaRight)
  81. ON_COMMAND(ID_CHAR_COLOR, OnColorPick)
  82. ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
  83. ON_COMMAND(ID_CHANGE_CASE, OnChangeCase)
  84. ON_UPDATE_COMMAND_UI(ID_CHANGE_CASE, OnUpdateChangeCase)
  85. //}}AFX_MSG_MAP
  86. ON_NOTIFY(FN_GETFORMAT, IDR_FORMATBAR, OnGetCharFormat)
  87. ON_NOTIFY(FN_SETFORMAT, IDR_FORMATBAR, OnSetCharFormat)
  88. ON_NOTIFY(NM_RETURN, IDR_FORMATBAR, OnBarReturn)
  89. // Standard printing commands
  90. ON_COMMAND(ID_INSERT_BULLET, CRichEditView::OnBullet)
  91. ON_UPDATE_COMMAND_UI(ID_INSERT_BULLET, CRichEditView::OnUpdateBullet)
  92. ON_COMMAND(ID_FILE_PRINT_DIRECT, CRichEditView::OnFilePrint)
  93. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRichEditView::OnFilePrintPreview)
  94. END_MESSAGE_MAP()
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CMyEditView construction/destruction
  97. CMyEditView::CMyEditView()
  98. {
  99. // TODO: add construction code here
  100. m_nBulletIndent = 360;
  101. }
  102. CMyEditView::~CMyEditView()
  103. {
  104. }
  105. BOOL CMyEditView::PreCreateWindow(CREATESTRUCT& cs)
  106. {
  107.   ExtAfxInitRichEdit(FALSE);
  108.   return CCtrlView::PreCreateWindow(cs);
  109. }
  110. void CMyEditView::OnInitialUpdate()
  111. {
  112. CRichEditView::OnInitialUpdate();
  113. CRichEditCtrl& rCtrl = GetRichEditCtrl();
  114. CHARFORMAT cfm;
  115. cfm.cbSize = sizeof(CHARFORMAT);
  116. cfm.dwMask = CFM_FACE | CFM_SIZE | CFM_BOLD |
  117. CFM_ITALIC | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_PROTECTED;
  118. cfm.dwEffects = 0;
  119. cfm.yHeight = 240;
  120. ::lstrcpy(cfm.szFaceName, "Times New Roman"); rCtrl.SetWordCharFormat(cfm);
  121. SetMargins(CRect(720, 720, 720, 720));
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // CMyEditView printing
  125. BOOL CMyEditView::OnPreparePrinting(CPrintInfo* pInfo)
  126. {
  127. // default preparation
  128. return DoPreparePrinting(pInfo);
  129. }
  130. void CMyEditView::OnDestroy()
  131. {
  132.    CRichEditView::OnDestroy();
  133. }
  134. /////////////////////////////////////////////////////////////////////////////
  135. // CMyEditView diagnostics
  136. #ifdef _DEBUG
  137. void CMyEditView::AssertValid() const
  138. {
  139. CRichEditView::AssertValid();
  140. }
  141. void CMyEditView::Dump(CDumpContext& dc) const
  142. {
  143. CRichEditView::Dump(dc);
  144. }
  145. CEditDoc* CMyEditView::GetDocument() // non-debug version is inline
  146. {
  147. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEditDoc)));
  148. return (CEditDoc*)m_pDocument;
  149. }
  150. #endif //_DEBUG
  151. /////////////////////////////////////////////////////////////////////////////
  152. // CMyEditView message handlers
  153. void CMyEditView::OnGetCharFormat(NMHDR* pNMHDR, LRESULT* pRes)
  154. {
  155. ((CHARNMHDR*)pNMHDR)->cf = GetCharFormatSelection();
  156. *pRes = 1;
  157. }
  158. void CMyEditView::OnSetCharFormat(NMHDR* pNMHDR, LRESULT* pRes)
  159. {
  160. SetCharFormat(((CHARNMHDR*)pNMHDR)->cf);
  161. *pRes = 1;
  162. }
  163. void CMyEditView::OnBarReturn(NMHDR*, LRESULT* )
  164. {
  165. SetFocus();
  166. }
  167. void CMyEditView::OnColorPick() 
  168. {
  169. CColorDialog dlg;
  170. if( dlg.DoModal() == IDOK ){
  171. CRichEditView::OnColorPick(dlg.GetColor());
  172. }
  173. }
  174. void CMyEditView::OnCharStrikeout() 
  175. {
  176. // TODO: Add your command handler code here
  177. OnCharEffect(CFM_STRIKEOUT, CFE_STRIKEOUT);
  178. }
  179. void CMyEditView::OnUpdateCharStrikeout(CCmdUI* pCmdUI) 
  180. {
  181. // TODO: Add your command update UI handler code here
  182. OnUpdateCharEffect(pCmdUI, CFM_STRIKEOUT, CFE_STRIKEOUT);
  183. }
  184. void CMyEditView::OnRButtonUp(UINT nFlags, CPoint point) 
  185. {
  186. // TODO: Add your message handler code here and/or call default
  187. ClientToScreen(&point);
  188. OnContextMenu((CWnd* )NULL, point);
  189. }
  190. void CMyEditView::OnContextMenu(CWnd* pWnd, CPoint point) 
  191. {
  192. // TODO: Add your message handler code here
  193. if( point.x == -1 && point.y == -1 )
  194. {
  195. CRect rect;
  196. GetClientRect(rect);
  197. ClientToScreen(rect);
  198. point = rect.TopLeft();
  199. point.Offset(5, 5);
  200. }
  201. CMenu menu;
  202. VERIFY(menu.LoadMenu(IDR_POP));
  203. CMenu* pPopup = menu.GetSubMenu(0);
  204. ASSERT(pPopup != NULL);
  205. CWnd* pWndPopupOwner = this;
  206. while(pWndPopupOwner->GetStyle() & WS_CHILD)
  207. pWndPopupOwner = pWndPopupOwner->GetParent();
  208. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, 
  209. point.x, point.y, pWndPopupOwner);
  210. }
  211. void CMyEditView::OnCharHighlight() 
  212. {
  213. // TODO: Add your command handler code here
  214. CColorDialog dlg;
  215. if( IDOK == dlg.DoModal() )
  216. {
  217. CHARFORMAT2 cf;
  218. SendMessage(EM_GETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);
  219. cf.cbSize = sizeof CHARFORMAT2;
  220. cf.dwMask = CFM_BACKCOLOR;
  221. cf.crBackColor = dlg.GetColor();
  222. SendMessage(EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);
  223. }
  224. }
  225. void CMyEditView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  226. {
  227. // TODO: Add your command handler code here
  228. CRichEditView::OnPrint(pDC, pInfo);
  229. UINT nPage = pInfo->m_nCurPage;
  230. ASSERT(nPage <= (UINT)m_aPageStart.GetSize());  
  231. UINT Hu = m_aPageStart[nPage];
  232. if (nPage >= 2 && m_aPageStart[nPage-1] >= m_aPageStart[nPage])
  233. {
  234. TRACE0("End of Documentn");
  235. pInfo->m_bContinuePrinting = FALSE;
  236. }
  237. }
  238. void CMyEditView::OnEditRedo() 
  239. {
  240. // TODO: Add your command handler code here
  241. SendMessage(EM_REDO, 0, 0);
  242. }
  243. void CMyEditView::OnUpdateEditRedo(CCmdUI* pCmdUI) 
  244. {
  245. // TODO: Add your command update UI handler code here
  246. BOOL bCanRedo = (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0);
  247. pCmdUI->Enable(bCanRedo);
  248. }
  249. void CMyEditView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  250. {
  251. // TODO: Add your message handler code here and/or call default
  252. if (m_bFirst)
  253. {
  254. m_bFirst = FALSE;
  255. m_bIsSpace = isspace(nChar);
  256. return;
  257. }
  258. if (m_bIsSpace)
  259. {
  260. if (!isspace(nChar))
  261. {
  262. SendMessage(EM_STOPGROUPTYPING,0,0);  
  263. m_bIsSpace = FALSE;
  264. }
  265. }
  266. else
  267. {
  268. if (isspace(nChar))
  269. {
  270.   SendMessage(EM_STOPGROUPTYPING,0,0);  
  271.   m_bIsSpace = TRUE;
  272. }
  273. CRichEditView::OnChar(nChar, nRepCnt, nFlags);
  274. }
  275. LRESULT CMyEditView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  276. {
  277.   if (message == EM_FINDTEXTEX)
  278.   {
  279.  wParam += 1;
  280.   }
  281.   return CRichEditView::WindowProc(message, wParam, lParam);
  282. }
  283. void CMyEditView::OnGetCharFormatEx(CHARFORMAT2& cf, DWORD dwMask)
  284. {
  285. cf.dwMask |= dwMask;
  286. cf.cbSize = sizeof CHARFORMAT2;
  287. SendMessage(EM_GETCHARFORMAT, 1, (LPARAM)&cf);
  288. }
  289. void CMyEditView::OnCharEffect2(DWORD dwMask, DWORD dwEffect)
  290. {
  291. CHARFORMAT2 cf;
  292. OnGetCharFormatEx(cf, dwMask);
  293. if (cf.dwEffects & dwEffect)
  294. cf.dwEffects &= ~dwEffect;
  295. else
  296. cf.dwEffects |= dwEffect;
  297. OnSetCharFormatEx(cf, dwMask);
  298. }
  299. void CMyEditView::OnUpdateCharEffect2(CCmdUI* pCmdUI, DWORD dwMask, DWORD dwEffect)
  300. {
  301. CHARFORMAT2 cf;
  302. OnGetCharFormatEx(cf, dwMask);
  303. pCmdUI->SetCheck((cf.dwMask & dwMask) ?
  304. ((cf.dwEffects & dwEffect) ? 1 : 0) : 2);
  305. }
  306. void CMyEditView::OnSetCharFormatEx(CHARFORMAT2& cf, DWORD dwMask)
  307. {
  308. CRichEditCtrl& rCtrl = GetRichEditCtrl();
  309. cf.cbSize = sizeof CHARFORMAT2;
  310. cf.dwMask |= dwMask;
  311. CHARRANGE cr;
  312. rCtrl.GetSel(cr);
  313. if (cr.cpMax != cr.cpMin)
  314. SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
  315. else
  316. SendMessage(EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);
  317. }
  318. void CMyEditView::OnGetParaFormatEx(PARAFORMAT2& pf)
  319. {
  320. pf.cbSize = sizeof PARAFORMAT2;
  321. SendMessage(EM_GETPARAFORMAT, 1, (LPARAM)&pf);
  322. }
  323. void CMyEditView::OnSetParaFormatEx(PARAFORMAT2& pf)
  324. {
  325. CRichEditCtrl& rCtrl = GetRichEditCtrl();
  326. pf.cbSize = sizeof PARAFORMAT2;
  327. CHARRANGE cr;
  328. rCtrl.GetSel(cr);
  329. if (cr.cpMax != cr.cpMin)
  330. SendMessage(EM_SETPARAFORMAT, SCF_SELECTION, (LPARAM)&pf);
  331. else
  332. SendMessage(EM_SETPARAFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&pf);
  333. }
  334. void CMyEditView::OnParagraph() 
  335. {
  336. // TODO: Add your command handler code here
  337. CParagraphDialog dlg(GetParaFormatSelection());
  338. if (dlg.DoModal() == IDOK)
  339. SetParaFormat(dlg.m_pf);
  340. }
  341. void CMyEditView::OnDate() 
  342. {
  343. // TODO: Add your command handler code here
  344. CDateDialog dlg;
  345. if (dlg.DoModal() == IDOK)
  346. GetRichEditCtrl().ReplaceSel(dlg.m_strSel);;
  347. }
  348. void CMyEditView::OnSubscript() 
  349. {
  350. // TODO: Add your command handler code here
  351. OnCharEffect2(CFM_SUBSCRIPT,CFE_SUBSCRIPT);
  352. }
  353. void CMyEditView::OnUpdateSubscript(CCmdUI* pCmdUI) 
  354. {
  355. // TODO: Add your command update UI handler code here
  356. OnUpdateCharEffect2(pCmdUI, CFM_SUBSCRIPT,CFE_SUBSCRIPT);
  357. }
  358. void CMyEditView::OnSuperscript() 
  359. {
  360. // TODO: Add your command handler code here
  361. OnCharEffect2(CFM_SUPERSCRIPT,CFE_SUPERSCRIPT);
  362. }
  363. void CMyEditView::OnUpdateSuperscript(CCmdUI* pCmdUI) 
  364. {
  365. // TODO: Add your command update UI handler code here
  366. OnUpdateCharEffect2(pCmdUI, CFM_SUPERSCRIPT,CFE_SUPERSCRIPT);
  367. }
  368. void CMyEditView::OnInsertNumbering() 
  369. {
  370. // TODO: Add your command handler code here
  371. PARAFORMAT2 pf;
  372. OnGetParaFormatEx(pf);
  373. if (pf.dwMask & PFM_NUMBERING && pf.wNumbering == 2)
  374. {
  375. pf.wNumbering = 0;
  376. pf.dxOffset = 0;
  377. pf.dxStartIndent = 0;
  378. pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  379. }
  380. else
  381. {
  382. pf.dwMask = PFM_NUMBERING | PFM_NUMBERINGSTART | PFM_NUMBERINGSTYLE | PFM_NUMBERINGTAB;
  383. pf.wNumbering = 2;
  384. pf.wNumberingStart = 1;
  385. pf.wNumberingStyle = 1;
  386. pf.wNumberingTab = 360;
  387. if (pf.dxOffset == 0)
  388. {
  389. pf.dxOffset = m_nBulletIndent;
  390. pf.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  391. }
  392. }
  393. OnSetParaFormatEx(pf);
  394. }
  395. void CMyEditView::OnUpdateInsertNumbering(CCmdUI* pCmdUI) 
  396. {
  397. // TODO: Add your command update UI handler code here
  398. PARAFORMAT2 pf;
  399. OnGetParaFormatEx(pf);
  400. pCmdUI->SetRadio( (pf.dwMask & PFM_NUMBERING) ? ((pf.wNumbering & 2) ? 1 : 0) : 2);
  401. }
  402. void CMyEditView::OnChangeCase() 
  403. {
  404. // TODO: Add your command handler code here
  405. OnCharEffect2(CFM_ALLCAPS,CFE_ALLCAPS);
  406. }
  407. void CMyEditView::OnUpdateChangeCase(CCmdUI* pCmdUI) 
  408. {
  409. // TODO: Add your command update UI handler code here
  410. OnUpdateCharEffect2(pCmdUI, CFM_ALLCAPS,CFE_ALLCAPS);
  411. }