技術文章 > C++ Builder 中的自畫功能(1)

C++ Builder 中的自畫功能(1)

2019-07-01 08:00

文檔管理軟件,文檔管理系統,知識管理系統,檔案管理系統的技術資料:
也許你都看見過一些列表框啦、下拉框啦什么的,他們的選項不是文字而是圖形。比如像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];
}
体彩7星彩规则