c 智慧型提示

2021-05-28 12:28:51 字數 2895 閱讀 3680

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