C++ Builder 中的自畫功能 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 C Builder 中的自畫功能
2001-12-22· ·TopCat··
1 2 3 下一頁 也許你都看見過一些列表框啦、下拉清單啦什?的,他們的選項不是文字而是圖形。比如像Word 97中設置字體的對話方塊裏有一項“下劃線”設置,其選項中就是各種線形,給人非常直觀的感覺。這種下拉清單在C Builder中能做出來嗎? Of course!我在自己的程式中,就成功地使用了這種列表框完成了線形的設置。OK,下面我們就來實際做一個程式。這個程式的作用是這樣的:使用下拉清單框選擇一種?色,並把Label1的文字設置成該?色。 先在Form上放一個ComboBox,取名?ComboBox1。把(注意是關鍵哦!)Style改?csOwnerDrawFixed,注意這一步很重要,因?如果不改成OwerDraw形式的話,就不會觸發後面要用到的OnDrawItem事件。另外,?了編程方便,我們定義一個?色陣列(簡單起見,就用五種?色):
const TColor colors[5] = {clBlack, clWhite, clRed, clBlue, clGreen}; 再在ComboBox的Items裏寫上5行:黑色、白色、紅色、蘭色、綠色。 最後在ComboBox的OnDrawItem裏寫上如下代碼:
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
//Control是需要自畫的控制項,Index是項數索引(從0開始),Rect是該項的繪畫範圍,State表示狀態
//(選中、聚焦、無效等)
{
//畫?色索引的小方塊
((TComboBox *)Control)->Canvas->Brush->Color = colors[Index];
((TComboBox *)Control)->Canvas->Brush->Style = bsSolid;
((TComboBox *)Control)->Canvas->FillRect(Classes::Rect(Rect.Left 2, Rect.Top 2, Rect.Left 14, Rect.Bottom-2)); //之所以用Classes::Rect是因?與參數重名
((TComboBox *)Control)->Canvas->Pen->Color = clBlack;
((TComboBox *)Control)->Canvas->Rectangle(Rect.Left 1, Rect.Top 1, Rect.Left 15, Rect.Bottom-1); //寫文字
((TComboBox *)Control)->Canvas->Font->Color = clBlack;
((TComboBox *)Control)->Canvas->Font->Name = "宋體";
((TComboBox *)Control)->Canvas->Font->Size = 9; ((TComboBox *)Control)->Canvas->Brush->Style = bsClear;
((TComboBox *)Control)->Canvas->TextOut(Rect.Left 20, Rect.Top 2, ((TComboBox *)Control)->Items->Strings[Index]); //標記當前滑鼠所在項(焦點項)[本例中在外邊畫個藍方框表示]
if(State.Contains(odFocused))
{
((TComboBox *)Control)->Canvas->Pen->Color = clBlue;
((TComboBox *)Control)->Canvas->Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
}
else
{
((TComboBox *)Control)->Canvas->Pen->Color = clWhite;
((TComboBox *)Control)->Canvas->Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
}
} 好了,至此,一個自畫的列表框就完成了。接下來的事情就非常簡單了:
在ComboBox的OnChange事件中寫以下代碼:
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
Label1->Font->Color = colors[ComboBox1->ItemIndex];
} 就完成了Label字體變色的功能,我想不用解釋了吧?運行看看效果吧!
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |