WinForm中重繪TabControl選項卡標題

2022-05-09 20:32:12 字數 2432 閱讀 8183

最近開發winform頻繁使用了tabcontrol控制項,這個控制項的選項卡沒有backgroundimage這個屬性,那麼如何為其各個選項卡新增背景呢?(這裡說的是每個tabpage的頭部,也就是標題,不是工作區域。)

最開始用到tabcontrol的時候,我的每個選項卡是寫死的,而後由於專案需求又動態新增了tabcontrol並生成各個選項卡,而兩次我都要重繪其標題,因此在這裡把我當時兩種情形下重繪的方法通過乙個例子一起分享出來。

首先先在窗體拖個tabcontrol控制項,然後更改了其alignment屬性為left,使其選項卡在左邊。然後可以通過更改其itemsize調節每個選項卡的大小。值得注意的是,因為在此是把tabcontrol向左旋轉了90°,所以此時設定寬的時候實際上改變的是它的高,設定高的時候實際上改變的是它的寬。而且設定寬(改變高)發現無效是因為受選項卡文字字型所影響,可相應地改變字型尺寸。調整一番後的效果圖:

接著就要進入正題重繪其選項卡背景了。首先要把它的drawmode屬性改為ownerdrawfixed,改了這個才會讓使用者自己繪製標題生效。接著給它新增drawitem事件。事件重繪方法如下:

1

private

void tabmain_drawitem(object

sender, drawitemeventargs e)

222 }

view code

最終效果圖:

以上是寫死的情況下為其重繪標題,現在來介紹當選項卡是動態生成時為其重繪標題的方法。在說明此之前,我們先為原有tabcontrol新增selectedindexchanged事件,通過獲取其selectedindex從而知道哪個選項卡被點選了,在此,我在第二個選項卡裡面動態新增另乙個tabcontrol並生成其各個tabpage。**如下:

1

private

void tabmain_selectedindexchanged(object

sender, eventargs e)216

this.tabsub.itemsize = new system.drawing.size(80, 80

);17

this.tabsub.font = new system.drawing.font("

宋體", 20

);18

this.tabsub.dock =dockstyle.fill;

19this.tabmain.tabpages[1

].controls.add(tabsub);

20break;21

case2:

22break;23

case3:

24break;25

}26 }

view code

在外部預先定義好要生成的tabcontrol變數:

tabcontrol tabsub = new tabcontrol();
效果如下:

好了,接下來也該為它重繪下標題了。首先在上面設定tabsub屬性的**下新增這兩行:

this.tabsub.drawitem += new system.windows.forms.drawitemeventhandler(this.tabsub_drawitem);

this.tabsub.drawmode = system.windows.forms.tabdrawmode.ownerdrawfixed;

第一行是為tabsub新增繪製標題的事件,第二行是為了讓系統使用我們自己繪製的樣式。

然後自己寫個繪製方法,**如下:

1

private

void tabsub_drawitem(object

sender, drawitemeventargs e)2;

10for (int i = 0; i < this.tabsub.tabcount; i++)

1117

}18 }

view code

效果如下:

ok,至此大功告成。當然上述**是有缺陷的,當你輪換左邊選項卡最後又點到第二個選項卡時,它會再載入多一次,這個只需要在當初繪製的時候加個判斷就行了,可以判斷當前選項卡下是否已經包含了這些控制項,或者定義個布林變數用來判斷是否已經載入就可以了。

解決winform中的panel重繪閃爍問題

利用winform開發時,可能都會遇到乙個問題,就是在panel中不停的重繪圖形時,圖形會不停的閃爍。要解決這個辦法只需要開啟雙緩衝即可,由於初學c 理解的不是很深,所以不多做解釋。以下 親測可以解決這個問題 首先建立乙個自己的panel類 using system using system.col...

在WPF窗體中重繪

寫這篇主要是為了驗證任何元素自身都具備繪圖功能.在預設window中重寫onrender方法 protected override void onrender drawingcontext drawingcontext 結果還是空白一片.窗體的預設視覺樹 解決方法1 去掉預設視覺樹 protecte...

在WPF窗體中重繪

原文 在wpf窗體中重繪 寫這篇主要是為了驗證任何元素自身都具備繪圖功能.在預設window中重寫onrender方法 protected override void onrender drawingcontext drawingcontext 結果還是空白一片.窗體的預設視覺樹 解決方法1 去掉預...