在winform中,微軟提供的label中文字只能是一種顏色:要麼全是黑色,要麼全是紅色或者其它顏色。當我們為了強調某些文字,讓它用紅色顯示時只能新建乙個lable物件,設定它fontcolor為紅色。但是如果在一行文字內嵌三個紅色,那豈不是要拼接六個label控制項?坑爹啊,這麼麻煩,我們還不如自己重寫一下label控制項,讓它支援多顏色的文字呢。
ok。let's do it.
要讓不同的文字顯示不同的顯示,我們必須告訴label控制項哪些文字對應哪種顏色。在這裡,我們定義乙個字典來儲存。
///設定對應的公共屬性:///keyvaluepair中 string儲存文字,color為對應的顏色
/// private dictionary> strcolordic = new dictionary>();
public dictionary>strcolordic接下來就是最重要的重寫onpaint事件了。在這裡如果我們定義的strcolordic中有值,就用g.drawstring將strcolordic中的文字寫到label控制項上。如果strcolordic中沒有值,就呼叫base.onpaint(e)將text屬性中的文字寫到label控制項上。set
}
注意繪製時起點的x軸要作相應的變動。
///大功告成,很簡單吧。我們新建乙個winform窗體來測試一下。在form1_load中新增下面**:///重寫onpaint,如果strcolordic不為空,就將strcolordic中文字
///繪製到label中
/// ///
protected
override
void
onpaint(painteventargs e)
}else
if(this.text!=""
)
}
dictionary> dic = new dictionary>();可以看到執行效果:dic.add("1
",new keyvaluepair("
我是紅色
",color.red));
dic.add("2
", new keyvaluepair("
我是藍色
", color.blue));
dic.add("3
", new keyvaluepair("
我是黃色
", color.yellow));
this.mylabel1.strcolordic = dic;
不過還有乙個bug,如果this.mylabel1.text(mylabel1即為我們的自定義控制項)的值為空的話,它不會觸發我們重寫的onpaint事件。我們在**中給它賦的值也就顯示不出來。
其實我們可以在給mylabel1賦dic時隨便給mylabel1.text賦個值就行了,如:
dictionary> dic = new dictionary>();dic.add("1
", new keyvaluepair("
我是紅色
", color.red));
dic.add("2
", new keyvaluepair("
我是藍色
", color.blue));
dic.add("3
", new keyvaluepair("
我是黃色
", color.yellow));
不能為空,否則無法觸發 onpaint事件
this.mylabel1.text = "";
this.mylabel1.strcolordic = dic;