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

RichEdit

开发平台:

Visual C++

  1. // RichEditCtrlEx.cpp : implementation file
  2. //
  3. #include "RichEditCtrlEx.h"
  4. /////////////////////////////////////////////////////////////////////////////
  5. // CRichEditCtrlEx
  6. CRichEditCtrlEx::CRichEditCtrlEx()
  7. {
  8. }
  9. CRichEditCtrlEx::~CRichEditCtrlEx()
  10. {
  11. }
  12. BEGIN_MESSAGE_MAP(CRichEditCtrlEx, CRichEditCtrl)
  13. //{{AFX_MSG_MAP(CRichEditCtrlEx)
  14. //}}AFX_MSG_MAP
  15. END_MESSAGE_MAP()
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CRichEditCtrlEx message handlers
  18. void CRichEditCtrlEx::PreSubclassWindow() 
  19. {
  20. // TODO: Add your specialized code here and/or call the base class
  21. CRichEditCtrl::PreSubclassWindow();
  22. SetBackgroundColor( FALSE, ::GetSysColor( COLOR_BTNFACE ));// RGB(0,0,0) );
  23. disable( ) ;
  24. readOnly( ) ;
  25. }
  26. //
  27. // GLOBAL STREAM MANIPULATORS
  28. CRTFBuilder& 
  29. doWrite( CRTFBuilder& r, 
  30. CRichEditCtrl& c  ) throw ( )
  31. {  
  32. r.write( c ) ;
  33. return r ;
  34. }
  35. CRTFBuilder& 
  36. doSize( CRTFBuilder& r, 
  37. int n  ) throw ( )
  38. {  
  39. r.size( n ) ;
  40. return r ;
  41. }
  42. CRTFBuilder& doBold( CRTFBuilder& r,
  43. bool  b )
  44. {
  45. r.bold( b ) ;
  46. return r ;
  47. }
  48. CRTFBuilder& doStrike( CRTFBuilder& r,
  49. bool  b )
  50. {
  51. r.strike( b ) ;
  52. return r ;
  53. }
  54. CRTFBuilder& doItalic( CRTFBuilder& r,
  55. bool  b )
  56. {
  57. r.italic( b ) ;
  58. return r ;
  59. }
  60. CRTFBuilder& doUnderline( CRTFBuilder& r,
  61. bool  b )
  62. {
  63. r.underline( b ) ;
  64. return r ;
  65. }
  66. CRTFBuilder& doFont( CRTFBuilder& r,
  67. int n)
  68. {
  69. r.font( n ) ;
  70. return r ;
  71. }
  72. CRTFBuilder& doColor( CRTFBuilder& r,
  73. int n)
  74. {
  75. r.color( (COLORREF)n ) ;
  76. return r ;
  77. }
  78. CRTFBuilder& doBackColor( CRTFBuilder& r,
  79. int n)
  80. {
  81. r.backColor( (COLORREF)n ) ;
  82. return r ;
  83. }
  84. CRTFBuilder& doAddColor( CRTFBuilder& r,
  85. int n)
  86. {
  87. r.addColor( (COLORREF)n ) ;
  88. return r ;
  89. }
  90. CRTFBuilder& doFont( CRTFBuilder& r,
  91. CString& s)
  92. {
  93. r.font( s ) ;
  94. return r ;
  95. }
  96. CRTFBuilder& doAddFont( CRTFBuilder& r,
  97. CString& s)
  98. {
  99. r.addFont( s ) ;
  100. return r ;
  101. }
  102. CControlManip
  103. write( CRichEditCtrl& c ) throw ( )
  104. {
  105. return CControlManip( &doWrite, 
  106. c ) ;
  107. }
  108. CIntManip
  109. size( int n ) throw( )
  110. {
  111. return CIntManip( &doSize, 
  112. n ) ;
  113. }
  114. CIntManip
  115. font( int n ) throw( )
  116. {
  117. return CIntManip( &doFont, 
  118. n ) ;
  119. }
  120. CIntManip
  121. color( int n ) throw( )
  122. {
  123. return CIntManip( &doColor, 
  124. n ) ;
  125. }
  126. CIntManip
  127. backColor( int n ) throw( )
  128. {
  129. return CIntManip( &doBackColor, 
  130. n ) ;
  131. }
  132. CIntManip
  133. addColor( int n ) throw( )
  134. {
  135. return CIntManip( &doAddColor, 
  136. n ) ;
  137. }
  138. CStringManip
  139. font( LPCTSTR s ) throw( )
  140. {
  141. return CStringManip( &doFont, 
  142. s ) ;
  143. }
  144. CStringManip
  145. addFont( LPCTSTR s ) throw( )
  146. {
  147. return CStringManip( &doAddFont, 
  148. s ) ;
  149. }
  150. CBoolManip
  151. bold( bool b ) throw( )
  152. {
  153. return CBoolManip( &doBold, 
  154. b ) ;
  155. }
  156. CBoolManip
  157. strike( bool b ) throw( )
  158. {
  159. return CBoolManip( &doStrike, 
  160. b ) ;
  161. }
  162. CBoolManip
  163. italic( bool b ) throw( )
  164. {
  165. return CBoolManip( &doItalic, 
  166. b ) ;
  167. }
  168. CBoolManip
  169. underline( bool b ) throw( )
  170. {
  171. return CBoolManip( &doUnderline, 
  172. b ) ;
  173. }
  174. CRTFBuilder& 
  175. operator << ( CRTFBuilder& b, 
  176. RTFSM_PFUNC f ) 
  177. {
  178. return f( b );
  179. }
  180. CRTFBuilder& 
  181. operator << ( CRTFBuilder& b, 
  182. CManip& f ) 
  183. {
  184. return f.go( b );
  185. }
  186. //CRTFBuilder& 
  187. //operator << ( CRTFBuilder& b, 
  188. // CControlManip& f ) 
  189. //{
  190. // return f.go( b );
  191. //}
  192. CRTFBuilder& 
  193. normal( CRTFBuilder& b )
  194. {
  195. b.normal( ) ;
  196. return b ;
  197. }
  198. CRTFBuilder& 
  199. black( CRTFBuilder& b )
  200. {
  201. b.black( ) ;
  202. return b ;
  203. }
  204. CRTFBuilder& 
  205. push( CRTFBuilder& b )
  206. {
  207. b.push( ) ;
  208. return b ;
  209. }
  210. CRTFBuilder& 
  211. pull( CRTFBuilder& b )
  212. {
  213. b.pull( ) ;
  214. return b ;
  215. }
  216. CRTFBuilder& 
  217. red( CRTFBuilder& b )
  218. {
  219. b.red( ) ;
  220. return b ;
  221. }
  222. CRTFBuilder& 
  223. green( CRTFBuilder& b )
  224. {
  225. b.green( ) ;
  226. return b ;
  227. }
  228. CRTFBuilder& 
  229. blue( CRTFBuilder& b )
  230. {
  231. b.blue( ) ;
  232. return b ;
  233. }
  234. CRTFBuilder& 
  235. bold( CRTFBuilder& b )
  236. {
  237. b.bold( ) ;
  238. return b ;
  239. }
  240. CRTFBuilder& 
  241. strike( CRTFBuilder& b )
  242. {
  243. b.strike( ) ;
  244. return b ;
  245. }
  246. CRTFBuilder& 
  247. italic( CRTFBuilder& b )
  248. {
  249. b.italic( ) ;
  250. return b ;
  251. }
  252. CRTFBuilder& 
  253. underline( CRTFBuilder& b )
  254. {
  255. b.underline( ) ;
  256. return b ;
  257. }
  258. CRTFBuilder::CRTFBuilder()
  259. {
  260. m_fontList.add( "Arial" ) ;
  261. m_colorList.add( RGB( 0,0,0 )  ) ;
  262. m_colorList.add( RGB( 255,0,0 )  ) ;
  263. m_colorList.add( RGB( 0,255,0 )  ) ;
  264. m_colorList.add( RGB( 0,0,255 )  ) ;
  265. size(35);
  266. }
  267. CRTFBuilder::~CRTFBuilder()
  268. {
  269. }
  270. void CRTFBuilder::push( )
  271. {
  272. m_attrStack.push(m_attr);
  273. }
  274. void CRTFBuilder::pull( )
  275. {
  276. m_attr = m_attrStack.top( ) ;
  277. m_attrStack.pop( ) ;
  278. }
  279. void CRTFBuilder::color( COLORREF c )
  280. {
  281. int n ( m_colorList.find( c )  );
  282. m_attr.m_nColorFground= n<0 ? m_colorList.add( c )
  283. : n ;
  284. }
  285. void CRTFBuilder::backColor( COLORREF c )
  286. {
  287. int n ( m_colorList.find( c )  ) ;
  288. m_attr.m_nColorBground= n<0 ? m_colorList.add( c )
  289. : n ;
  290. }
  291. void CRTFBuilder::black()
  292. {
  293. m_attr.m_nColorFground = 0 ;
  294. }
  295. void CRTFBuilder::red()
  296. {
  297. m_attr.m_nColorFground = 1 ;
  298. }
  299. void CRTFBuilder::green()
  300. {
  301. m_attr.m_nColorFground = 2 ;
  302. }
  303. void CRTFBuilder::blue()
  304. {
  305. m_attr.m_nColorFground = 3 ;
  306. }
  307. void CRTFBuilder::size(int n)
  308. {
  309. m_attr.m_nFontSize = n ;
  310. }
  311. void CRTFBuilder::font( const CString& strFont)
  312. {
  313. int nCount =  0 ;
  314. for ( list<CString>::iterator i = m_fontList.begin( ) ; i != m_fontList.end( ) ; i++, nCount++ )
  315. {
  316. if ( (*i) == strFont )
  317. {
  318. m_attr.m_nFontNumber = nCount ;
  319. return ;
  320. }
  321. }
  322. //not there, lets add it
  323. m_fontList.add( strFont ) ;
  324. m_attr.m_nFontNumber = nCount ;
  325. }
  326. void CRTFBuilder::bold(bool b)
  327. {
  328. m_attr.m_bsBold= b ;
  329. }
  330. void CRTFBuilder::strike(bool b)
  331. {
  332. m_attr.m_bsStrike= b ;
  333. }
  334. void CRTFBuilder::italic(bool b)
  335. {
  336. m_attr.m_bsItalic = b ;
  337. }
  338. void CRTFBuilder::underline(bool b)
  339. {
  340. m_attr.m_bsUnderline = b ;
  341. }
  342. void CRTFBuilder::normal( )
  343. {
  344. bold(false);
  345. italic(false);
  346. underline(false);
  347. strike(false);
  348. }
  349. static 
  350. DWORD 
  351. CALLBACK 
  352. EditStreamCallBack( DWORD dwCookie, 
  353. LPBYTE pbBuff, 
  354. LONG cb, 
  355. LONG *pcb )
  356. {
  357. CString *pstr = (CString *)dwCookie;
  358. if( pstr->GetLength() < cb )
  359. {
  360. *pcb = pstr->GetLength();
  361. memcpy(pbBuff, (LPCSTR)*pstr, *pcb );
  362. pstr->Empty();
  363. }
  364. else
  365. {
  366. *pcb = cb;
  367. memcpy( pbBuff, 
  368. (LPCSTR)*pstr, 
  369. *pcb ) ;
  370. *pstr = pstr->Right( pstr->GetLength() - cb ) ;
  371. }
  372. return 0;
  373. }
  374. void
  375. CRTFBuilder::write( CRichEditCtrl& c )
  376. {
  377. m_string += '}';
  378. // CRtfStringDlg d( m_string ) ;
  379. EDITSTREAM es = {(DWORD)&m_string, 0, EditStreamCallBack };
  380. // richEd is the rich edit control
  381. c.StreamIn( SF_RTF | SFF_SELECTION, es);
  382. m_string.Empty( ) ;
  383. }
  384. CRTFBuilder&
  385. CRTFBuilder::operator+=( LPCTSTR p )
  386. {
  387. CString s( p ) , s2 ;
  388. for ( int i = 0 ; i < s.GetLength( ) ; i ++ )
  389. if ( s[i]=='n' )
  390. s2+= (CString)"rn" += "\par ";//\par " ;
  391. else
  392. s2+= s[i] ;
  393. m_string += (CString)
  394. "{\rtf1\ansi\ansicpg1252\deff0\deftab720" += 
  395. (CString)m_fontList +=
  396. (CString)m_colorList += 
  397. (CString)m_attr += 
  398. s2  ;
  399. return *this ;
  400. }
  401. CRTFBuilder&
  402. CRTFBuilder::operator << ( LPCTSTR p )
  403. {
  404. *this+=p ;
  405. return *this ;
  406. }
  407. CRTFBuilder&
  408. CRTFBuilder::operator << ( int n )
  409. {
  410. CString s ;
  411. s.Format( "%d", n ) ;
  412. *this += (LPCTSTR)s ;
  413. return *this ;
  414. }
  415. CRTFBuilder&
  416. CRTFBuilder::operator >> ( CRichEditCtrl& e )
  417. {
  418. write( e ) ;
  419. return *this ;
  420. }