www.pudn.com > 200308141526117224仿MSN(网易泡泡)界面.rar > RichEditCtrlEx.h
#ifndef RICHEDCTRLEX_INCLUDED #define RICHEDCTRLEX_INCLUDED #include#include #include #include #include
using namespace std; #pragma warning( disable : 4786 ) #ifdef RICHED_IMPL #ifdef _AFXEXT #define RICHED_DECL __declspec( dllexport ) #else #define RICHED_DECL #endif #else #ifdef _AFXEXT #define RICHED_DECL __declspec( dllimport ) #else #define RICHED_DECL #endif//_AFXEXT #endif //RICHED_IMPL class CBoolString { private: bool m_b ; CString m_strOn ; CString m_strOff ; public: CBoolString( CString strOn, CString strOff="" ) { m_strOn = strOn ; m_strOff = strOff ; m_b = false ; } void operator=(bool b ) { m_b = b ; } operator CString( ) const { return m_b ? m_strOn : m_strOff; } }; class CTextAttributes { protected: int m_nFontSize ; CBoolString m_bsBold , m_bsUnderline , m_bsItalic , m_bsStrike ; int m_nFontNumber , m_nColorFground , m_nColorBground ; public: CTextAttributes( ) : m_bsBold( "\\b" ) , m_bsUnderline( "\\ul" ), m_bsItalic( "\\i" ), m_bsStrike( "\\strike" ) { m_nColorBground = m_nColorFground = m_nFontNumber = m_nFontSize = 0 ; m_bsBold = false ; } operator CString( ) const { CString s ; s.Format("\\plain%s%s%s%s\\f%d\\fs%d\\cb%d\\cf%d ", (CString)m_bsBold, (CString)m_bsUnderline, (CString)m_bsItalic, (CString)m_bsStrike, m_nFontNumber , m_nFontSize , m_nColorBground, m_nColorFground ); return s ; } friend class CRTFBuilder ; }; class CFontList : public list { public: operator CString( ) const { CString s ; s = "{\\fonttbl" ; int nCount = 0 ; for (const_iterator i = begin( ) ; i!=end() ; i++ ) { CString s2 ; s2.Format("{\\f%d %s;}", nCount++, (*i) ) ; s+=s2 ; } s+='}' ; return s ; } void add( const CString& s ) { push_back( s ) ; } }; class CColorList : public list { public: int add( COLORREF c ) { push_back ( c ) ; return size( )-1 ; } int find( COLORREF c ) { int n = 0 ; for ( iterator i = begin( ) ; i != end( ) ; i++,n++ ) { COLORREF cComp( *i ) ; if ( cComp==c ) return n ; } return -1 ; } operator CString( ) const { CString s("{\\colortbl" ) ; for ( const_iterator i = begin( ) ; i != end( ) ; i++ ) { COLORREF c( *i ) ; int r(( c & 0x000000ff ) ) , g(( c >> 8 ) & 0x000000ff ) , b(( c >> 16 ) & 0x000000ff ) ; CString s2 ; s2.Format("\\red%d\\green%d\\blue%d;", r,g,b ) ; s += s2 ; } s+='}' ; return s ; } }; class CRTFBuilder ; class CStringManip ; class CIntManip ; typedef CRTFBuilder&( *RTFSM_PFUNC ) (CRTFBuilder& ) ; typedef CRTFBuilder&( *RTFSM_STRINGPFUNC) (CRTFBuilder&, CString& ) ; typedef CRTFBuilder&( *RTFSM_INTPFUNC ) (CRTFBuilder&, int ) ; typedef CRTFBuilder&( *RTFSM_BOOLPFUNC ) (CRTFBuilder&, bool) ; typedef CRTFBuilder&( *RTFSM_CONTROLPFUNC) (CRTFBuilder&, CRichEditCtrl&) ; class RICHED_DECL CManip { protected: CString m_strVal ; int m_nVal ; LPVOID m_pFunc ; bool m_bVal ; public: virtual CRTFBuilder& go ( CRTFBuilder& ) = 0 ; CManip( ) { m_pFunc = NULL ; m_nVal = 0 ; m_strVal = "" ; } CManip( LPVOID p ,CString s ) { m_pFunc = p ; m_strVal = s ; } CManip( LPVOID p ,int n ) { m_pFunc = p ; m_nVal = n ; } CManip( LPVOID p,bool b ) { m_pFunc = p ; m_bVal = b ; } }; class RICHED_DECL CStringManip: public CManip { public: CStringManip( RTFSM_STRINGPFUNC p, CString s="") : CManip ( ( LPVOID )p, s ) {}; CRTFBuilder& go( CRTFBuilder& b ) { return ( ( RTFSM_STRINGPFUNC ) m_pFunc) (b,m_strVal ) ; } }; class RICHED_DECL CControlManip: public CManip { protected: CRichEditCtrl& m_control ; public: CControlManip(RTFSM_CONTROLPFUNC p,CRichEditCtrl& c ) : m_control( c ) ,CManip ( ( LPVOID )p, (CString)"" ) {}; CRTFBuilder& go( CRTFBuilder& b ) { return (( RTFSM_CONTROLPFUNC ) m_pFunc)(b,m_control ) ; } }; class RICHED_DECL CIntManip: public CManip { public: CIntManip(RTFSM_INTPFUNC p,int n = 0 ) : CManip ( ( LPVOID )p, n ) {}; CRTFBuilder& go( CRTFBuilder& b ) { return ( ( RTFSM_INTPFUNC ) m_pFunc )(b,m_nVal ) ; } }; class RICHED_DECL CBoolManip: public CManip { public: CBoolManip(RTFSM_BOOLPFUNC p,bool b ) : CManip ( ( LPVOID )p, b ) {}; CRTFBuilder& go( CRTFBuilder& b ) { return ( ( RTFSM_BOOLPFUNC) m_pFunc )(b,m_bVal ) ; } }; class RICHED_DECL CRTFBuilder { protected: CString m_string ; CTextAttributes m_attr ; CFontList m_fontList ; CColorList m_colorList ; stack m_attrStack ; public: void bold (bool b = true ); void strike(bool b = true ); void italic(bool b = true ) ; void underline(bool b = true ) ; void normal( ) ; void size (int n); void font ( const CString& i ) ; void black(); void blue(); void green(); void red(); void color( COLORREF ); void backColor( COLORREF ); void push( ) ; void pull( ) ; operator+=( CString& s ) ; CRTFBuilder(); virtual ~CRTFBuilder(); void addFont( const CString& s ) { m_fontList.add( s ) ; } void addColor( COLORREF c ) { m_colorList.add( c ) ; } CRTFBuilder& operator+=( LPCTSTR p ); operator CString( ) const { return m_string ; } void write (CRichEditCtrl& ) ; int colorCount( ) const { return m_colorList.size( ) ; } public: // STREAM OPERATORS CRTFBuilder& operator << ( LPCTSTR ) ; CRTFBuilder& operator << ( int ) ; CRTFBuilder& operator >> ( CRichEditCtrl& ) ; friend RICHED_DECL CRTFBuilder& normal ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& push ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& pull ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& black ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& red ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& green ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& blue ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& bold ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& strike ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& italic ( CRTFBuilder& ) ; friend RICHED_DECL CRTFBuilder& underline( CRTFBuilder& ) ; }; RICHED_DECL CControlManip write ( CRichEditCtrl& ) ; RICHED_DECL CIntManip normal ( int=0 ) ; RICHED_DECL CIntManip push ( int=0 ) ; RICHED_DECL CIntManip pull ( int=0 ) ; RICHED_DECL CIntManip size ( int ) ; RICHED_DECL CIntManip color ( int ) ; RICHED_DECL CIntManip backColor ( int ) ; RICHED_DECL CIntManip addColor ( int ) ; RICHED_DECL CIntManip font ( int ) ; RICHED_DECL CStringManip font ( LPCTSTR ) ; RICHED_DECL CStringManip addFont ( LPCTSTR ) ; RICHED_DECL CBoolManip bold ( bool ) ; RICHED_DECL CBoolManip strike ( bool ) ; RICHED_DECL CBoolManip italic ( bool ) ; RICHED_DECL CBoolManip underline ( bool ) ; RICHED_DECL CRTFBuilder& operator << (CRTFBuilder& , RTFSM_PFUNC ) ; RICHED_DECL CRTFBuilder& operator << (CRTFBuilder& , CManip& m ) ; class _AFX_RICHEDITEX_STATE { public: _AFX_RICHEDITEX_STATE() ; virtual ~_AFX_RICHEDITEX_STATE() ; public: HINSTANCE m_hInstRichEdit20 ; } ; BOOL PASCAL AfxInitRichEditEx() ; #define NR_EMOTIONS 50 class RICHED_DECL CRichEditCtrlEx : public CRichEditCtrl { // Construction public: CRichEditCtrlEx( ); // Attributes public: static LPCTSTR Emotions[]; // Operations public: virtual BOOL AutoURLDetect( BOOL in_fEnable ) ; void SetText(LPCTSTR text); CString GetText(CString &text); void InsertText(LPCTSTR text); void InsertEmotion(int i); void Enable( bool b = true ) { ModifyStyle( b ? WS_DISABLED : 0 , b ? 0 : WS_DISABLED, 0 ) ; } void Disable( bool b = false ) { Enable( b ) ; } void ReadOnly( bool b = true ) { SetReadOnly( b ) ; } void Writable( bool b = true ) { ReadOnly( !b ) ; } // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CRichEditCtrlEx) public: virtual BOOL Create( DWORD in_dwStyle, const RECT& in_rcRect, CWnd* in_pParentWnd, UINT in_nID ) ; protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL // Implementation public: virtual ~CRichEditCtrlEx(); // Generated message map functions protected: static int FindEmotion(const char *str); //{{AFX_MSG(CRichEditCtrlEx) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; inline BOOL CRichEditCtrlEx::AutoURLDetect( BOOL in_fEnable ) { ASSERT(::IsWindow( m_hWnd ) ) ; return ( BOOL )::SendMessage( m_hWnd, EM_AUTOURLDETECT, in_fEnable, 0 ) ; } ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. //}}AFX_INSERT_LOCATION}} #endif //RICHEDCTRLEX_INCLUDED