精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

自己動手開發最好的代碼編輯器

開發 前端
這一年來我花了很多的時間在寫一個代碼編輯器。大部分時間都是在實現各種各樣的功能,其中也遇到了不少的問題。現在把實現這個編輯控件的一些問題的解決方法寫出來,以供參考。

這一年來我花了很多的時間在寫一個代碼編輯器。大部分時間都是在實現各種各樣的功能,其中也遇到了不少的問題。現在把實現這個編輯控件的一些問題的解決方法寫出來,以供參考。這里說明下,我用的是MFC,當然了,沒有用現成的控件,而是直接從CWnd繼承來實現自己的編輯控件。

先給大家弄個效果圖吧,你可以在這里CuteC Editor下載,歡迎大家提出意見。

 

 

問題1:如何讓控件接受所有的按鍵和漢字。

問題2:如何計算光標的位置。

問題3:如何存儲編輯控件的文本內容。

問題4:如何實現關鍵字高亮。

問題5:如何實現自動換行。

問題6:如何解析腳本。呵呵,我自己寫了個C語言解釋器,那它來用還是很不錯的。

一. 如何讓控件接受所有的按鍵和漢字。

讓CWnd接收所有的按鍵做法很簡單,只需響應WM_GETDLGCODE,代碼如下:

  1. afx_msg UINT OnGetDlgCode();  
  2.       ...  
  3.       ON_WM_GETDLGCODE()  
  4.       ...  
  5.       UINT CLEditWnd::OnGetDlgCode(){  
  6.           return DLGC_WANTALLKEYS;  
  7.       } 

接收漢字就比較麻煩了,必須響應WM_IME_CHAR消息。我得做法如下,不知有沒有更簡單的方法。

1. 重新設置窗體的WND_PROC函數。在這個函數中獲取WM_IME_CHAR消息,并通過自定義消費返回我們的CWnd窗體。

  1. WNDPROC LEditWndProcOld;  
  2.      LRESULT LEditWndProcNew(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){  
  3.          CWnd *pWnd = CWnd::FromHandlePermanent( hWnd );  
  4.          if(uMsg==WM_IME_CHAR){    
  5.              pWnd->PostMessage(WM_LEDIT_ZW, wParam, lParam );  
  6.              return   0;  
  7.          }  
  8.          return CallWindowProc( LEditWndProcOld, hWnd, uMsg, wParam, lParam);  
  9.      }  
  10.      ...  
  11.      void CLEditWnd::PreSubclassWindow(){  
  12.          LEditWndProcOld = (WNDPROC)SetWindowLong(this->GetSafeHwnd(), GWL_WNDPROC,  (LONG)LEditWndProcNew);   
  13.          CWnd::PreSubclassWindow();  
  14.      } 

2.響應WM_LEDIT_ZW自定義消息,獲取漢字內容。

在PreSubclassWindow設置了LEditWndProcNew回調函數,并把返回值賦給LEditWndProcOld。而在LEditWndProcNew函數中,把WM_IME_CHAR消息通過自定義消費WM_LEDIT_ZW發回CLEditWnd窗體。漢字就保存在wParam參數中。可以這樣獲得: char hz[3] = { wParam>>8, wParam, 0 };

二. 如何計算光標的位置。

這個問題看似簡單,但其實在程序的開發過程中是最難調試的。首先我們要明確以下問題:

1. 知道光標所在的行的位置,要計算出他在界面中的像素位置。

2. 知道鼠標點擊的位置,要把它轉化成字符串中所對應的位置。

Windows提供GetTextExtent來計算字符串顯示的寬度。我們知道調用這個函數就可以解決上述的問題了。但是當你這么去做的是后,你才知道效率有多低,當你在選擇內容移動鼠標時,要及時的計算光標的位置,你就知道效率跟不上了。想了很久,終于想出了個辦法:

