近段時間在幫朋友做乙個簡訊傳送管理的軟體,其中有乙個常用短語的功能。大家都知道用手機傳送簡訊的時候一般都有常用短語的功能,朋友的意思也是按著手機那樣傳統的形式做就算了。但我覺得其中手機的常用短語功能其實並不常用,因為在手機上這功能比較雞肋。但如果在電腦上,發揮的空間就大了很多,於是我便打算做成像ide的智慧型提示(或叫提示補全)的形式。
首先建立乙個tipslistbox類,其作用是顯示提示的資訊,此類繼承了listbox,以便我們可以自己控制。將drawmode屬性設為ownerdrawfixed。新增乙個型別為string的屬性prefix。此屬性的作用以後會提到。最後我們重寫drawitem事件。**如下:
private void tipslistbox_drawitem(object sender, drawitemeventargs e)
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, eventargs e)
else
//這個字首就是放到常用短語庫中去匹配的
string prefix = array[array.length - 1];
if (string.isnullorempty(prefix))
//從常用短語庫中查詢
listlist = generalphrasepool.search(prefix);
if (list == null)
return;
//將此字首儲存起來
lsttips.prefix = prefix;
lsttips.items.clear();
foreach (generalphraseinfo p in 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, keyeventargs e)
}然後重寫listbox的兩個事件,比較簡單,直接上**:
void lsttips_click(object sender, eventargs e)
}void lsttips_keydown(object sender, keyeventargs e)
return;
}//只允許在listbox上操作上鍵和下鍵,其它鍵都使焦點返回到簡訊輸入框
if (e.keycode != keys.down && e.keycode != keys.up)
txtmessagecontent.focus();
到了這裡,大家該差不多明白其中的流程了。不過可能對這一句有點疑惑:listlist = generalphrasepool.search(prefix);
為了提高效能,我預先將常用短語提取出來排好序,然後放到記憶體中。排序非常簡單,用一條sql就可以搞定:select * from dbo.generalphrase order by phrase
generalphrase表裡只有兩個字段,乙個是自增型主鍵,另乙個就是phrase型別為varchar。
既然已經排好序了,那當然用二分查詢法。
public static listsearch(string prefix)
}//重置索引
middle = (start + end) / 2;
last = middle;
if(middle < end)
}return list.getrange(first, last - first + 1);
}else if (list[middle].phrase.tolower().compareto(prefix) < 0 )
else
middle = (start + end) / 2;
}//找不到
return null;
C 實現智慧型提示(提示補全)功能
近段時間在幫朋友做乙個簡訊傳送管理的軟體,其中有乙個常用短語的功能。大家都知道用手機傳送簡訊的時候一般都有常用短語的功能,朋友的意思也是按著手機那樣傳統的形式做就算了。但我覺得其中手機的常用短語功能其實並不常用,因為在手機上這功能比較雞肋。但如果在電腦上,發揮的空間就大了很多,於是我便打算做成像 i...
不能智慧型提示
經常出現不能智慧型提示,現總結一下 首先要清楚,以下情況是不會智慧型提示的 1 游標在 注釋內。2 正在寫字串。3 在游標上方出現語法錯誤。4 當您數次包括乙個使用情況在不同巨集狀態下不同的標頭檔案時,intellisense 將無法一直工作。1 處理 c 專案中的 intellisense 失敗,...
Vistual Studio XML 智慧型提示
開發中經常遇到要和各種各樣的 xml 打交道,編輯 xml 檔案時最頭痛的便是要記住許多 xml 元素名稱 屬性名稱。幸運的是,vistual studio 的 xml 智慧型提示功能可以大大地減輕這一痛苦。只需通過新增自定義的 xsd 檔案使得在編輯 xml 檔案時獲得vs的智慧型提示,下面以 v...