基礎(chǔ)信息
權(quán)利要求
說明書
PDF全文
法律信息
引證文獻
著錄項信息
專利名稱 | 字符高亮處理的方法 |
申請?zhí)?/td> | CN99104967.5 | 申請日期 | 1999-04-09 |
法律狀態(tài) | 權(quán)利終止 | 申報國家 | 中國 |
公開/公告日 | 2000-10-18 | 公開/公告號 | CN1270357 |
優(yōu)先權(quán) | 暫無 | 優(yōu)先權(quán)號 | 暫無 |
主分類號 | 暫無 | IPC分類號 | 暫無查看分類表>
|
申請人 | 英業(yè)達股份有限公司 | 申請人地址 | 臺灣省臺北市
變更
專利地址、主體等相關(guān)變化,請及時變更,防止失效 |
權(quán)利人 | 英業(yè)達股份有限公司 | 當(dāng)前權(quán)利人 | 英業(yè)達股份有限公司 |
發(fā)明人 | 郝軍;宋建福;林光信 |
代理機構(gòu) | 北京市柳沈律師事務(wù)所 | 代理人 | 黃敏 |
摘要
一種字符高亮處理的方法,其中揭露了一種對游標(biāo)指向的字符提供所需的高亮位置及范圍的技術(shù);根據(jù)本發(fā)明,先借由一查找的流程,如以二分法或累計法尋得游標(biāo)所在背景字串的正確字符序號,再依序取得所要高亮字符的起始字符序號與終止字符序號,以決定出高亮字符的范圍,并根據(jù)起始字符序號決定出高亮字符的定位位置,如此便能正確完成任意等間距或不等間距字體字符的高亮處理。
1.一種字符高亮處理的方法,用于對一游標(biāo)指向的字符提供所要光標(biāo) 所在單詞的一高亮位置及一高亮范圍,包含:
取得該游標(biāo)指向一背景字串的一字符的位置;
以二分查找法決定出該字符的序號;
由該字符序號依序向前一字符搜尋該光標(biāo)所在單詞一起始字符的序 號;
根據(jù)該起始字符序號決定該光標(biāo)所在單詞的該高亮位置;以及
由該字符序號依序向后一字符搜尋該光標(biāo)所在單詞一終止字符的序 號,以決定該光標(biāo)所在單詞的該高亮范圍;
其中該二分查找法的步驟還包括:
a)設(shè)定二分查找的左值為1,右值為該背景字串的總字符數(shù);
b)取得中值為該左值加該右值后除以二,并將結(jié)果放在一存儲單元中 記錄為該字符的序號;
c)從該背景字串中取出該字符序號之前的多個字符,并計算出該些字 符所顯示的寬度;
d)判定該些字符寬度是否大于等于所取得的游標(biāo)指向的該字符位置, 若是則進行下步驟,若否則將該存儲單元內(nèi)的該序號值加1的結(jié)果放入該 左值并跳回步驟b;
e)取該背景字串該游標(biāo)指向字符序號前減1個字符的顯示寬度;以及
f)判斷步驟e中的該顯示寬度是否小于游標(biāo)指向的該字符位置,若是 則結(jié)束該二分查找,若否則修改該右值為該序號減1,并跳回步驟b。
2.如權(quán)利要求1所述的字符高亮處理的方法,其中該游標(biāo)指向的字符 為西字符。
3.如權(quán)利要求2所述的字符高亮處理的方法,其中該光標(biāo)所在單詞為 一西文單詞。
4.如權(quán)利要求3所述的字符高亮處理的方法,其中進行該步驟b之前 還包括判斷左值是否大于右值,若是則異常終止流程,表示游標(biāo)不在該背 景字串上。
5.如權(quán)利要求3所述的字符高亮處理的方法,其中該顯示寬度的計算 可以Visual?Basic中標(biāo)簽控件的Autosize方法獲得。
6.如權(quán)利要求3所述的字符高亮處理的方法,其中該顯示寬度的計算 可以Visual?C++中相應(yīng)的API函數(shù)求得。
7.如權(quán)利要求3所述的字符高亮處理的方法,其中該高亮范圍為該起 始字符序號和該終止字符序號之間的字串。
8.一種字符高亮處理的方法,用于對一游標(biāo)指向的字符提供所要光標(biāo) 所在單詞的一高亮位置及一高亮范圍,包含:
取得該游標(biāo)指向一背景字串的一字符的位置;
以累計查找法決定出該字符的序號;
由該字符序號向左搜尋該光標(biāo)所在單詞一起始字符的序號;
根據(jù)該起始字符序號決定該光標(biāo)所在單詞的該高亮位置;以及
由該字符序號向右搜尋該光標(biāo)所在單詞一終止字符的序號,以決定該 光標(biāo)所在單詞的該高亮范圍;
其中該累計查找法的步驟還包括:
a)設(shè)定一初始值;
b)將該初始值累計后存入一存儲單元內(nèi),記錄為該字符的序號;
c)從該背景字串中取出該字符序號之前多個字符,然后,計算出該些 字符所顯示的寬度;以及
d)判斷該些字符寬度是否大于或等于游標(biāo)指向的該字符位置或是已取 完所有的字符,若是則結(jié)束該累計查找,若否則跳回步驟b。
9.如權(quán)利要求8所述的字符高亮處理的方法,其中步驟a中的該初始 值設(shè)為0,步驟b中累計的方法為將該初始值加1。
10.如權(quán)利要求8所述的字符高亮處理的方法,其中步驟a中的該初 始值設(shè)為該背景字串的總字符數(shù)加1,步驟b中累計的方法將該初始值減1。
本發(fā)明涉及一種字符高亮(highlight)處理的方法,特別涉及一種應(yīng)用 于任意西字符體的字串中,高亮處理其標(biāo)記單詞的方法。\n在視窗系統(tǒng)中,有許多的軟件如文書處理軟件,會應(yīng)用到對其所采用 的文件內(nèi)容,進行例如單詞的高亮處理,即當(dāng)鼠標(biāo)移動到某一字符位置上 時,由預(yù)設(shè)的鼠標(biāo)鍵功能,如雙擊(double?click)鼠標(biāo)左鍵,便可將一西 文的單詞或中文的字串以較亮的顏色顯示出,此處理過程便稱之為高亮處 理。\n這一處理過程的要求包含有:\n1、如何準(zhǔn)確判定游標(biāo)所指向的需高亮字符的位置(代表字符在背景字 串中的序號);以及\n2、如何準(zhǔn)確判定高亮字符的高亮范圍。\n若能做到上述兩點,才能讓使用者在使用含有高亮處理過程的文書處 理軟件時,做到“指所需,用所指”,不會出現(xiàn)顯示出的高亮位置與所要的 結(jié)果產(chǎn)生偏差。\n然而,在一些使用有字符高亮處理的軟件當(dāng)中,特別是使用多種西字 符體的軟件中,高亮字符顯現(xiàn)的范圍常常與字符的實際范圍對應(yīng)不準(zhǔn),出 現(xiàn)誤差,給使用者帶來不便。\n這是因為,就視窗系統(tǒng)而言,其所提供的字符字體可概括分成兩類:\n1、等間距的字體,是指字串中的每個字符的寬度皆相同,如中字符或 Windows?95系統(tǒng)所提供的Courier和Courier?New等幾種字體,等間距的 西字符體種類有限,字形也較簡單。\n2、不等間距字體,是指字串中的每個字符的寬度皆不相同,如windows 95系統(tǒng)所提供的羅馬字體,TrueType字體等,不等間距字體種類豐富,字 型效果也較好。\n較為傳統(tǒng)的字符高亮處理方法是用于處理等間距的字體,因等間距字 體的每個字符寬度相同,在判定游標(biāo)所指向字符的位置及字符寬度時,只 需利用簡單的整除觀念既可做到準(zhǔn)確定位的目的。\n若在上述使用多種西字符體的軟件中,摻雜使用了不等間距的字體, 則傳統(tǒng)的字符高亮處理方法便不能準(zhǔn)確定位游標(biāo)所指字符的位置,高亮字 符的位置往往因定位不準(zhǔn)而出現(xiàn)誤差,給使用者帶來不便。\n一般解決辦法是,將一句話的每一個單詞分別放入系統(tǒng)另提供的字符 控件中,再根據(jù)所需高亮單詞在某一控件中的位置來定位游標(biāo)與單詞的對 應(yīng)位置。這種方法雖然定位準(zhǔn)確,但使用過多控件,過多消耗系統(tǒng)資源, 因而不是一種理想的解決辦法。\n另一種解決法是,將采用不等間距的字體處理的字符轉(zhuǎn)換成圖形格式, 然后針對需高亮處理的字符區(qū)域預(yù)先記錄下來,當(dāng)游標(biāo)移動到該區(qū)域時, 根據(jù)事先預(yù)定的區(qū)域大小確定游標(biāo)指定單詞的高亮。這種辦法的缺點是圖 形化處理后的字符不可變更,修改不便,靈活性差。\n因此,本發(fā)明的目的便欲提供一種字符高亮處理的方法,以能簡潔處理 包含有不等間距字體的文件的字符高亮問題,期能達到準(zhǔn)確判定游標(biāo)位置所 對應(yīng)的需高亮字符的位置,以及準(zhǔn)確判定高亮字符的高亮范圍的目的。\n根據(jù)上述本發(fā)明目的所揭露的一種字符高亮處理的方法,可用以對一 游標(biāo)指向的字符提供所要光標(biāo)所在單詞的一高亮位置及一高亮范圍,其步 驟包含:\n取得游標(biāo)指標(biāo)指向一背景字串的一字符的位置;\n以二分查找法或累計查找法決定出字符的序號;\n由字符序號向左搜尋光標(biāo)所在單詞一起始字符的序號;\n根據(jù)起始字符序號決定光標(biāo)所在單詞的高亮位置;以及\n由字符序號向右搜尋光標(biāo)所在單詞一終止字符的序號,以決定光標(biāo)所 在單詞的高亮范圍;其中該二分查找法的步驟還包括:\na)設(shè)定二分查找的左值為1,右值為該背景字串的總字符數(shù);\nb)取得中值為該左值加該右值后除以二,并將結(jié)果放在一存儲單元中 記錄為該字符的序號;\nc)從該背景字串中取出該字符序號之前的多個字符,并計算出該些字 符所顯示的寬度;\nd)判定該些字符寬度是否大于等于所取得的游標(biāo)指向的該字符位置, 若是則進行下步驟,若否則將該存儲單元內(nèi)的該序號值加1的結(jié)果放入該 左值并跳回步驟b;\ne)取該背景字串該游標(biāo)指向字符序號前減1個字符的顯示寬度;以及\nf)判斷步驟e中的該顯示寬度是否小于游標(biāo)指向的該字符位置,若是 則結(jié)束該二分查找,若否則修改該右值為該序號減1,并跳回步驟b。\n根據(jù)上述本發(fā)明目的所揭露的一種字符高亮處理的方法,用于對一游 標(biāo)指向的字符提供所要光標(biāo)所在單詞的一高亮位置及一高亮范圍,包含:\n取得該游標(biāo)指向一背景字串的一字符的位置;\n以累計查找法決定出該字符的序號;\n由該字符序號向左搜尋該光標(biāo)所在單詞一起始字符的序號;\n根據(jù)該起始字符序號決定該光標(biāo)所在單詞的該高亮位置;以及\n由該字符序號向右搜尋該光標(biāo)所在單詞一終止字符的序號,以決定該 光標(biāo)所在單詞的該高亮范圍;\n其中該累計查找法的步驟還包括:\na)設(shè)定一初始值;\nb)將該初始值累計后存入一存儲單元內(nèi),記錄為該字符的序號;\nc)從該背景字串中取出該字符序號之前多個字符,然后,計算出該些 字符所顯示的寬度;以及\nd)判斷該些字符寬度是否大于或等于游標(biāo)指向的該字符位置或是已取 完所有的字符,若是則結(jié)束該累計查找,若否則跳回步驟b。\n為讓本發(fā)明的上述和其他目的、特征、和優(yōu)點能更明顯易懂,下文特 舉一較佳實施例,并結(jié)合附圖,作詳細(xì)說明如下。\n圖1繪示本發(fā)明字符高亮處理方法的前段流程,以二分查找法的一種\n實施例;\n圖2繪示本發(fā)明不同圖1流程的另一種實施例的方法;以及\n圖3繪示本發(fā)明字符高亮處理方法的后段流程。\n圖4是解釋有關(guān)名詞的實例圖。\n一般的中文字或方塊字符,對計算機的處理而言,常常是以等間距的 字體表現(xiàn),不會有任何問題;但是對于所謂的西文,即文字是以字母組合 成以單詞為單位形態(tài)的文字,為求計算機上所表現(xiàn)出的態(tài)樣能符合平時書 寫的習(xí)慣,以及計算機上的字型能有豐富的變化和效果,多半便有采用非 等間距的字體。在視窗系統(tǒng)中,西文單詞間會以空格作分隔;每個西文的 字符一般為半形(若為全形則為等間距字);標(biāo)點(除引號外)后一般也有一 空格。因此,本發(fā)明將以此特點為基礎(chǔ),說明一西文單詞高亮處理的過程, 先是以公知處理等間距單詞高亮的方法,比較以其處理非等間距字體所產(chǎn) 生的問題,進而再詳述本發(fā)明的解決方法。\n為表述方便,預(yù)先指定幾個專有名詞:\n一句話(句串)稱為背景字串;\n需高亮的單詞稱為HiliWord;\n一個字符的寬度稱為WPerByte;\n游標(biāo)所指向的單詞中的字毋在一句話(字串)中的序號稱為ByteID;以 及\nHiliWord字節(jié)起始序號稱為BeginID,終止序號稱為EndID。\n以圖4所示的實例來解釋上述的名詞:\n其中,背景字串即為“This?is?English?demo.”,指向的字母‘n’的 箭頭即為游標(biāo)指標(biāo)所在,因此HiliWord即為‘English’這個單詞。連同 空格和標(biāo)號(句點)在內(nèi),背景字串共有21個字符,因此游標(biāo)所指向的字母 n的ByteID為10,HiliWord的BeginID為9EndID為15。若以背景字串首 位字母T左上角為坐標(biāo)原點,設(shè)游標(biāo)在背景字串上所指位置的橫坐標(biāo)為mX, HiliWord(English)定位后的橫坐標(biāo)為wX。\n因此,上述單詞高亮的處理即是高亮字符的定位問題,其關(guān)鍵點是求 得游標(biāo)在哪個字母上做的移動(Mouse?Move)動作,即如何得到ByteID。\n如果是等間距字體則處理方法很簡單:\nByteID=mX\W_PerByte+1……(1)\n其中,“\”表示整除的意思。\n以下面所示的背景字串(字體大小20)為例:\n????????????????????????????????16\n???????????????The????font?????is????courier????new.\n???????????????????????????????????????↑\n???????????????????????????????????????mX\n可視為在框線中再以隔線劃分出一個個柵格,而每個柵格內(nèi)各容納有 一個字符,柵格的寬度是一樣的,即對于Courier?New字體而言每個字符 的寬度W_PerByte是相同的。若所取得的W_PerByte為6.4mm,游標(biāo)所指 在坐標(biāo)mX為97.5mm,很容易就得到ByteID=16了。知道是背景字串的第 16個字母(‘r’)是鼠標(biāo)的攝入點,再從‘r’的左右兩側(cè)搜尋空格或引號, 即可令“Courier”這個單詞高亮了。\n然而這種方法對不等間距字體就不適用了。因為W_PerByte不確定, 即不等距字體每個字符(字母)的寬度不定。如果以W_PerByte的平均值帶 入前面那個公式(1),便會產(chǎn)生如下列所示的現(xiàn)象(其中背景字串的字體大 小也是20):\n?????????The?font?is?Times?New?Roman.\n??????????????????????↑\n???????????????????ByteID=16)\n以這種錯位現(xiàn)象,當(dāng)然是由于用傳統(tǒng)的等距字體處理方法處理不等距 字體造成的,因為由公式(1)所計算得的ByteID并不正確,所以如何確定 ByteID,即確定游標(biāo)指在哪個字符上,便成為準(zhǔn)確判定游標(biāo)所對應(yīng)的需高 亮單詞位置的關(guān)鍵。\n接下來便是本發(fā)明處理任意字體西文單詞高亮的方法。\n首先由圖1的流程圖說明本發(fā)明如何準(zhǔn)確判讀ByteID的步驟,以確定 游標(biāo)指向背景字串中某個字符的位置。\n同樣以前述背景字串“This?is?English?demo.”為例,‘This’中的 字母‘T’左上角為坐標(biāo)原點。本實施例中,游標(biāo)所指字符在背景字串中的 序號ByteID是以“二分查找法”獲得的。\n步驟1:首先將二分查找的左值Left置為1,右值Right置為背景字 串的總字符數(shù)(此例中為21)。當(dāng)然Left值也可不為1,只要給一個初始值 即可,例如以12為例,則Right值便需跟著改變?yōu)?12+21)-1=32。\n步驟2:開始進入二分查找循環(huán)。先是要判斷左值Left是否小于右值 Right。若Left≤Right才允許流程繼續(xù):否則,進入步驟12,找不到游標(biāo) 所在的字符,則異常終止流程,表示mX傳遞的值無效,游標(biāo)不在背景字串 上。\n步驟3:取中值(Left+Right)/2,將結(jié)果放在一存儲單元中,記錄為 ByteID。\n步驟4:從背景字串中取出ByteID之前所有的字符,然后經(jīng)步驟5計 算出這些字符形成的字串所顯示的寬度(StringWidth)。\n計算某字串顯示寬度的方法很多。例如,在VisualBasic開發(fā)語言中, 可以利用標(biāo)簽控件的Autosize方法獲得。首先把標(biāo)簽的字型(font)和該字 串統(tǒng)一;然后將該字串輸入標(biāo)簽的屬性Caption,取其屬性Width即為該字 串的顯示寬度。而在Visual?C++中也可利用相應(yīng)的API函數(shù)求得字串中 當(dāng)前字體所有相關(guān)的字體信息,其中當(dāng)然包括字串的顯示寬度。\n步驟6:判定字串的寬度是否大于等于游標(biāo)的橫坐標(biāo)mX值,若字串寬 度小于游標(biāo)的橫坐標(biāo)mX值,則進入步驟7,修改左值Left,將存儲單元內(nèi) 的ByteID值加1的結(jié)果放入Left中,然后回到步驟2中,繼續(xù)下一次的 二分查找,一直在此步驟2至步驟7的回路中循環(huán),直到字串顯示寬度 StringWidth大于等于游標(biāo)指向的橫坐標(biāo)mX值,則進入下一個步驟8。\n步驟8:所得結(jié)果為StringWidth大于等于mX,還要再取背景字串前 ByteID-1個字符的字串,獲得其String-Width。\n步驟9:再依據(jù)步驟8中所得的字串顯示寬度判斷是否小于游標(biāo)指向的 橫坐標(biāo)值mX。若其StringWidth的確小于mX,才進入步驟10,說明存儲單 元內(nèi)的ByteID值即為所求。\n否則進行步驟11,修改右值Right為ByteID-1,再跳回步驟2中進行 下一次二分查找過程。\n依據(jù)上述圖1的流程,在步驟10中便可得到游標(biāo)指標(biāo)所指向字符的 ByteID的正確值,因此接下來便可進行對指向的單詞作高亮的處理。\n上述實施例是以“二分查找法”來獲得正確的ByteID,當(dāng)然也可由不 同方法獲得,只要能達到取得的ByteID值是正確的即可。下面再以另一種 “累計查找法”的方式來說明。\n步驟21:首先設(shè)定ByteID的初始值為0。\n步驟22:開始進入累計查找的循環(huán),將ByteID值加1后存入一存儲單 元內(nèi),記錄為ByteID值。\n步驟23:從背景字串中取出ByteID之前所有的字符,然后經(jīng)步驟24 計算出這此字符形成的字串所顯示的寬度(StringWidth)。\n步驟25:判斷StringWidth是否大于或等于游標(biāo)指向的橫坐標(biāo)值mX, 或是已取完所有的字符,若否則跳回步驟22,ByteID值重新累加1后繼續(xù) 進行循環(huán);若結(jié)果為是則進入步驟26。\n步驟26:說明存儲單元內(nèi)的ByteID值即為索求。\n上述的實施例是采用由ByteID的起始值開始向后查找,當(dāng)然也可由背 景字串的最終ByteID值開始向前查找,原理相同,便不再贅述。\n不論是由圖1或圖2實施例的流程方法所取得的正確ByteID值,之后 都可由下述圖3的流程來實現(xiàn)游標(biāo)指向單詞的高亮。\n步驟13:先判斷所取得背景字串中的ByteID值,即游標(biāo)攝入的字符是 否為空格或標(biāo)點,若是則進入步驟19,無需高亮字符,此時結(jié)束整個流程, 表示游標(biāo)沒處在任何單詞上,以下的步驟就不必進行了。\n由步驟13的篩除,以下步驟14~18便是如何得到高亮單詞的流程。\n步驟14:確定游標(biāo)指向單詞的起始字母序號(BeginID)。在背景字串中 從ByteID,游標(biāo)指向的字符的位置開始,依序向前一個字符搜尋空格或標(biāo) 點,直到取得單詞的左起始位置BeginID。\n步驟15:根據(jù)BeginID確定高亮單詞相對應(yīng)坐標(biāo)wX。若BeginID等于 1則高亮單詞相對于背景字串左上角的相對坐標(biāo)為0;否則取背景字串 BeginID-1個字符,求出的寬度即為高亮單詞的位置wX。\n步驟16:確定游標(biāo)指向單詞的終止字母序號(EndID)。在背景字串從 ByteID,游標(biāo)指向的字符位置開始,依序向下一個字符搜尋空格或標(biāo)點, 直到取得單詞的右終點位置EndID。\n步驟17:從背景字串中取出由BeginID到EndID的字符即為高亮單詞 HiliWord。\n步驟18:高亮單詞以定位坐標(biāo)wX定位后,以與背景字串不同的顏色顯 示需高亮的單詞(HiliWord),便完成了高亮單詞的處理。\n附表(一)便是本發(fā)明單詞高亮處理方法,根據(jù)圖1和圖3的流程,以 Visual?Basic開發(fā)語言所撰寫出的原始程序碼。\n???????????????????附表(一)\n================================= Public Function ShowHiliWord(X As Single,bgCtrl As Control, labHiliWord As Label,ByVal InfoStr As String,Optional offset As Integer,Optional pX As Single,Optional pY As Single)As Boolean Dim ReturnValue As Boolean’函數(shù)返回值 Dim CharNo As Integer’游標(biāo)游標(biāo)移入的字符序號 Dim lBorder As Integer’單詞左邊界 Dim rBorder As Integer’單詞右邊界 Dim char As String *1’字符 Dim Word As String’完整單詞 Dim sentence As String’背景字串 Dim LineLength As Long’背景字串的字符總數(shù) Dim HandleWay As Integer’處理方式 LabHiliWord.Visible=False ReturnValue=False If Type Of bgCtrl Is Label Then HandleWay=1 ElseIf Type Of bgCtrl Is PictureBox Then HandleWay=2 Else HandleWay=3’背景為掃顯控件 End If If HandleWay=2Then If X>=pX Then X=X-pX Else Exit Function’PictureBox情況的邊界保護 End If End If If HandleWay=1 Then X=X/Screen.TwipsperPixelX’Twip轉(zhuǎn)換成Pixel End If “======確保高亮Label和背景控件字體完全一致====== Set labHiliWord.Font=bgCtrl.Font “============== sentence=Rtrim$(FilterString(InfoStr)) LineLength=Len(sentence) labHiliWord.AutoSize=True labHiliWord.Caption=sentence If X>LabHiliWord.Width Then Go To ExitHandle End If CharNo=1 Do LabHiliWord.Caption=Mid$(sentence,1,CharNo) If labHiliWord.Width>=X Then Exit Do’已得到游標(biāo)游標(biāo)所在字符序號 Else CharNo=CharNo+1 End If Loop Char=Mid$(sentence,CharNo,1) If Not IsWordElement(char)Then GoTo ExitHandle’游標(biāo)游標(biāo)所在字符非單詞元素 End If ’=========搜尋特殊字串======== Dim I% Dim sw%’特殊字串的個數(shù) Dim specialPos()As SpecialWordType’用浮點記錄 Chr$(1)Chr$(2)的位置 Dim ptr As Long Dim Special As Boolean’是否已做特殊單詞處理 Special=False sw=0 ptr=1 Do ptr=InStr(ptr,InfoStr,Chr(1)) If ptr=0 Then Exit Do sw=sw+1 Re Dim Preserve specialPos(sw)As SpecialWordType ptr=ptr+1 ptr=Instr(ptr,InfoStr,Chr(2)) specialPos(sw).EndPos=ptr-0.5-2*(sw-1) ptr=ptr+1 ptr=InStr(ptr,InfoStr,Chr(2)) specialPos(sw).EndPos=ptr-0.5-2*(sw-1)-1 ptr=ptr+1 Loop If sw<>0 Then ’本行存在特殊字串,判斷鼠標(biāo)是否觸到 For i=1 To sw If CharNo>specialPos(i).BeginPos And CharNo<specialPos(i).EndPos Then LBorder=Int(specialPos(i).BeginPos)+1 Word=Mid(sentence,lBorder,specialPos(i).EndPos- specialPos(i).BeginPos) Special=True Exit For End If Next End If “======================= If Special=False Then ’========搜尋單詞左邊界======== lBorder=1 For i=CharNo To 1 Step-1 char=Mid$(sentence,i,1) If IsNumeral(char)Then Go To ExitHandle’發(fā)現(xiàn)數(shù)字 If Char=″″Or char=Chr$(34)Then ’向左搜尋到空格引號 lBorder=i+1 Exit For End If Next i ’========搜尋單詞右邊界======== For i=lBorder To LineLength char=Mid$(sentence,i,1) If IsNumeral(char)Then Go To ExitHandle’發(fā)現(xiàn)數(shù)字 If Not IsWordElement(char)Then ’向右搜尋到非單詞元素 Exit For End If Next i rBorder=i-1 Word=Mid$(sentence,lBorder,rBorder-lBorder+1) If Left$(Word,1)=“-”Then ’========發(fā)現(xiàn)破折號======== GoTo ExitHandle Else ’========縮寫 句號 省略號的判斷======== ptr=InStr(1,Word,“.”) If ptr<>0 Then If Not(ptr=Len(Word)And IsSpecialWord(Word)) Then If Mid$(sentence,CharNo,1)=“.”Then ’省略號和句號處MousemMove無效 GoTo ExitHandle End If ’========高亮Label縱向的定位======== Select Case HandleWay Case 1: t=bgCtrl.Top Case 2: t=pY Case 3: t=0 End Select ’================== labHiliWord.Move 1,t labHiliWord.Caption=Word ’========解決不等距字體“字母殘缺”現(xiàn)象======== labHiliWord.AutoSize=False If HandleWay=3 Then LabHiliWord.Width=labHiliWord.Width+offset* Screen.TwipsPerPixelX Else LabHiliWord.Width=labHiliWord.Width+offset End If ’================ labHiliWord.Zorder0 ’@labHiliWord.Visible=True Returen Value=True Exit Handle: ShowHiliWord=ReturenValue’讓你自己確定高亮Label可視否 End Function ===================================\n根據(jù)上述程序的流程,下面仍以前述背景字串“This?is?English?demo.” 為例,說明實際運算的過程。\n當(dāng)前游標(biāo)攝入點在字母‘T’的左上角為原點的坐標(biāo)中的橫坐標(biāo)為mX。 關(guān)鍵在于要計算游標(biāo)攝入點是背景字串中的哪個字符,即求得ByteID。用 二分查找法,首先定義左值Left等于1,右值Right等于21(背景字串有 21個字符)。然后取中值ByteID=(Left+Right)/2=(1+21)/2=11;取 背景字串前11個字符“This?is?Eng”算出該字串的顯示寬度StringWidth。 若String?Width≥mX,且前(ByteID-1)=10個字串的寬度StringWidth<mX, 則此時的ByteID即為所求。背景字串的第十個字符為‘n’,以‘n’為中 心向兩側(cè)搜尋空格或標(biāo)點,得到‘English’這個高亮單詞的左右邊界 BeginID=9和EndID=15。取前背景字串BeginID-1=8得到的字串‘This is’的顯示寬度即為高亮單詞的定位坐標(biāo)wX。以紅色等明顯的顏色高亮 ‘English’,即實現(xiàn)整個高亮的過程。\n雖然本發(fā)明是以西文單詞的高亮處理為比較的實施例揭露如上,但其 并非用以限定本發(fā)明,任何本領(lǐng)域的技術(shù)人員,在不脫離本發(fā)明的精神和 范圍內(nèi),可改變相同的作法應(yīng)用于其它各種字符的高亮處理,這些具有相 同本質(zhì)的更動與潤飾,應(yīng)當(dāng)視為本發(fā)明特征與精神的延伸,而為所述的權(quán) 利要求所界定的范圍涵括。
法律信息
- 2012-06-27
未繳年費專利權(quán)終止
IPC(主分類): G06F 17/20
專利號: ZL 99104967.5
申請日: 1999.04.09
授權(quán)公告日: 2003.03.12
- 2003-03-12
- 2000-10-18
- 1999-10-06
實質(zhì)審查請求的生效
實質(zhì)審查請求的生效
引用專利(該專利引用了哪些專利)
序號 | 公開(公告)號 | 公開(公告)日 | 申請日 | 專利名稱 | 申請人 | 該專利沒有引用任何外部專利數(shù)據(jù)! |
被引用專利(該專利被哪些專利引用)
序號 | 公開(公告)號 | 公開(公告)日 | 申請日 | 專利名稱 | 申請人 | 該專利沒有被任何外部專利所引用! |