在創建好控件后,首先調用GetTextExtent來計算所有英文字符和漢字的寬度,接下來我們就不直接調用GetTextExtent這個函數了。而是直接根據已經算到的字符寬度來計算字符串的寬度。效率得到大大的提高。我這里給出了我的相關代碼。

  1. char data[2];  
  2.        m_cText.nCharWidth[0] = 0;  
  3.        for( i=1; i<256; i++ ){  
  4.            data[0] = i;  
  5.            data[1] = 0;  
  6.            m_cText.nCharWidth[i] = (unsigned char)pDC->GetTextExtent( data ).cx;  
  7.        } 

nCharWidth數組中的信息足以計算任何字符串的顯示寬度。唯一不足的是在更換字體的時候,我們必須跟換這個數組的內容。

三(1). 如何存儲編輯控件的文本內容

在打開文件,編輯文檔時,我們必須在內存中存儲這個文檔的最新內容,并且實時的更新到界面上。在MFC上,沒有什么比CStringArray更合適的了,雖然有人說CStringArray會內存泄露,但我測試下來沒發現這個問題,總覺得是說這話的人自己的代碼沒寫好造成的。CStringArray在很多行數據的數據估計插入的效率不高,但對于打文件的處理,我們分開來處理的。CStringArray提供了數組和字符串的功能,所以對字符串的操作就方便多了。唯一的不足是,我們必須預先處理文件,把文件的每行保存到CStringArray中。在大文件的讀取中,這會浪費一定的時間。

三(2). 另一個重要的問題就是大文件的處理。對于大文件,我做了特殊的處理。

1. 采用內存映射文件掃描整個文件,提取出行信息。

2. 采用分塊處理來操作整個文件,使控件中保存的數據僅僅是文件的一個塊。

3. 當大文件被修改,當塊被切換時,這個塊數據必須保存在內存中,或者必須保存到另一個中間文件。而對于沒有被修改的塊,則不需做任何處理。

4. 在保存大文件時,必須根據每塊的信息重新寫入文件。

  1. * Block 01  
  2.     * Block 02  
  3.     * Block 03  
  4.     * ...  
  5.     * Block n 

每個Block我們必須保存它相關的信息。我定義了一個類,聲明如下:

  1. class CBlockNode  
  2.          {  
  3.          public:  
  4.              CBlockNode();  
  5.              ~CBlockNode();  
  6.          public:  
  7.              __int64 lBlkBegin;        //塊開始位置,在文件中的開始位置  
  8.              LONG lBlkSize;            //塊大小  
  9.              LONG lLineTop;            //開始行  
  10.              LONG lLineLow;            //結束行  
  11.              CString sLeftString;      //該塊的剩余行, 應為連個塊之間的分割處,有可能會把一行分隔開,這里保存最后一行的前半部分。  
  12.                               //必須做特殊的處理,以保證兩塊的分割處就是換行符。則可以保證改字段為空。  
  13.              char *pDirtyCtx;          //臟數據,用來保存被修改過的塊數據,如果為NULL,則表示該塊沒被修改過。  
  14.          public:  
  15.              CBlockNode & operator = ( CBlockNode &src );  
  16.          };  

四. 如何實現關鍵字高亮。

1. 關鍵字怎么保存在配置文件中每個人有每個人的做法。關鍵問題在于如何快速的查找字符串中存在這個關鍵字。

2. 當關鍵字很多的時候,查找的效率就有講究了。

3. 如何在內存中保持信息,在界面中顯示。

我們倒過來講:

3. 首先在界面上顯示一行文字很簡單,調用TextOut就可以了。最好不要用DrawText,效率比TextOut低很多。

為了對每行顯示的時候提供顏色信息,在內存中必須保持一個足夠長的數組,來保持每個字符對應的顏色。而在顯示的時候,一個一個字符先SetTextColor再TextOut就可了。然而這樣效率不是很高,好的辦法是,對相同的顏色的詞一次性的重繪出來,盡量減少TextOut的調用。所以我又加了一個數組保存了每個關鍵字的長度。

這里有個問題,不能為穩定的每行都保存這樣的數組,不然內存空間占用會很大。而是在繪制行的

