近段時間在幫朋友做乙個簡訊傳送管理的軟體,其中有乙個常用短語的功能。大家都知道用手機傳送簡訊的時候一般都有常用短語的功能,朋友的意思也是按著手機那樣傳統的形式做就算了。但我覺得其中手機的常用短語功能其實並不常用,因為在手機上這功能比較雞肋。但如果在電腦上,發揮的空間就大了很多,於是我便打算做成像
ide的智慧型提示(或叫提示補全)的形式。
上搜尋了一下,竟然沒發現多少有用的資料。不過我覺得也沒必要做到像
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 結構 註冊登入 點這裡,點這裡,點這裡 下一步 商品分類 看到了麼?看到了麼?看到了麼?下一步 搜尋框這個就...