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

RichEdit

开发平台:

Visual C++

  1. #ifndef RICHEDCTRLEX_INCLUDED
  2. #define RICHEDCTRLEX_INCLUDED
  3. #include <afx.h>
  4. #include <afxcmn.h>
  5. #include <atlbase.h>
  6. #include <list>
  7. #include <stack>
  8. using namespace std;
  9. #pragma  warning( disable : 4786 )
  10. #ifdef RICHED_IMPL
  11. #ifdef _AFXEXT
  12. #define RICHED_DECL __declspec( dllexport )
  13. #else 
  14. #define RICHED_DECL 
  15. #endif
  16. #else
  17. #ifdef _AFXEXT
  18. #define RICHED_DECL __declspec( dllimport )
  19. #else
  20. #define RICHED_DECL 
  21. #endif//_AFXEXT
  22. #endif //RICHED_IMPL
  23. class CBoolString
  24. {
  25. private:
  26. bool m_b ;
  27. CString m_strOn ;
  28. CString m_strOff ;
  29. public:
  30. CBoolString( CString strOn, CString strOff="" )
  31. {
  32. m_strOn = strOn ;
  33. m_strOff = strOff ;
  34. m_b = false ;
  35. }
  36. void operator=(bool b ) { m_b = b ; }
  37. operator CString( ) const
  38. { return m_b ? m_strOn : m_strOff; }
  39. };
  40. class CTextAttributes
  41. {
  42. protected:
  43. int m_nFontSize ;
  44. CBoolString
  45. m_bsBold ,
  46. m_bsUnderline ,
  47. m_bsItalic ,
  48. m_bsStrike ;
  49. int m_nFontNumber ,
  50. m_nColorFground ,
  51. m_nColorBground ;
  52. public:
  53. CTextAttributes( )
  54. : m_bsBold( "\b" ) ,
  55. m_bsUnderline( "\ul" ),
  56. m_bsItalic( "\i" ),
  57. m_bsStrike( "\strike" ) 
  58. {
  59. m_nColorBground = m_nColorFground = m_nFontNumber = m_nFontSize = 0 ;
  60. m_bsBold = false ;
  61. }
  62. operator CString( ) const
  63. {
  64. CString s ;
  65. s.Format("\plain%s%s%s%s\f%d\fs%d\cb%d\cf%d ",
  66. (CString)m_bsBold,
  67. (CString)m_bsUnderline,
  68. (CString)m_bsItalic,
  69. (CString)m_bsStrike,
  70. m_nFontNumber ,
  71. m_nFontSize ,
  72. m_nColorBground,
  73. m_nColorFground
  74. );
  75. return s ;
  76. }
  77. friend class CRTFBuilder ;
  78. };
  79. class CFontList
  80. : public list<CString>
  81. {
  82. public:
  83. operator CString( ) const
  84. CString s ;
  85. s= "{\fonttbl" ;
  86. int nCount = 0 ;
  87. for (iterator i = begin( ) ; i!=end( ) ; i++ )
  88. {
  89. CString s2 ;
  90. s2.Format("{\f%d %s;}", nCount++, (*i)  ) ;
  91. s+=s2 ;
  92. }
  93. s+='}' ;
  94. return s ;
  95. }
  96. void add( const CString& s )
  97. { push_back( s ) ; }
  98. };
  99. class CColorList
  100. : public list<COLORREF>
  101. {
  102. public:
  103. int add( COLORREF c )
  104. push_back ( c ) ; 
  105. return size( )-1 ;
  106. }
  107. int find( COLORREF c )
  108. {
  109. int n = 0 ;
  110. for ( iterator i = begin( ) ; i != end( ) ; i++,n++ )
  111. {
  112. COLORREF cComp( *i ) ;
  113. if ( cComp==c )
  114. return n ;
  115. }
  116. return -1 ;
  117. }
  118. operator CString( ) const
  119. {
  120. CString s("{\colortbl" ) ;
  121. for ( iterator i = begin( ) ; i != end( ) ; i++ )
  122. {
  123. COLORREF c( *i ) ;
  124. int r( ( c & 0x000000ff )  ) ,
  125. g( ( c >> 8 ) & 0x000000ff ) ,
  126. b( ( c >> 16 ) & 0x000000ff ) ;
  127. CString s2 ;
  128. s2.Format("\red%d\green%d\blue%d;", r,g,b ) ;
  129. s += s2 ;
  130. }
  131. s+='}' ;
  132. return s ;
  133. }
  134. };
  135. class CRTFBuilder ;
  136. class CStringManip ;
  137. class CIntManip ;
  138. typedef CRTFBuilder&( *RTFSM_PFUNC ) ( CRTFBuilder& ) ;
  139. typedef CRTFBuilder&( *RTFSM_STRINGPFUNC ) ( CRTFBuilder&, CString& )  ; 
  140. typedef CRTFBuilder&( *RTFSM_INTPFUNC ) ( CRTFBuilder&, int )  ;
  141. typedef CRTFBuilder&( *RTFSM_BOOLPFUNC ) ( CRTFBuilder&, bool)  ;
  142. typedef CRTFBuilder&( *RTFSM_CONTROLPFUNC ) ( CRTFBuilder&, CRichEditCtrl&)  ;
  143. class RICHED_DECL CManip
  144. {
  145. protected:
  146. CString m_strVal  ;
  147. int m_nVal ;
  148. LPVOID m_pFunc ;
  149. bool m_bVal ;
  150. public:
  151. virtual CRTFBuilder& go ( CRTFBuilder& ) = 0 ;
  152. CManip( )
  153. m_pFunc =  NULL ; 
  154. m_nVal = 0 ; 
  155. m_strVal = "" ; 
  156. }
  157. CManip( LPVOID p ,
  158. CString s )
  159. {
  160. m_pFunc = p ;
  161. m_strVal = s ;
  162. }
  163. CManip( LPVOID p ,
  164. int n )
  165. {
  166. m_pFunc = p ;
  167. m_nVal = n ;
  168. }
  169. CManip( LPVOID p,
  170. bool   b )
  171. {
  172. m_pFunc = p ;
  173. m_bVal = b ;
  174. }
  175. };
  176. class RICHED_DECL CStringManip
  177. : public CManip
  178. {
  179. public:
  180. CStringManip( RTFSM_STRINGPFUNC p, CString s="") : CManip ( ( LPVOID )p, s ) {};
  181. CRTFBuilder& go( CRTFBuilder& b )
  182. { return (  ( RTFSM_STRINGPFUNC ) m_pFunc) ( b,  m_strVal ) ; }
  183. };
  184. class RICHED_DECL CControlManip
  185. : public CManip
  186. {
  187. protected:
  188. CRichEditCtrl& m_control ;
  189. public:
  190. CControlManip( RTFSM_CONTROLPFUNC p,
  191. CRichEditCtrl& c ) : m_control( c ) , 
  192. CManip ( ( LPVOID )p, (CString)"" ) {};
  193. CRTFBuilder& go( CRTFBuilder& b )
  194. { return (( RTFSM_CONTROLPFUNC ) m_pFunc)( b,  m_control ) ; }
  195. };
  196. class RICHED_DECL CIntManip
  197. : public CManip
  198. {
  199. public:
  200. CIntManip( RTFSM_INTPFUNC p, int n = 0 ) : CManip ( ( LPVOID )p, n ) {};
  201. CRTFBuilder& go( CRTFBuilder& b )
  202. { return ( ( RTFSM_INTPFUNC ) m_pFunc )( b,  m_nVal ) ; }
  203. };
  204. class RICHED_DECL CBoolManip
  205. : public CManip
  206. {
  207. public:
  208. CBoolManip( RTFSM_BOOLPFUNC p, bool b ) : CManip ( ( LPVOID )p, b ) {};
  209. CRTFBuilder& go( CRTFBuilder& b )
  210. { return ( ( RTFSM_BOOLPFUNC ) m_pFunc )( b,  m_bVal ) ; }
  211. };
  212. class RICHED_DECL CRTFBuilder
  213. {
  214. protected:
  215. CString m_string ;
  216. CTextAttributes m_attr ;
  217. CFontList m_fontList ;
  218. CColorList m_colorList ;
  219. stack<CTextAttributes> m_attrStack ;
  220. public:
  221. void bold (bool b = true );
  222. void strike(bool b = true );
  223. void italic( bool b = true ) ;
  224. void underline( bool b = true ) ;
  225. void normal( ) ;
  226. void size (int n);
  227. void font ( const CString& i ) ;
  228. void black();
  229. void blue();
  230. void green();
  231. void red();
  232. void color( COLORREF ); 
  233. void backColor( COLORREF ); 
  234. void push( ) ;
  235. void pull( ) ;
  236. operator+=( CString& s ) ;
  237. CRTFBuilder();
  238. virtual ~CRTFBuilder();
  239. void addFont( const CString& s )
  240. { m_fontList.add( s ) ; }
  241. void addColor( COLORREF c )
  242. { m_colorList.add( c ) ; }
  243. CRTFBuilder& operator+=( LPCTSTR p ); 
  244. operator CString( ) const
  245. { return m_string ; }
  246. void write (CRichEditCtrl& ) ;
  247. int colorCount( ) const
  248. { return m_colorList.size( ) ; }
  249. public:
  250. // STREAM OPERATORS
  251. CRTFBuilder& operator << ( LPCTSTR ) ;
  252. CRTFBuilder& operator << ( int ) ;
  253. CRTFBuilder& operator >> ( CRichEditCtrl& ) ;
  254. friend RICHED_DECL CRTFBuilder& normal ( CRTFBuilder& ) ;
  255. friend RICHED_DECL CRTFBuilder& push ( CRTFBuilder& ) ;
  256. friend RICHED_DECL CRTFBuilder& pull ( CRTFBuilder& ) ;
  257. friend RICHED_DECL CRTFBuilder& black ( CRTFBuilder& ) ;
  258. friend RICHED_DECL CRTFBuilder& red ( CRTFBuilder& ) ;
  259. friend RICHED_DECL CRTFBuilder& green ( CRTFBuilder& ) ;
  260. friend RICHED_DECL CRTFBuilder& blue ( CRTFBuilder& ) ;
  261. friend RICHED_DECL CRTFBuilder& bold ( CRTFBuilder& ) ;
  262. friend RICHED_DECL CRTFBuilder& strike ( CRTFBuilder& ) ;
  263. friend RICHED_DECL CRTFBuilder& italic ( CRTFBuilder& ) ;
  264. friend RICHED_DECL CRTFBuilder& underline( CRTFBuilder& ) ;
  265. };
  266. RICHED_DECL CControlManip write ( CRichEditCtrl& ) ;
  267. RICHED_DECL CIntManip normal ( int=0 ) ;
  268. RICHED_DECL CIntManip push ( int=0 ) ;
  269. RICHED_DECL CIntManip pull ( int=0 ) ;
  270. RICHED_DECL CIntManip size ( int ) ;
  271. RICHED_DECL CIntManip color ( int ) ;
  272. RICHED_DECL CIntManip backColor ( int ) ;
  273. RICHED_DECL CIntManip addColor ( int ) ;
  274. RICHED_DECL CIntManip font ( int ) ;
  275. RICHED_DECL CStringManip font ( LPCTSTR ) ;
  276. RICHED_DECL CStringManip addFont ( LPCTSTR ) ;
  277. RICHED_DECL CBoolManip bold ( bool ) ;
  278. RICHED_DECL CBoolManip strike ( bool ) ;
  279. RICHED_DECL CBoolManip italic ( bool ) ;
  280. RICHED_DECL CBoolManip underline ( bool ) ;
  281. RICHED_DECL CRTFBuilder& operator << ( CRTFBuilder& , 
  282. RTFSM_PFUNC ) ;
  283. RICHED_DECL CRTFBuilder& operator << ( CRTFBuilder& , 
  284. CManip& m ) ;
  285. class RICHED_DECL CRichEditCtrlEx 
  286. : public CRichEditCtrl
  287. {
  288. // Construction
  289. public:
  290. CRichEditCtrlEx( );
  291. // Attributes
  292. public:
  293. // Operations
  294. public:
  295. void enable( bool b = true )
  296. { ModifyStyle( b ? WS_DISABLED : 0 , b ?  0 : WS_DISABLED, 0 ) ; }
  297. void disable( bool b = false )
  298. { enable( b ) ; }
  299. void readOnly( bool b = true )
  300. { SetReadOnly( b ) ; }
  301. void writable( bool b = true )
  302. { readOnly( !b ) ; }
  303. // Overrides
  304. // ClassWizard generated virtual function overrides
  305. //{{AFX_VIRTUAL(CRichEditCtrlEx)
  306. protected:
  307. virtual void PreSubclassWindow();
  308. //}}AFX_VIRTUAL
  309. // Implementation
  310. public:
  311. virtual ~CRichEditCtrlEx();
  312. // Generated message map functions
  313. protected:
  314. //{{AFX_MSG(CRichEditCtrlEx)
  315. //}}AFX_MSG
  316. DECLARE_MESSAGE_MAP()
  317. };
  318. /////////////////////////////////////////////////////////////////////////////
  319. //{{AFX_INSERT_LOCATION}}
  320. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  321. //}}AFX_INSERT_LOCATION}}
  322. #endif //RICHEDCTRLEX_INCLUDED