2. 關鍵字很多的時候,我們必須對每個詞一一去判斷該詞是否在關鍵字中。所以hash表是比較合適的選擇了。這里不多講。

1. 要提取出一個字符串中的詞,然后根據詞再去判斷是否是關鍵字。所以就涉及到字符串的斷詞功能。例如一個字符串:

  1.  This is a test line string , 哈哈 :).  
  2.     我們必須提取出:  
  3.            This  
  4.      -  
  5.      is  
  6.      -  
  7.      a  
  8.      -  
  9.      line  
  10.      -  
  11.      string  
  12.      -  
  13.      ,  
  14.      -  
  15.      哈哈  
  16.      :  
  17.      )  
  18.      . 

其中 - 表示空格。然后再到關鍵字表中匹配,判斷該詞是否是關鍵字。如果是關鍵字,修改顏色數組的顏色信息,供界面使用。

五. 如何實現自動換行。

在顯示行的時候,我們不是直接那保存在內存的行數據就直接TextOut出來,而是要經過幾個步驟來處理改行數據。

1. 處理Tab鍵(0x09),當我們碰到0x09時,必須將它替換成空格,當然沒個Tab在不同的位置用不同的空格補全,保證補全后能被TAB_LEN整除。這樣就能得到去除TAB后的字符串。

2. 統計第1步得到的字符串,自動換行后,將每行保存為CStringArray,然后在界面中顯示。

3. 添加自動換行功能,對光標的計算會有影響,所以在將界面像素點轉成光標位置時,必須要統計當前界面的每行的子行數(自動換行后所得的行數)。然后才能確定在第幾行。所以計算起來比較麻煩。

原文:http://www.cnblogs.com/linxr/archive/2011/10/30/2229256.html

【編輯推薦】

  1. 10個免費的PHP編輯器/開發工具推薦
  2. Web設計師必備:10款最佳免費CSS在線編輯器
  3. 推薦 15 款很棒的文本編輯器
  4. 云計算愛好者必備的5個在線代碼編輯器
  5. 10個自由豐富的jQuery或JavaScript編輯器
責任編輯:陳貽新 來源: Linxr's space
相關推薦

2015-04-24 10:54:58

JavaScript開發工具代碼編輯器

2012-08-01 09:34:51

代碼編輯器開發代碼

2014-06-25 09:15:33

JavaScript 編輯器

2012-07-27 11:38:30

開發人員

2013-08-26 14:58:35

開發工具代碼

2022-11-25 12:25:27

Python代碼編輯器

2023-03-17 10:03:51

服務器編輯器vscode

2020-04-09 14:23:44

PythonMarkdown編輯器

2014-11-10 15:12:46

2012-12-28 10:10:18

2009-06-11 10:03:57

NetBeans代碼

2022-12-02 07:24:46

2011-08-25 09:30:22

2020-07-15 15:12:17

Python代碼編輯器編程語言

2021-01-21 16:03:15

Java文本編輯器編程語言

2015-02-12 09:51:24

代碼編輯

2021-03-10 09:15:15

代碼文本編輯器編程

2022-03-03 20:57:53

代碼編輯器VS code

2011-11-17 14:17:09

IDE

2011-01-10 16:17:49

點贊
收藏

51CTO技術棧公眾號

