程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用VC++設計語法編輯器

用VC++設計語法編輯器

編輯:關於VC++

語法編輯器是一個可以對程序設計語言進行語法編輯的文本編輯器,它對程序設計語言進行語法關鍵字進行加亮處理,如注釋行、字符串、語法關鍵字、數字等,這樣使得源程序更容易閱讀,VB、VC++、DELPHI 等開發環境都提供了語法編輯功能,相信開發人員都會有切身的體會。

本文將講述如何用VC++設計一個語法編輯器,因為源程序較長,本文並不打算列出詳盡的代碼,而是指出語法編輯器的設計思路,在本文最後附有一個演示程序的下載網址,感興趣的朋友可以下載試用。

設計語法編輯器有多種方法,筆者准備用最簡單的方法實現這一功能。我們知道Windows提供了Rich Edit控制,這是一個強大的編輯器,Windows的寫字板用的就是這一控制。從它著手,我們不僅可以設計出語法編輯器,還可同時獲得它強大的編輯能力。Rich Edit 的支持文件是riched20.dll這個動態鏈接庫,它的MFC接口是 CRichEditCtrl,其對應的視類是 CRichEditView。CRichEditView 提供了一個 SetCharFormat 方法,可能在設計時首先考慮的就是如何利用它進行設計,但是根據筆者的試驗,用這個方法效率很差,特別是對 C++ 這種有多行注釋的語言。我們將換一個思路,為了更好的理解本文計述的設計思路,我們先來做一個試驗:

先用VC++生成一個單文檔工程,假設其名為MyProject,在工程向導的最後一步即第六步,將視類的基類從 CView 改為 CRichEditView。生成工程後,我們用工程向導添加工程視類 CMyProjectView的 WM_PAINT 消息處理函數,但是在該函數中不添加任何代碼,也就是什麼也不做。現在編譯執行,我們看到的是一個感覺設計拙劣的編輯器,它的內容窗口顯示的內容完全不對,當然這很自然,因為我們在 OnPaint 中什麼也沒有做,所以它並不重繪窗口。我們從其它地方復制一段文本,將它粘貼到這個拙劣的編輯器中,似乎沒有反應?現在拖動鼠標,你將看到有黑色選擇區域出現,感悟到什麼沒有?是的,這個拙劣的編輯器中好象有文本存在,雖然我們不知道究竟是什麼文本!做進一步的試驗,試著用 CRichEditCtrl 的 GetLine 方法去取窗口中的文本,你將得到剛才那些看不到的文本!然後我們就可以在同樣的位置繪出這些文本,Rich Edit將恢復它的本來面貌!如果我們對取得的這些文本進行分析,將特定的文本用特定的顏色繪出,這不就是夢想中的語法編輯器嗎?

為了讓編輯器的內容顯示正常,必須使文本的繪制與編輯器的默認行為精確的一致,這要求繪出的文本要與編輯器本身的文本位置相同,否則會出現文本錯位的錯誤。這需要注意兩個問題:

一、因為Rich Edit是精確精滾動的,也就它的第一行可能只顯示出一半來,所以必須計算好第一行的top位置;

二、Rich Edit的TAB字符的問題,TAB代表的寬度不是一成不變的,而是根據字符數不斷調整的。在寫字板中輸入文本,你可以觀察到這一情況。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved