C 實現智慧型提示(提示補全)功能

2021-05-01 10:45:58 字數 3330 閱讀 5253

近段時間在幫朋友做乙個簡訊傳送管理的軟體,其中有乙個常用短語的功能。大家都知道用手機傳送簡訊的時候一般都有常用短語的功能,朋友的意思也是按著手機那樣傳統的形式做就算了。但我覺得其中手機的常用短語功能其實並不常用,因為在手機上這功能比較雞肋。但如果在電腦上,發揮的空間就大了很多,於是我便打算做成像

ide的智慧型提示(或叫提示補全)的形式。

google

上搜尋了一下,竟然沒發現多少有用的資料。不過我覺得也沒必要做到像

ide的智慧型提示那樣的完美,因此按自己的想法做估計也不會太複雜。

首先建立乙個

tipslistbox

類,其作用是顯示提示的資訊,此類繼承了

listbox

,以便我們可以自己控制。將

drawmode

屬性設為

ownerdrawfixed

。新增乙個型別為

string

的屬性prefix

。此屬性的作用以後會提到。最後我們重寫drawitem事件。**如下:

private

void

tipslistbox_drawitem(object

sender, drawitemeventargse)

else

//最後把要顯示的文字畫在背景上

e.graphics.drawstring(this.items[e.index].tostring(),this.font, brushes.black, e.bounds.x + 15,e.bounds.y + 6,stringformat.genericdefault);

//再畫一下邊框

controlpaint.drawborder(e.graphics,this.clientrectangle,

color.beige, 2,buttonborderstyle.solid,

color.beige, 2,buttonborderstyle.solid,

color.beige, 2,buttonborderstyle.solid,

color.beige, 2,buttonborderstyle.solid);

} 傳送簡訊的介面是這樣的:

在傳送內容的輸入框裡輸入要傳送的簡訊,系統應該能提取使用者最後輸入的字串,然後將此字串放到預定義的常用短語庫里匹配,將匹配到的短語列表顯示在乙個

listbox

中。我這裡暫時採取的規則比較簡單,只提取以空格切分的最後一串的字元,然後匹配常用短語庫中以這字串開頭的短語。以後再根據客戶需要進行擴充套件修改。

首先重寫簡訊內容的文字框

(richtextbox)

的事件:

private

void

txtmessagecontent_textchanged(object

sender, eventargse)

else //

這個字首就是放到常用短語庫中去匹配的

string

prefix =array[array.length - 1];

if (string.isnullorempty(prefix))

//從常用短語庫中查詢

list

list = generalphrasepool.search(prefix);

if (list ==null)

return; //

將此字首儲存起來

lsttips.prefix =prefix;

lsttips.items.clear();

foreach (generalphraseinfopin

list)

lsttips.show();

lsttips.width = 200;

lsttips.tabindex = 100; //

讓提示框跟隨游標

lsttips.location =tb.getpositionfromcharindex(tb.selectionstart);

lsttips.left += 10;

lsttips.selectedindex = 0;

if (!tb.controls.containskey(controlkey))

tb.controls.add(lsttips); }

}使用者在簡訊輸入文字框裡按中了鍵盤的下方向鍵的話,就將焦點移到listbox提示框裡。

private

void

txtmessagecontent_keydown(object

sender, keyeventargse)

} }然後重寫listbox的兩個事件,比較簡單,直接上**:

void

lsttips_click(object

sender, eventargse)

} void

lsttips_keydown(object

sender, keyeventargse)

return; }

//只允許在listbox上操作上鍵和下鍵,其它鍵都使焦點返回到簡訊輸入框

if (e.keycode !=keys.down && e.keycode != keys.up)

txtmessagecontent.focus(); }

到了這裡,大家該差不多明白其中的流程了。不過可能對這一句有點疑惑:list

list = generalphrasepool.search(prefix);

為了提高效能,我預先將常用短語提取出來排好序,然後放到記憶體中。排序非常簡單,用一條sql就可以搞定:select * from dbo.generalphrase order by phrase

generalphrase

表裡只有兩個字段,乙個是自增型主鍵,另乙個就是

phrase

型別為varchar

。既然已經排好序了,那當然用二分查詢法。

public

static

list

search(string

prefix)

} //重置索引

middle = (start +end) / 2;

last = middle;

if(middle

} return

list.getrange(first,last - first + 1); }

else

if (list[middle].phrase.tolower().compareto(prefix) < 0 )

else

middle = (start +end) / 2; }

//找不到return

null; }

最後的效果如下:

c 智慧型提示

近段時間在幫朋友做乙個簡訊傳送管理的軟體,其中有乙個常用短語的功能。大家都知道用手機傳送簡訊的時候一般都有常用短語的功能,朋友的意思也是按著手機那樣傳統的形式做就算了。但我覺得其中手機的常用短語功能其實並不常用,因為在手機上這功能比較雞肋。但如果在電腦上,發揮的空間就大了很多,於是我便打算做成像id...

Solr Suggest實現搜尋智慧型提示

智慧型提示簡介 solr suggestion智慧型提示模組 作為乙個應用廣泛的搜尋引擎系統,solr內建了智慧型提示功能,它在solr裡叫做suggest模組.該模組可選擇基於提示詞文字做智慧型提示,還支援通過針對索引的某個字段建立索引詞庫做智慧型提示。在諸多文件中都推薦使用基於索引來做智慧型提示...

純css實現新手幫助提示功能(首次登入提示)

整體效果展示 這類新手提示的外掛程式還真是少,無奈之下自己寫了乙個,不帶任何,完全css實現。因為考慮到功能比較特殊,使用不會太頻繁,就沒寫成外掛程式的模式,所有都是寫死的,可以看下html 結構 註冊登入 點這裡,點這裡,點這裡 下一步 商品分類 看到了麼?看到了麼?看到了麼?下一步 搜尋框這個就...