亚洲色图狠狠干| 免费视频一二三区| 久久婷婷五月综合色丁香| 自拍偷拍国产精品| 国产精品果冻传媒潘| 在线天堂中文字幕| 999精品一区| 亚洲精品成人久久| 国产区二区三区| 色呦呦久久久| 欧美高清一级片在线观看| 亚洲综合精品一区二区| av片免费观看| 欧美天天视频| 正在播放欧美视频| 亚洲精品乱码久久久久久蜜桃图片| 桃花岛tv亚洲品质| 一区二区不卡在线视频 午夜欧美不卡在| 成人免费看片网站| 中文字幕一级片| 国产欧美不卡| 欧美超级免费视 在线| 久久精品国产亚洲av久| 51vv免费精品视频一区二区| 欧美曰成人黄网| 九色自拍视频在线观看| 黄色网页在线播放| 国产午夜精品理论片a级大结局| 99一区二区| 一二三四区视频| 日韩精品免费专区| 97国产精品人人爽人人做| 日韩成人毛片视频| 日韩电影一区| 在线视频精品一| 黄色免费视频网站| 视频一区日韩精品| 91麻豆精品国产91久久久久 | 动漫av在线免费观看| 国产精品第一| 91久久国产综合久久| 波多野结衣家庭教师在线| 久草在线视频网站| 亚洲人成小说网站色在线| 亚洲成人网上| www.国产精品.com| 国产欧美在线观看一区| 欧美伦理一区二区| 日本福利在线观看| 91亚洲国产成人精品一区二三 | 亚洲人一二三区| 26uuu成人| 韩国中文字幕在线| 中文字幕制服丝袜成人av| 亚洲一二三区精品| 欧洲日本在线| 亚洲免费观看在线视频| 欧美三级午夜理伦三级老人| 国产在线1区| 亚洲美女区一区| 无码人妻精品一区二区蜜桃百度| 国产美女av在线| 亚洲精品日产精品乱码不卡| 麻豆映画在线观看| 欧美人与牲禽动交com| 亚洲午夜久久久久久久久电影院| 日韩美女爱爱视频| 国产精品一二三产区| 欧美日韩中文字幕在线| 精品久久久久久无码国产| jizz亚洲女人高潮大叫| 制服丝袜日韩国产| 亚洲精品乱码久久久久久9色| 91午夜精品| 日韩av综合网站| 欧美做受xxxxxⅹ性视频| 清纯唯美亚洲综合一区| 久久综合亚洲社区| 久久久91视频| 国产精品乱看| 国产精品日韩在线播放| a级片在线视频| 99久久99久久久精品齐齐| 免费久久99精品国产自| 伊人免费在线| 亚洲综合在线视频| www.亚洲天堂网| 欧美成人高清视频在线观看| 91精品婷婷国产综合久久竹菊| av电影中文字幕| 亚洲日产av中文字幕| 中文字幕日韩av综合精品| 欧美成人精品欧美一级| 另类av一区二区| 成人自拍性视频| 污视频在线免费| 中文字幕一区二区三区视频| 久久久久久久久久久99| 精品久久在线| 亚洲国产精品小视频| 色www亚洲国产阿娇yao| 亚洲激情午夜| 国产一区二区丝袜高跟鞋图片| 好吊色在线观看| 欧美国产一区视频在线观看| 中文字幕人妻熟女人妻洋洋| 免费观看成人性生生活片| 日韩三级视频中文字幕| 亚洲精品国产91| 激情丁香综合| 91精品久久久久| 亚洲日本在线播放| 亚洲美女免费视频| 超碰在线播放91| 美女网站色精品尤物极品姐弟| 最近中文字幕mv在线一区二区三区四区 | 波多野结衣 久久| 国产精品一区二区无线| 日产精品久久久一区二区| 青青青国内视频在线观看软件| 欧美自拍偷拍午夜视频| 一本加勒比波多野结衣| 欧美日韩hd| 国产日韩精品在线观看| 国内精品一区视频| 黄色一区二区三区| 国产精品一级无码| 一区二区电影| 国产精品亚洲精品| 国产小视频在线播放| 亚洲va国产va欧美va观看| 成人高清在线观看视频| 久久国产成人精品| 国产精品永久免费在线| 精品av中文字幕在线毛片| 亚洲一区在线看| 欧美日韩一区二区区| 1024精品久久久久久久久| 国产精品国产三级国产aⅴ9色| 你懂的视频在线观看| 欧美丝袜一区二区三区| 亚洲国产精品无码久久久久高潮| 国内自拍一区| 国产福利不卡| 都市激情久久综合| 精品国产亚洲一区二区三区在线观看| 亚洲xxxx3d动漫| 精品中文字幕一区二区| 一区二区三区视频| 亚洲伦理网站| 久久影视电视剧免费网站| 91超薄丝袜肉丝一区二区| 国产精品久久久久精k8| 国产女同无遮挡互慰高潮91| 99九九热只有国产精品| 91九色国产社区在线观看| 大片免费在线观看| 日韩一区二区麻豆国产| 九九热精品在线观看| 成人一级视频在线观看| 亚洲 自拍 另类小说综合图区| 欧美一区二区三区红桃小说| 欧美在线亚洲在线| 国产一二三在线观看| 欧美三级三级三级| 欧美风情第一页| 国产91在线观看丝袜| 欧美一级免费播放| 久久91精品| 成人激情在线观看| 久久免费电影| 日韩精品免费在线视频| 日韩黄色一级视频| 综合久久久久综合| 亚洲色偷偷色噜噜狠狠99网| 久久xxxx精品视频| 亚洲综合欧美日韩| 国产精品亚洲四区在线观看| 久久久伊人欧美| 激情在线视频| 日韩欧美在线一区二区三区| www日韩精品| 中文一区在线播放| 日本人妻一区二区三区| 久久精品毛片| 久久最新免费视频| 西野翔中文久久精品字幕| 国产精品揄拍500视频| 黄视频在线免费看| 国产亚洲成精品久久| 精品人妻一区二区三区换脸明星| 天天综合网 天天综合色| 国产传媒视频在线| av亚洲精华国产精华| 国产福利在线免费| 亚洲视频www| 91免费网站视频| 一本色道久久综合亚洲精品酒店| 成人国产精品一区| 午夜欧美激情| 久久99热精品这里久久精品| 免费在线国产| 欧美mv日韩mv亚洲| 特级西西444www高清大视频| 亚洲国产视频在线| 国产wwwwxxxx| 久久亚洲一区二区三区四区| 男生和女生一起差差差视频| 天堂精品中文字幕在线| 日本中文字幕在线视频观看| 99视频精品全国免费| 久久婷婷人人澡人人喊人人爽| 国产精品2区| 国产精品久久二区| 中文在线最新版地址| 欧美高跟鞋交xxxxhd| 婷婷成人激情| 国产亚洲精品综合一区91| 天堂中文在线看| 日韩美女主播在线视频一区二区三区| а中文在线天堂| 狠狠躁夜夜躁人人爽天天天天97| 超碰手机在线观看| 18成人在线观看| 毛片久久久久久| 国产丝袜欧美中文另类| 精品人妻一区二区三区日产乱码卜| 国产91精品精华液一区二区三区| 成人黄色一级大片| 美女免费视频一区| 在线免费视频a| 老司机精品导航| 逼特逼视频在线| 激情成人亚洲| 2018日日夜夜| 亚洲高清不卡| 久久99中文字幕| 亚洲黄色天堂| www精品久久| 极品中文字幕一区| 国产玉足脚交久久欧美| 亚洲第一区色| 国产免费黄色小视频| aa亚洲婷婷| 国产无套内射久久久国产| 校园春色综合网| 成人羞羞国产免费网站| 视频一区视频二区在线观看| 热久久精品免费视频| 日本在线不卡一区| 亚洲成人福利在线| 美国av一区二区| av毛片在线| 亚洲精品一区中文| 香蕉视频国产在线| 日韩av在线免费看| 香蕉久久一区二区三区| 日韩精品福利网站| 久久久久国产精品嫩草影院| 亚洲男人第一av网站| 国产午夜在线观看| 色噜噜狠狠狠综合曰曰曰 | 亚洲成人a级片| 91色视频在线导航| 日韩中文字幕无砖| 高清视频一区| 欧美综合精品| 日韩av在线一区二区三区| 久久精品高清| wwwwww欧美| 国产精品女主播一区二区三区| 男人操女人免费软件| 日本午夜精品一区二区三区电影| 欧美日韩中文不卡| 国产成人8x视频一区二区| 国产精品久久AV无码| 国产女人aaa级久久久级 | 国产日韩欧美综合| 日韩精品三级| 就去色蜜桃综合| 99久久国产综合精品成人影院| 成人毛片100部免费看| av成人黄色| 色呦色呦色精品| 不卡区在线中文字幕| 天天舔天天操天天干| 一区二区在线观看av| 69视频免费在线观看| 欧美日本不卡视频| 天堂网av在线播放| 日韩亚洲精品电影| 国产传媒在线| 91在线观看免费| 亚洲伊人春色| 国产内射老熟女aaaa| 鲁大师成人一区二区三区| 成人av毛片在线观看| 久久综合精品国产一区二区三区| 欧美激情一区二区久久久| 理论不卡电影大全神| 国产欧美精品一区二区三区介绍| 国产精品高潮呻吟av| 国内精品久久久久久久影视麻豆| 国产1区2区3区中文字幕| 天堂va蜜桃一区二区三区漫画版| 日本少妇激三级做爰在线| 久久综合一区二区| 少妇影院在线观看| 欧美性xxxxxx少妇| 天天射天天操天天干| 欧美成人午夜免费视在线看片| 成人在线视频播放| 精品婷婷色一区二区三区蜜桃| 国产精品久久久久9999赢消| 男女高潮又爽又黄又无遮挡| 国产精品亚洲专一区二区三区| 白白色免费视频| 图片区小说区国产精品视频 | 欧美一区二区视频观看视频| 精品视频一二三| 国模私拍视频一区| 精品视频一区二区三区| 婷婷五月色综合| 香蕉亚洲视频| 日本xxxx裸体xxxx| 亚洲成人av在线电影| 精品久久久免费视频| 日韩视频永久免费观看| 99久久精品一区二区成人| 美女被啪啪一区二区| 夜夜嗨一区二区| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 国产精品日韩在线观看| 欧洲美女女同性互添| 亚洲一区二区三区四区在线观看| 五月天中文字幕| 亚洲人成在线观看网站高清| yellow在线观看网址| 国产精品久久亚洲| 欧美日本一区| 国产精品偷伦视频免费观看了| 亚洲精品国产精品乱码不99| 97人妻精品一区二区三区视频| 中文字幕9999| 日本一区二区电影| 日韩精品无码一区二区三区| 日韩电影在线观看一区| 好吊视频在线观看| 欧美日韩裸体免费视频| 天天色棕合合合合合合合| 欧美一级大胆视频| 丝袜美腿综合| 少妇高清精品毛片在线视频| 久久精品一区二区三区av| 日本中文字幕在线观看视频| 亚洲最新在线视频| 视频欧美精品| 精品一区二区三区毛片| 国产精品99久久久| 久久无码精品丰满人妻| 亚洲国产另类 国产精品国产免费| 黄色激情在线播放| 欧美一区二区视频在线| 免费xxxx性欧美18vr| 翔田千里88av中文字幕| 欧美草草影院在线视频| 麻豆mv在线看| 日韩啊v在线| 国产一区视频导航| 久久国产在线视频| 亚洲精品视频播放| 播放一区二区| 8x8x华人在线| 91亚洲精品一区二区乱码| 中文精品久久久久人妻不卡| 久久精品久久精品亚洲人| 综合久久成人| 国产成人无码av在线播放dvd| 国产精品成人一区二区艾草| 精品人妻无码一区二区色欲产成人 | 日韩欧美国产精品| 国产福利电影在线播放| 青娱乐国产91| 国产成人综合在线| 欧美特黄aaaaaa| 日韩在线不卡视频| 精品三级av| 精品日韩久久久| 亚洲在线视频一区| 国产视频精选在线| 不卡的av一区| 日韩精品一区第一页| 欧美激情图片小说| 亚洲人成电影网站色www| 国产高清精品二区| 不卡影院一区二区| 亚洲精品亚洲人成人网| 邻居大乳一区二区三区| 懂色中文一区二区三区在线视频 | 2019中文字幕免费视频|