1*8af74909SZhong Yang #pragma once 2*8af74909SZhong Yang 3*8af74909SZhong Yang #include "../scintilla/include/SciLexer.h" 4*8af74909SZhong Yang #include "../scintilla/include/Scintilla.h" 5*8af74909SZhong Yang 6*8af74909SZhong Yang // CScintillaEditView 视图 7*8af74909SZhong Yang 8*8af74909SZhong Yang #define SCINTILLA_MARGIN_LINENUMBER 0 9*8af74909SZhong Yang #define MARGIN_FOLD_INDEX 1 10*8af74909SZhong Yang 11*8af74909SZhong Yang class CScintillaEditView : public CView 12*8af74909SZhong Yang { 13*8af74909SZhong Yang DECLARE_DYNCREATE(CScintillaEditView) 14*8af74909SZhong Yang 15*8af74909SZhong Yang protected: 16*8af74909SZhong Yang CScintillaEditView(); // 动态创建所使用的受保护的构造函数 17*8af74909SZhong Yang virtual ~CScintillaEditView(); 18*8af74909SZhong Yang 19*8af74909SZhong Yang public: 20*8af74909SZhong Yang struct KeepCurrentLine 21*8af74909SZhong Yang { 22*8af74909SZhong Yang KeepCurrentLine(CScintillaEditView* view) 23*8af74909SZhong Yang : m_view(view) 24*8af74909SZhong Yang { 25*8af74909SZhong Yang //保存当前行 26*8af74909SZhong Yang current_line = m_view->GetFirstVisibleLine(); 27*8af74909SZhong Yang } 28*8af74909SZhong Yang ~KeepCurrentLine() 29*8af74909SZhong Yang { 30*8af74909SZhong Yang //恢复当前行 31*8af74909SZhong Yang m_view->SetFirstVisibleLine(current_line); 32*8af74909SZhong Yang } 33*8af74909SZhong Yang 34*8af74909SZhong Yang CScintillaEditView* m_view{}; 35*8af74909SZhong Yang int current_line{}; 36*8af74909SZhong Yang }; 37*8af74909SZhong Yang 38*8af74909SZhong Yang virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 39*8af74909SZhong Yang #ifdef _DEBUG 40*8af74909SZhong Yang virtual void AssertValid() const; 41*8af74909SZhong Yang #ifndef _WIN32_WCE 42*8af74909SZhong Yang virtual void Dump(CDumpContext& dc) const; 43*8af74909SZhong Yang #endif 44*8af74909SZhong Yang #endif 45*8af74909SZhong Yang 46*8af74909SZhong Yang void SetText(const wstring& text); 47*8af74909SZhong Yang void GetText(wstring& text); 48*8af74909SZhong Yang const wchar_t* GetText(int& size); //获取文本(返回字符串指针,需要自行释放内存) 49*8af74909SZhong Yang const char* GetTextUtf8(int& size); //获取UTF8格式文本(返回字符串指针,需要自行释放内存) 50*8af74909SZhong Yang void SetFontFace(const wchar_t* font_face); 51*8af74909SZhong Yang void SetFontSize(int font_size); 52*8af74909SZhong Yang void SetTabSize(int tab_size); 53*8af74909SZhong Yang void SetSel(int start, int end, const wstring& edit_str); //设置选中范围(位置以字符为单位) 54*8af74909SZhong Yang void GetSel(int& start, int& end); //获取选中范围(位置以字符为单位) 55*8af74909SZhong Yang void SetBackgroundColor(COLORREF color); 56*8af74909SZhong Yang void SetReadOnly(bool read_only); 57*8af74909SZhong Yang bool IsReadOnly(); 58*8af74909SZhong Yang 59*8af74909SZhong Yang void Undo(); 60*8af74909SZhong Yang void Redo(); 61*8af74909SZhong Yang void Cut(); 62*8af74909SZhong Yang void Copy(); 63*8af74909SZhong Yang void Paste(); 64*8af74909SZhong Yang void SelectAll(); 65*8af74909SZhong Yang void EmptyUndoBuffer(); //清空撤销缓存 66*8af74909SZhong Yang 67*8af74909SZhong Yang void SetWordWrap(bool word_wrap); 68*8af74909SZhong Yang 69*8af74909SZhong Yang bool IsEditChangeNotificationEnable(); 70*8af74909SZhong Yang 71*8af74909SZhong Yang bool CanUndo(); 72*8af74909SZhong Yang bool CanRedo(); 73*8af74909SZhong Yang bool CanPaste(); 74*8af74909SZhong Yang bool IsSelectionEmpty(); 75*8af74909SZhong Yang bool IsModified(); 76*8af74909SZhong Yang void SetSavePoint(); 77*8af74909SZhong Yang 78*8af74909SZhong Yang void SetLineNumberWidth(int width); 79*8af74909SZhong Yang void ShowLineNumber(bool show); 80*8af74909SZhong Yang void SetLineNumberColor(COLORREF color); 81*8af74909SZhong Yang 82*8af74909SZhong Yang int GetZoom(); 83*8af74909SZhong Yang void SetZoom(int zoom); 84*8af74909SZhong Yang 85*8af74909SZhong Yang enum eEolMode 86*8af74909SZhong Yang { 87*8af74909SZhong Yang EOL_CRLF, 88*8af74909SZhong Yang EOL_CR, 89*8af74909SZhong Yang EOL_LF 90*8af74909SZhong Yang }; 91*8af74909SZhong Yang void SetEolMode(eEolMode eolMode); 92*8af74909SZhong Yang eEolMode GetEolMode(); 93*8af74909SZhong Yang 94*8af74909SZhong Yang void ConvertEolMode(eEolMode eolMode); 95*8af74909SZhong Yang 96*8af74909SZhong Yang void SetViewEol(bool show); 97*8af74909SZhong Yang 98*8af74909SZhong Yang int GetFirstVisibleLine(); 99*8af74909SZhong Yang void SetFirstVisibleLine(int line); 100*8af74909SZhong Yang 101*8af74909SZhong Yang //语法解析 102*8af74909SZhong Yang void SetLexer(int lexer); 103*8af74909SZhong Yang void SetKeywords(int id, const char* keywords); 104*8af74909SZhong Yang void SetSyntaxColor(int id, COLORREF color); 105*8af74909SZhong Yang void SetSyntaxFontStyle(int id, bool bold, bool italic); 106*8af74909SZhong Yang void SetLexerNormalText(); 107*8af74909SZhong Yang 108*8af74909SZhong Yang static eEolMode JudgeEolMode(const wstring& str); 109*8af74909SZhong Yang static int CharactorPosToBytePos(int pos, const wchar_t* str, size_t size); //将字符的位置转换成字节的位置(使用UTF8编码) 110*8af74909SZhong Yang static int BytePosToCharactorPos(int pos, const char* str, size_t size); //将字节的位置转换成字符的位置(使用UTF8编码) 111*8af74909SZhong Yang 112*8af74909SZhong Yang void SetContextMenu(CMenu* pMenu, CWnd* pMenuOwner); 113*8af74909SZhong Yang 114*8af74909SZhong Yang private: 115*8af74909SZhong Yang 116*8af74909SZhong Yang private: 117*8af74909SZhong Yang bool m_change_notification_enable = true; //如果为false,则不响应文本改变消息 118*8af74909SZhong Yang int m_line_number_width = 36; 119*8af74909SZhong Yang COLORREF m_line_number_color{}; 120*8af74909SZhong Yang COLORREF m_background_color{ RGB(255,255,255) }; 121*8af74909SZhong Yang 122*8af74909SZhong Yang CMenu* m_pMenu{}; 123*8af74909SZhong Yang CWnd* m_pContextMenuOwner{}; 124*8af74909SZhong Yang 125*8af74909SZhong Yang protected: 126*8af74909SZhong Yang DECLARE_MESSAGE_MAP() 127*8af74909SZhong Yang virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 128*8af74909SZhong Yang public: 129*8af74909SZhong Yang afx_msg void OnPaint(); 130*8af74909SZhong Yang virtual void PreSubclassWindow(); 131*8af74909SZhong Yang virtual void OnInitialUpdate(); 132*8af74909SZhong Yang afx_msg void OnRButtonUp(UINT nFlags, CPoint point); 133*8af74909SZhong Yang }; 134*8af74909SZhong Yang 135*8af74909SZhong Yang 136