RichEditDlg.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. // RichEditDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "RichEditDlg.h"
  5. #include "Resource.h"
  6. // CRichEditDlg 对话框
  7. //菜单命令
  8. #define IDM_CLEAR_ALL (WM_USER+201) //删除信息
  9. #define IDM_SELECT_ALL (WM_USER+202) //全部选择
  10. #define IDM_COPY_STRING (WM_USER+203) //拷贝字符
  11. IMPLEMENT_DYNAMIC(CRichEditDlg, CDlgControlItem)
  12. CRichEditDlg::CRichEditDlg(CWnd* pParent /*=NULL*/)
  13. : CDlgControlItem(IDD_RICHEDIT, pParent)
  14. {
  15. ZeroMemory(&m_cf2, sizeof(CHARFORMAT2));
  16. }
  17. CRichEditDlg::~CRichEditDlg()
  18. {
  19. }
  20. void CRichEditDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDlgControlItem::DoDataExchange(pDX);
  23. DDX_Control(pDX,IDC_RICHEDIT21,m_RichEditCtrl);
  24. DDX_Control(pDX,IDC_RICHEDIT22,m_SkinRichEdit);
  25. }
  26. BEGIN_MESSAGE_MAP(CRichEditDlg, CDlgControlItem)
  27. ON_BN_CLICKED(IDC_BUTTON1, &CRichEditDlg::OnBnClickedButton1)
  28. ON_BN_CLICKED(IDC_BUTTON2, &CRichEditDlg::OnBnClickedButton2)
  29. ON_BN_CLICKED(IDC_BUTTON4, &CRichEditDlg::OnBnClickedButton4)
  30. ON_BN_CLICKED(IDC_BUTTON5, &CRichEditDlg::OnBnClickedButton5)
  31. ON_NOTIFY(EN_LINK, IDC_RICHEDIT21, OnURLClick )
  32. ON_BN_CLICKED(IDC_BUTTON6, &CRichEditDlg::OnBnClickedButton6)
  33. ON_BN_CLICKED(IDC_BUTTON10, &CRichEditDlg::OnBnClickedButton10)
  34. ON_BN_CLICKED(IDC_BUTTON7, &CRichEditDlg::OnBnClickedButton7)
  35. ON_RBN_DBLCLK(IDC_RICHEDIT22,OnRClicked)
  36. //菜单命令
  37. ON_COMMAND(IDM_CLEAR_ALL, OnClearAll)
  38. ON_COMMAND(IDM_SELECT_ALL, OnSelectAll)
  39. ON_COMMAND(IDM_COPY_STRING, OnCopyString)
  40. END_MESSAGE_MAP()
  41. // CRichEditDlg 消息处理程序
  42. void CRichEditDlg::OnBnClickedButton1()
  43. {
  44. CFontDialog dlg;
  45. if (dlg.DoModal() == IDOK )
  46. {
  47. LOGFONT lFont;
  48. dlg.GetCurrentFont(&lFont);
  49. CHARFORMAT cf;
  50. ZeroMemory(&cf, sizeof(CHARFORMAT));
  51. m_RichEditCtrl.GetDefaultCharFormat(cf);
  52. cf.yHeight = -15 * lFont.lfHeight;
  53. cf.dwMask = CFM_COLOR|CFM_SIZE |CFM_FACE;
  54. cf.dwEffects = CFE_BOLD;
  55. cf.crTextColor = dlg.GetColor();
  56. lstrcpyn(cf.szFaceName,lFont.lfFaceName,CountArray(lFont.lfFaceName));
  57. m_RichEditCtrl.SetSelectionCharFormat(cf);
  58. m_RichEditCtrl.SetSel(-1,-1);
  59. }
  60. }
  61. BOOL CRichEditDlg::OnInitDialog()
  62. {
  63. CDlgControlItem::OnInitDialog();
  64. m_SkinRichEdit.SetScrollImage(&m_SkinRichEdit,TEXT("Res\\Scroll\\SKIN_SCROLL.bmp"));
  65. m_SkinRichEdit.GetDefaultCharFormat(m_cf2);
  66. m_SkinRichEdit.SetBackColor(RGB(255,255,0));
  67. return TRUE; // return TRUE unless you set the focus to a control
  68. // 异常: OCX 属性页应返回 FALSE
  69. }
  70. void CRichEditDlg::OnBnClickedButton2()
  71. {
  72. CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,TEXT("RTF文件;txt文件|*.rtf;*.txt||"));
  73. if ( dlg.DoModal() == IDOK )
  74. {
  75. CString strFileName = dlg.GetPathName();
  76. //打开文件
  77. CFile File;
  78. if (File.Open(strFileName,CFile::modeRead,NULL)==FALSE) return;
  79. //构造数据
  80. EDITSTREAM EditStream;
  81. EditStream.pfnCallback=LoadCallBack;
  82. EditStream.dwCookie=(DWORD_PTR)(&File);
  83. //读取文件
  84. if( StrCmp(File.GetFileName().Right(3),TEXT("rtf")) == 0 )
  85. m_RichEditCtrl.StreamIn(SF_RTF,EditStream);
  86. else
  87. m_RichEditCtrl.StreamIn(SF_TEXT,EditStream);
  88. File.Close();
  89. }
  90. }
  91. void CRichEditDlg::OnBnClickedButton4()
  92. {
  93. CFileDialog FileDlg(FALSE,TEXT("RTF"),0,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,TEXT("信息文件(*.RTF)|*.RTF||"),this);
  94. if ( FileDlg.DoModal() == IDOK )
  95. {
  96. CString strFileName = FileDlg.GetPathName();
  97. //打开文件
  98. CFile File;
  99. if (File.Open(strFileName,CFile::modeWrite|CFile::modeCreate,NULL)==FALSE) return;
  100. //构造数据
  101. EDITSTREAM EditStream;
  102. EditStream.pfnCallback=SaveCallBack;
  103. EditStream.dwCookie=(DWORD)(LONGLONG)(&File);
  104. //写入文件
  105. m_RichEditCtrl.StreamOut(SF_RTF,EditStream);
  106. }
  107. }
  108. DWORD CALLBACK CRichEditDlg::LoadCallBack( DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb )
  109. {
  110. //读取文件
  111. *pcb=((CFile *)(LONGLONG)(dwCookie))->Read(pbBuff,cb);
  112. return 0;
  113. }
  114. //保存回调
  115. DWORD CALLBACK CRichEditDlg::SaveCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb)
  116. {
  117. //写入文件
  118. ((CFile *)(LONGLONG)(dwCookie))->Write(pbBuff,cb);
  119. return 0;
  120. }
  121. void CRichEditDlg::OnBnClickedButton5()
  122. {
  123. CHARFORMAT2 cf2;
  124. ZeroMemory(&cf2, sizeof(CHARFORMAT2));
  125. cf2.cbSize = sizeof(CHARFORMAT2);
  126. cf2.dwMask = CFM_LINK;
  127. cf2.dwEffects |= CFE_LINK;
  128. m_RichEditCtrl.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
  129. //添加点击事件
  130. m_RichEditCtrl.SetEventMask(ENM_LINK);
  131. }
  132. void CRichEditDlg::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
  133. {
  134. ENLINK* pENLink = ( ENLINK* )pNmhdr ;
  135. *pResult = 0 ;
  136. if (pENLink->msg == WM_LBUTTONUP)
  137. {
  138. CString StrURL ;
  139. CHARRANGE l_CharRange ;
  140. m_RichEditCtrl.GetSel( l_CharRange ) ;
  141. m_RichEditCtrl.SetSel( pENLink->chrg ) ;
  142. StrURL = m_RichEditCtrl.GetSelText() ;
  143. m_RichEditCtrl.SetSel( l_CharRange ) ;
  144. ShellExecute( GetSafeHwnd(), TEXT( "open" ), StrURL, NULL, NULL, SW_SHOWNORMAL ) ;
  145. *pResult = 1 ;
  146. }
  147. }
  148. void CRichEditDlg::InsertTips()
  149. {
  150. CString strTime;
  151. CTime tm =CTime::GetCurrentTime();
  152. strTime=tm.Format(TEXT("丄偙寵ル %Y/%m/%d %X\n"));
  153. CHARFORMAT2 cf2;
  154. ZeroMemory(&cf2, sizeof(CHARFORMAT2));
  155. cf2.cbSize = sizeof(CHARFORMAT2);
  156. cf2.dwMask = CFM_COLOR|CFM_SIZE |CFM_FACE;
  157. cf2.dwEffects = CFE_BOLD;
  158. cf2.yHeight = 60;
  159. cf2.crTextColor = RGB(0,151,164);
  160. m_SkinRichEdit.InsertString(strTime,cf2);
  161. }
  162. void CRichEditDlg::OnBnClickedButton6()
  163. {
  164. CString str;
  165. GetDlgItemText(IDC_EDIT1,str);
  166. InsertTips();
  167. m_SkinRichEdit.InsertString(str,m_cf2);
  168. m_SkinRichEdit.InsertString(TEXT("\n"),RGB(0,0,0));
  169. }
  170. void CRichEditDlg::OnBnClickedButton10()
  171. {
  172. CFileDialog FileDlg(TRUE,TEXT("插入图片"),0,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,TEXT("图像文件*.BMP;*.JPG;*.JPEG;*.GIF|*.BMP;*.JPG;*.JPEG;*.GIF||"),this);
  173. if ( FileDlg.DoModal() == IDOK )
  174. {
  175. InsertTips();
  176. m_SkinRichEdit.InsertImage(FileDlg.GetPathName());
  177. m_SkinRichEdit.InsertString(TEXT("\n"),RGB(0,0,0));
  178. }
  179. }
  180. void CRichEditDlg::OnBnClickedButton7()
  181. {
  182. CFontDialog dlg;
  183. if (dlg.DoModal() == IDOK )
  184. {
  185. LOGFONT lFont;
  186. dlg.GetCurrentFont(&lFont);
  187. ZeroMemory(&m_cf2, sizeof(CHARFORMAT));
  188. m_SkinRichEdit.GetDefaultCharFormat(m_cf2);
  189. m_cf2.yHeight = -15 * lFont.lfHeight;
  190. m_cf2.dwMask = CFM_COLOR|CFM_SIZE |CFM_FACE;
  191. m_cf2.dwEffects = CFE_BOLD;
  192. m_cf2.crTextColor = dlg.GetColor();
  193. lstrcpyn(m_cf2.szFaceName,lFont.lfFaceName,CountArray(lFont.lfFaceName));
  194. }
  195. }
  196. void CRichEditDlg::OnRClicked()
  197. {
  198. CMenu menu;
  199. if (menu.CreatePopupMenu()==FALSE) return;
  200. menu.AppendMenu(0,IDM_COPY_STRING,TEXT("复制(&C)"));
  201. menu.AppendMenu(0,IDM_SELECT_ALL,TEXT("全部选择(&A)"));
  202. menu.AppendMenu(0,IDM_CLEAR_ALL,TEXT("清屏"));
  203. //显示菜单
  204. CPoint pt;
  205. GetCursorPos(&pt);
  206. menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,pt.x,pt.y,this);
  207. }
  208. //删除信息
  209. VOID CRichEditDlg::OnClearAll()
  210. {
  211. //删除信息
  212. m_SkinRichEdit.SetSel(0L,-1L);
  213. m_SkinRichEdit.ReplaceSel(NULL);
  214. return;
  215. }
  216. //全部选择
  217. VOID CRichEditDlg::OnSelectAll()
  218. {
  219. //全部选择
  220. m_SkinRichEdit.SetSel(0L,-1L);
  221. return;
  222. }
  223. //拷贝字符
  224. VOID CRichEditDlg::OnCopyString()
  225. {
  226. //拷贝字符
  227. m_SkinRichEdit.Copy();
  228. return;
  229. }