2012-08-26 22 views
1

我正在使用TabControl,並且我有DrawFixed。我只想繪製標籤而不是它下面的面板。C#tabControl DrawFixed

tabControl panel

如何刪除呢?

另外我想問一下,我可以更改標籤大小嗎?我有很長的文本,如果它被選中,我希望看到所有文本,但是如果它沒有激活,我希望看到它被裁剪。

我已經在繪製事件中跟隨,但它總是繪製相同大小的標籤。

if (e.State == DrawItemState.Selected) 
{ 
    e.Graphics.FillRectangle(Brushes.White, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height); 
} 
else 
{ 
    e.Graphics.FillRectangle(Brushes.LightGray, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height); 
    text = text.Length > 10 ? text.Substring(0, 10) + "..." : text; 
} 

e.Graphics.DrawString(text, e.Font, Brushes.Black, e.Bounds.Left + 17, e.Bounds.Top + 3); 

在此先感謝。

+0

我可以問使用OwnerDrawFixed的意圖嗎? TabControl是一個難以調整的控件,它使用了傳統的繪圖方法並且具有已知的引導錯誤。你也繼承和定製TabControl或只是使用它? –

+0

@JCollins我正在繪製一些圖像。這是聊天窗口。有用戶可用性,名稱,它通過消息圖標和橙色背景指示新消息。我只有我自己的TabPages。 TabControl沒有變化。 – sczdavos

+0

你在哪裏重寫抽獎事件? 如果您要重寫TabControl並創建自己的繼承控件,可以在構造函數中使用SetStyle(ControlStyles.UserPaint,True),然後重寫OnPaint和/或OnPaintBackground,然後您將擁有完全控制權。雖然那麼你將負責繪製標籤。 –

回答

1

按照時間順序在您的問題中,您已經問過如何擺脫頂部的酒吧。如果您堅持使用「虛假」標籤頁,而標籤只控制固定控件集的內容,那麼將標籤控件的高度縮小到不可見的位置可能是可接受的解決方案。我只是嘗試了一下,並調整了一下,看起來大部分是我認爲你在做的事。對於記錄,我建議實際使用標籤頁作爲預期,即作爲控件的主機,即使您製作的自定義控件將所有可見的控件集合在一起。這將更好地適應標籤範例。

對於第二點你想調整標籤。不可能。該框架爲DrawStyle,Normal和OwnerDrawFixed提供了兩個選項。 Normal允許Windows根據文本和字體設置標籤大小,OwnerDrawFixed表示標籤大小是完全固定的。沒有更多的控制權。然而,OwnerDrawFixed可讓您訪問OnDrawItem事件,這是您想用於繪製標籤本身的內容。

現在看來你已經咬住了子彈並將UserPaint設置爲True,這意味着你現在正在做所有的繪圖。我建議在這一點上設置DrawStyle回到Normal,然後你可以把一些幕後的文本弄得讓Windows自動控制標籤寬度。我會警告這不會很穩健,因爲每個人都有不同的字體設置和幾個像素關閉,沒有什麼會畫出正確的。

所以在這裏我將指出TabControl.GetTabRect(index As Integer),您可以使用該方法來獲取給定選項卡的邊界矩形。我在一個遍歷所有選項卡索引的循環中使用它,然後爲每個選項卡提供的矩形內的選項卡執行所需的所有繪製。這意味着我不需要使用OwnerDrawFixed來獲取內部的邊界。

但是,如果您想要更好的控制,您只需實現您想要查看的任何控件的80%,從ControlUserControl開始。類似的外觀可以通過重疊的按鈕和一些邏輯來繪製和佈局。然後你可以得到你想要的所有文本外觀。我自己也考慮過,但沒有,因爲我仍然託管TabPages。由於你是免費的,它會更容易...

+0

用什麼方法遍歷所有選項卡並執行繪圖? –

0

只是使用頁面文本的默認屬性,它會根據文本的大小自動修復你的標籤大小..然後通過你自己畫你的文字..如果你仍然需要額外的空間來繪製圖像或其他東西,那麼使用padding,這是tab控件的屬性而不是tab頁。我希望這會對你有幫助。