18af74909SZhong Yang #pragma once 28af74909SZhong Yang 38af74909SZhong Yang #include "../scintilla/include/SciLexer.h" 48af74909SZhong Yang #include "../scintilla/include/Scintilla.h" 50831e654SZhong Yang #include "ColorConvert.h" 68af74909SZhong Yang 78af74909SZhong Yang // CScintillaEditView 视图 88af74909SZhong Yang 98af74909SZhong Yang #define SCINTILLA_MARGIN_LINENUMBER 0 108af74909SZhong Yang #define MARGIN_FOLD_INDEX 1 118af74909SZhong Yang 128af74909SZhong Yang class CScintillaEditView : public CView 138af74909SZhong Yang { 148af74909SZhong Yang DECLARE_DYNCREATE(CScintillaEditView) 158af74909SZhong Yang 168af74909SZhong Yang protected: 178af74909SZhong Yang CScintillaEditView(); // 动态创建所使用的受保护的构造函数 188af74909SZhong Yang virtual ~CScintillaEditView(); 198af74909SZhong Yang 208af74909SZhong Yang public: 218af74909SZhong Yang struct KeepCurrentLine 228af74909SZhong Yang { KeepCurrentLineKeepCurrentLine238af74909SZhong Yang KeepCurrentLine(CScintillaEditView* view) 248af74909SZhong Yang : m_view(view) 258af74909SZhong Yang { 268af74909SZhong Yang //保存当前行 278af74909SZhong Yang current_line = m_view->GetFirstVisibleLine(); 288af74909SZhong Yang } ~KeepCurrentLineKeepCurrentLine298af74909SZhong Yang ~KeepCurrentLine() 308af74909SZhong Yang { 318af74909SZhong Yang //恢复当前行 328af74909SZhong Yang m_view->SetFirstVisibleLine(current_line); 338af74909SZhong Yang } 348af74909SZhong Yang 358af74909SZhong Yang CScintillaEditView* m_view{}; 368af74909SZhong Yang int current_line{}; 378af74909SZhong Yang }; 388af74909SZhong Yang 398af74909SZhong Yang virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 408af74909SZhong Yang #ifdef _DEBUG 418af74909SZhong Yang virtual void AssertValid() const; 428af74909SZhong Yang #ifndef _WIN32_WCE 438af74909SZhong Yang virtual void Dump(CDumpContext& dc) const; 448af74909SZhong Yang #endif 458af74909SZhong Yang #endif 468af74909SZhong Yang 47fa103b8dSZhong Yang void SetTextW(const wstring& text); 48fa103b8dSZhong Yang void GetTextW(wstring& text); 49fa103b8dSZhong Yang const wchar_t* GetTextW(int& size); //获取文本(返回字符串指针,需要自行释放内存) 50fa103b8dSZhong Yang const char* GetText(int& size); //获取UTF8格式文本(返回字符串指针,需要自行释放内存) 51fa103b8dSZhong Yang std::string GetText(int start, int end); 528af74909SZhong Yang void SetFontFace(const wchar_t* font_face); 538af74909SZhong Yang void SetFontSize(int font_size); 548af74909SZhong Yang void SetTabSize(int tab_size); 558af74909SZhong Yang void SetSel(int start, int end, const wstring& edit_str); //设置选中范围(位置以字符为单位) 568af74909SZhong Yang void GetSel(int& start, int& end); //获取选中范围(位置以字符为单位) 578af74909SZhong Yang void SetBackgroundColor(COLORREF color); 588af74909SZhong Yang void SetReadOnly(bool read_only); 598af74909SZhong Yang bool IsReadOnly(); 608af74909SZhong Yang 618af74909SZhong Yang void Undo(); 628af74909SZhong Yang void Redo(); 638af74909SZhong Yang void Cut(); 648af74909SZhong Yang void Copy(); 658af74909SZhong Yang void Paste(); 668af74909SZhong Yang void SelectAll(); 678af74909SZhong Yang void EmptyUndoBuffer(); //清空撤销缓存 688af74909SZhong Yang 698af74909SZhong Yang void SetWordWrap(bool word_wrap); 708af74909SZhong Yang 718af74909SZhong Yang bool IsEditChangeNotificationEnable(); 728af74909SZhong Yang 738af74909SZhong Yang bool CanUndo(); 748af74909SZhong Yang bool CanRedo(); 758af74909SZhong Yang bool CanPaste(); 768af74909SZhong Yang bool IsSelectionEmpty(); 778af74909SZhong Yang bool IsModified(); 788af74909SZhong Yang void SetSavePoint(); 798af74909SZhong Yang 808af74909SZhong Yang void SetLineNumberWidth(int width); 818af74909SZhong Yang void ShowLineNumber(bool show); 828af74909SZhong Yang void SetLineNumberColor(COLORREF color); 838af74909SZhong Yang 848af74909SZhong Yang int GetZoom(); 858af74909SZhong Yang void SetZoom(int zoom); 868af74909SZhong Yang 878af74909SZhong Yang enum eEolMode 888af74909SZhong Yang { 898af74909SZhong Yang EOL_CRLF, 908af74909SZhong Yang EOL_CR, 918af74909SZhong Yang EOL_LF 928af74909SZhong Yang }; 938af74909SZhong Yang void SetEolMode(eEolMode eolMode); 948af74909SZhong Yang eEolMode GetEolMode(); 958af74909SZhong Yang 968af74909SZhong Yang void ConvertEolMode(eEolMode eolMode); 978af74909SZhong Yang 988af74909SZhong Yang void SetViewEol(bool show); 998af74909SZhong Yang 1008af74909SZhong Yang int GetFirstVisibleLine(); 1018af74909SZhong Yang void SetFirstVisibleLine(int line); 1028af74909SZhong Yang 1038af74909SZhong Yang //语法解析 1048af74909SZhong Yang void SetLexer(int lexer); 1058af74909SZhong Yang void SetKeywords(int id, const char* keywords); 1068af74909SZhong Yang void SetSyntaxColor(int id, COLORREF color); 1078af74909SZhong Yang void SetSyntaxFontStyle(int id, bool bold, bool italic); 1088af74909SZhong Yang void SetLexerNormalText(); 1098af74909SZhong Yang 1108af74909SZhong Yang static eEolMode JudgeEolMode(const wstring& str); 1118af74909SZhong Yang static int CharactorPosToBytePos(int pos, const wchar_t* str, size_t size); //将字符的位置转换成字节的位置(使用UTF8编码) 1128af74909SZhong Yang static int BytePosToCharactorPos(int pos, const char* str, size_t size); //将字节的位置转换成字符的位置(使用UTF8编码) 1138af74909SZhong Yang 1148af74909SZhong Yang void SetContextMenu(CMenu* pMenu, CWnd* pMenuOwner); 1158af74909SZhong Yang 116fa103b8dSZhong Yang void GetLinePos(int line, int& start, int& end); //获取某一行的开始和结束位置 117fa103b8dSZhong Yang void GetCurLinePos(int& start, int& end); //获取当前行的开始和结束位置 118fa103b8dSZhong Yang 1190831e654SZhong Yang void SetLexerLyric(ColorTable theme_color); //设置LRC语法解析 12061ef93eeSZhong Yang 121fa103b8dSZhong Yang std::string GetCurrentLineText(); 122fa103b8dSZhong Yang std::wstring GetCurrentLineTextW(); 123fa103b8dSZhong Yang 1248af74909SZhong Yang private: 1258af74909SZhong Yang 1268af74909SZhong Yang private: 1278af74909SZhong Yang bool m_change_notification_enable = true; //如果为false,则不响应文本改变消息 1288af74909SZhong Yang int m_line_number_width = 36; 1298af74909SZhong Yang COLORREF m_line_number_color{}; 1308af74909SZhong Yang COLORREF m_background_color{ RGB(255,255,255) }; 1318af74909SZhong Yang 1328af74909SZhong Yang CMenu* m_pMenu{}; 1338af74909SZhong Yang CWnd* m_pContextMenuOwner{}; 1348af74909SZhong Yang 1358af74909SZhong Yang protected: 1368af74909SZhong Yang DECLARE_MESSAGE_MAP() 1378af74909SZhong Yang virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 1388af74909SZhong Yang public: 1398af74909SZhong Yang afx_msg void OnPaint(); 1408af74909SZhong Yang virtual void PreSubclassWindow(); 1418af74909SZhong Yang virtual void OnInitialUpdate(); 1428af74909SZhong Yang afx_msg void OnRButtonUp(UINT nFlags, CPoint point); 143*6060ad51Szhongyang219 protected: 144*6060ad51Szhongyang219 afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 1458af74909SZhong Yang }; 1468af74909SZhong Yang 1478af74909SZhong Yang 148