AutoRichEditCtrl.cpp
上传用户:niucheng
上传日期:2007-01-02
资源大小:56k
文件大小:8k
源码类别:

RichEdit

开发平台:

Visual C++

  1. // AutoRichEditCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "RichEd.h"
  5. #include "AutoRichEditCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAutoRichEditCtrl
  13. CAutoRichEditCtrl::CAutoRichEditCtrl()
  14. {
  15. }
  16. CAutoRichEditCtrl::~CAutoRichEditCtrl()
  17. {
  18. }
  19. BEGIN_MESSAGE_MAP(CAutoRichEditCtrl, CRichEditCtrl)
  20. //{{AFX_MSG_MAP(CAutoRichEditCtrl)
  21. // NOTE - the ClassWizard will add and remove mapping macros here.
  22. //}}AFX_MSG_MAP
  23. END_MESSAGE_MAP()
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CAutoRichEditCtrl message handlers
  26. CString CAutoRichEditCtrl::GetRTF()
  27. {
  28. // Return the RTF string of the text in the control.
  29. // Stream out here.
  30. EDITSTREAM es;
  31. es.dwError = 0;
  32. es.pfnCallback = CBStreamOut; // Set the callback
  33. CString sRTF = "";
  34. es.dwCookie = (DWORD) &sRTF; // so sRTF receives the string
  35. StreamOut(SF_RTF, es); // Call CRichEditCtrl::StreamOut to get the string.
  36. ///
  37. return sRTF;
  38. }
  39. void CAutoRichEditCtrl::SetRTF(CString sRTF)
  40. {
  41. // Put the RTF string sRTF into the rich edit control.
  42. // Read the text in
  43. EDITSTREAM es;
  44. es.dwError = 0;
  45. es.pfnCallback = CBStreamIn;
  46. es.dwCookie = (DWORD) &sRTF;
  47. StreamIn(SF_RTF, es); // Do it.
  48. }
  49. /*
  50. Callback function to stream an RTF string into the rich edit control.
  51. */
  52. DWORD CALLBACK CAutoRichEditCtrl::CBStreamIn(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
  53. {
  54. // We insert the rich text here.
  55. /*
  56. This function taken from CodeGuru.com
  57. http://www.codeguru.com/richedit/rtf_string_streamin.shtml
  58. Zafir Anjum
  59. */
  60. CString *pstr = (CString *) dwCookie;
  61. if (pstr->GetLength() < cb)
  62. {
  63. *pcb = pstr->GetLength();
  64. memcpy(pbBuff, (LPCSTR) *pstr, *pcb);
  65. pstr->Empty();
  66. }
  67. else
  68. {
  69. *pcb = cb;
  70. memcpy(pbBuff, (LPCSTR) *pstr, *pcb);
  71. *pstr = pstr->Right(pstr->GetLength() - cb);
  72. }
  73. ///
  74. return 0;
  75. }
  76. /*
  77. Callback function to stream the RTF string out of the rich edit control.
  78. */
  79. DWORD CALLBACK CAutoRichEditCtrl::CBStreamOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
  80. {
  81. // Address of our string var is in psEntry
  82. CString *psEntry = (CString*) dwCookie;
  83. CString tmpEntry = "";
  84. tmpEntry = (CString) pbBuff;
  85. // And write it!!!
  86. *psEntry += tmpEntry.Left(cb);
  87. return 0;
  88. }
  89. bool CAutoRichEditCtrl::SelectionIsBold()
  90. {
  91. CHARFORMAT cf = GetCharFormat();
  92. if (cf.dwEffects & CFM_BOLD)
  93. return true;
  94. else
  95. return false;
  96. }
  97. bool CAutoRichEditCtrl::SelectionIsItalic()
  98. {
  99. CHARFORMAT cf = GetCharFormat();
  100. if (cf.dwEffects & CFM_ITALIC)
  101. return true;
  102. else
  103. return false;
  104. }
  105. bool CAutoRichEditCtrl::SelectionIsUnderlined()
  106. {
  107. CHARFORMAT cf = GetCharFormat();
  108. if (cf.dwEffects & CFM_UNDERLINE)
  109. return true;
  110. else
  111. return false;
  112. }
  113. CHARFORMAT CAutoRichEditCtrl::GetCharFormat(DWORD dwMask)
  114. {
  115. CHARFORMAT cf;
  116. cf.cbSize = sizeof(CHARFORMAT);
  117. cf.dwMask = dwMask;
  118. GetSelectionCharFormat(cf);
  119. return cf;
  120. }
  121. void CAutoRichEditCtrl::SetCharStyle(int MASK, int STYLE, int nStart, int nEnd)
  122. {
  123. CHARFORMAT cf;
  124. cf.cbSize = sizeof(CHARFORMAT);
  125. //cf.dwMask = MASK;
  126. GetSelectionCharFormat(cf);
  127. if (cf.dwMask & MASK) // selection is all the same
  128. {
  129. cf.dwEffects ^= STYLE; 
  130. }
  131. else
  132. {
  133. cf.dwEffects |= STYLE;
  134. }
  135. cf.dwMask = MASK;
  136. SetSelectionCharFormat(cf);
  137. }
  138. void CAutoRichEditCtrl::SetSelectionBold()
  139. {
  140. long start=0, end=0;
  141. GetSel(start, end); // Get the current selection
  142. SetCharStyle(CFM_BOLD, CFE_BOLD, start, end); // Make it bold
  143. }
  144. void CAutoRichEditCtrl::SetSelectionItalic()
  145. {
  146. long start=0, end=0;
  147. GetSel(start, end);
  148. SetCharStyle(CFM_ITALIC, CFE_ITALIC, start, end);
  149. }
  150. void CAutoRichEditCtrl::SetSelectionUnderlined()
  151. {
  152. long start=0, end=0;
  153. GetSel(start, end);
  154. SetCharStyle(CFM_UNDERLINE, CFE_UNDERLINE, start, end);
  155. }
  156. void CAutoRichEditCtrl::SetParagraphCenter()
  157. {
  158. PARAFORMAT paraFormat;    
  159. paraFormat.cbSize = sizeof(PARAFORMAT);
  160. paraFormat.dwMask = PFM_ALIGNMENT;    
  161. paraFormat.wAlignment = PFA_CENTER;
  162. SetParaFormat(paraFormat); // Set the paragraph.
  163. }
  164. void CAutoRichEditCtrl::SetParagraphLeft()
  165. {
  166. PARAFORMAT paraFormat;
  167. paraFormat.cbSize = sizeof(PARAFORMAT);
  168. paraFormat.dwMask = PFM_ALIGNMENT;    
  169. paraFormat.wAlignment = PFA_LEFT;
  170. SetParaFormat(paraFormat);
  171. }
  172. void CAutoRichEditCtrl::SetParagraphRight()
  173. {
  174. PARAFORMAT paraFormat;
  175. paraFormat.cbSize = sizeof(PARAFORMAT);
  176. paraFormat.dwMask = PFM_ALIGNMENT;    
  177. paraFormat.wAlignment = PFA_RIGHT;
  178. SetParaFormat(paraFormat);
  179. }
  180. bool CAutoRichEditCtrl::ParagraphIsCentered()
  181. {
  182. PARAFORMAT pf = GetParagraphFormat();
  183. if (pf.wAlignment == PFA_CENTER)
  184. return true;
  185. else
  186. return false;
  187. }
  188. bool CAutoRichEditCtrl::ParagraphIsLeft()
  189. {
  190. PARAFORMAT pf = GetParagraphFormat();
  191. if (pf.wAlignment == PFA_LEFT)
  192. return true;
  193. else
  194. return false;
  195. }
  196. bool CAutoRichEditCtrl::ParagraphIsRight()
  197. {
  198. PARAFORMAT pf = GetParagraphFormat();
  199. if (pf.wAlignment == PFA_RIGHT)
  200. return true;
  201. else
  202. return false;
  203. }
  204. PARAFORMAT CAutoRichEditCtrl::GetParagraphFormat()
  205. {
  206. PARAFORMAT pf;
  207. pf.cbSize = sizeof(PARAFORMAT);
  208. pf.dwMask = PFM_ALIGNMENT | PFM_NUMBERING;    
  209. GetParaFormat(pf);
  210. return pf;
  211. }
  212. void CAutoRichEditCtrl::SetParagraphBulleted()
  213. {
  214. PARAFORMAT paraformat = GetParagraphFormat();
  215. if ( (paraformat.dwMask & PFM_NUMBERING) && (paraformat.wNumbering == PFN_BULLET) )
  216. {
  217. paraformat.wNumbering = 0;
  218. paraformat.dxOffset = 0;
  219. paraformat.dxStartIndent = 0;
  220. paraformat.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  221. }
  222. else
  223. {
  224. paraformat.wNumbering = PFN_BULLET;
  225. paraformat.dwMask = PFM_NUMBERING;
  226. if (paraformat.dxOffset == 0)
  227. {
  228. paraformat.dxOffset = 4;
  229. paraformat.dwMask = PFM_NUMBERING | PFM_STARTINDENT | PFM_OFFSET;
  230. }
  231. }
  232. SetParaFormat(paraformat);
  233. }
  234. bool CAutoRichEditCtrl::ParagraphIsBulleted()
  235. {
  236. PARAFORMAT pf = GetParagraphFormat();
  237. if (pf.wNumbering == PFN_BULLET)
  238. return true;
  239. else
  240. return false;
  241. }
  242. void CAutoRichEditCtrl::SelectColor()
  243. {
  244. CColorDialog dlg;
  245. CHARFORMAT cf = GetCharFormat();
  246. if (cf.dwEffects & CFE_AUTOCOLOR) cf.dwEffects -= CFE_AUTOCOLOR;
  247. // Get a color from the common color dialog.
  248. if( dlg.DoModal() == IDOK )
  249. {
  250. cf.crTextColor = dlg.GetColor();
  251. }
  252. cf.dwMask = CFM_COLOR;
  253. SetSelectionCharFormat(cf);
  254. }
  255. void CAutoRichEditCtrl::SetFontName(CString sFontName)
  256. {
  257. CHARFORMAT cf = GetCharFormat();
  258. // Set the font name.
  259. for (int i = 0; i <= sFontName.GetLength()-1; i++)
  260. cf.szFaceName[i] = sFontName[i];
  261. cf.dwMask = CFM_FACE;
  262. SetSelectionCharFormat(cf);
  263. }
  264. void CAutoRichEditCtrl::SetFontSize(int nPointSize)
  265. {
  266. CHARFORMAT cf = GetCharFormat();
  267. nPointSize *= 20; // convert from to twips
  268. cf.yHeight = nPointSize;
  269. cf.dwMask = CFM_SIZE;
  270. SetSelectionCharFormat(cf);
  271. }
  272. void CAutoRichEditCtrl::GetSystemFonts(CStringArray &saFontList)
  273. {
  274. CDC *pDC = GetDC ();
  275. EnumFonts (pDC->GetSafeHdc(),NULL,(FONTENUMPROC) CBEnumFonts,(LPARAM)&saFontList);//Enumerate
  276. }
  277. BOOL CALLBACK CAutoRichEditCtrl::CBEnumFonts(LPLOGFONT lplf, LPTEXTMETRIC lptm, DWORD dwType, LPARAM lpData)
  278. {
  279. // This function was written with the help of CCustComboBox, by Girish Bharadwaj.
  280. // Available from Codeguru.
  281. if (dwType == TRUETYPE_FONTTYPE) 
  282. {
  283. ((CStringArray *) lpData)->Add( lplf->lfFaceName );
  284. }
  285. return true;
  286. }
  287. CString CAutoRichEditCtrl::GetSelectionFontName()
  288. {
  289. CHARFORMAT cf = GetCharFormat();
  290. CString sName = cf.szFaceName;
  291. return sName;
  292. }
  293. long CAutoRichEditCtrl::GetSelectionFontSize()
  294. {
  295. CHARFORMAT cf = GetCharFormat();
  296. long nSize = cf.yHeight/20;
  297. return nSize;
  298. }