兩年多以前本人發布了一款語法編輯軟件LiteEdit,得到了很多朋友的支持,很多人要求我公布源代碼,經過我考慮再三決定公布其中的編輯控件PfxEditCtrl。這是一款全面支持中文的編輯控件,使用標准的MFC DOC/VIEW機制,使用比較簡單,但功能卻很強大。PfxEditCtrl由兩個主要的類組成,包括CPfxEditView和 CPfxEditDoc,這個控件主要支持如下功能:
文本編輯;
打印;
可通過語法配置文件定制的語法高亮顯示;
自動換行;
支持非等寬字體;
列塊選擇/復制/刪除/粘貼等列塊方式編輯操作;
支持UNICODE/UTF8/UNICODE BIG ENDIUM/ANSI文件的打開,編輯,轉換;
支持拆份成雙窗口並列編輯;
為了方便大家能快速上手,本人編寫了一示范程序。建立CPfxEditView的派生類:
class CMyEditView : public CPfxEditView
建立CPfxEditDoc的排生類:
{
DECLARE_DYNCREATE(CMyEditView)
protected:
CMyEditView(); // 動態創建所使用的受保護的構造函數
virtual ~CMyEditView();
public:
CMyEditDoc* GetDocument() const;
protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual BOOL OnSetupPrintInfo(CPfxEditPrintInfo* pPrintInfo);
protected:
DECLARE_MESSAGE_MAP()
}; class CMyEditDoc : public CPfxEditDoc
注冊文檔模板:
{
DECLARE_DYNCREATE(CMyEditDoc)
protected:
CMyEditDoc();
virtual ~CMyEditDoc();
public:
// 當前使用的語法配置信息是否與給定的相同。
BOOL IsCurFileTypeInfo(const CMyEditTypeInfo* pTypeInfo) const;
// 獲取當前使用的語法配置信息。
const CMyEditTypeInfo* GetFileTypeInfo() const;
// 指定本文檔使用哪種語法配置信息。
void SetFileTypeInfo(CMyEditTypeInfo* pTypeInfo);
protected:
virtual void SetModifiedFlag(BOOL bModified);
virtual LONG OnEvent(UINT nCode, LPARAM lParam);
virtual BOOL OnInitDocument(LPCTSTR pszPathName);
protected:
DECLARE_MESSAGE_MAP()
}; BOOL CApp::InitInstance()
{
// 注冊應用程序的文檔模板。文檔模板
// 將用作文檔、框架窗口和視圖之間的連接
CMultiDocTemplate* pTemplate = new CMultiDocTemplate(IDR_MYEDIT,
RUNTIME_CLASS(CMyEditDoc),
RUNTIME_CLASS(CMyEditFrame), // 自定義 MDI 子框架
RUNTIME_CLASS(CMyEditView));
if (pTemplate == NULL)
{
return false;
}
AddDocTemplate(pTemplate);
......
}
現在就可以使用CPfxEditCtrl的功能了......就這麼簡單,更使用平常的MFC DOC/VIEW沒有什麼兩樣,如圖所示:
結束語
很早以前當我想寫一個編輯控件的時候曾經參考過很多網上公布的語法編輯控件,我發覺這些控件編寫的質量不是那麼令人滿意,或者是不支持MBCS字符,或者是內存管理一團糟,又或者是架構不夠好和代碼寫得不怎麼樣,最後我決定自己動手寫一個,於是用了大約一年的時間來編寫了這個控件。現在我自己編寫的 LiteEdit 在功能上和性能上都可以和 EditPlus/UltraEdit 等有得拼。所以,我已經有兩三年沒有用 UltraEdit 和 EditPlus 了。隨著時間的推移,現在NT內核的系統已經占主流,而我由於工作等原因也沒有對 LiteEdit(PfxEditCtrl)進行更新,我計劃在有時間的時候編寫一個全新的 PfxEditCtrl2.0 版,基於 UNICODE 模式,有非常好的虛存管理功能,像 UltraEdit/emEditor 那樣只需要很少的內存便可以編輯超大文件。當然了今天的我和幾年前寫 PfxEditCtrl 的時候的水平肯定有很大不同了,使 LiteEdit 能夠打敗 UltraEdit 等著名的編輯軟件是我對這個小軟件一點期望,期待 LiteEdit2.0 版......
本文配套源碼