C# tabControl DrawFixed

Я использую TabControl и DrawFixed. Я просто хочу рисовать только вкладки, а не панель под ними.

tabПанель управления

Как я могу удалить его?

Также я хотел бы спросить, могу ли я изменить размер вкладок? У меня есть длинный текст, который я хотел бы видеть полностью, если он выбран, но я бы хотел, чтобы он был обрезан, если он не активен.

Я слежу за событием рисования, но оно всегда рисует вкладку одного размера.

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);

Заранее спасибо.


person sczdavos    schedule 26.08.2012    source источник
comment
Могу ли я спросить о намерении использовать OwnerDrawFixed? TabControl сложно настроить, он использует устаревший метод рисования и содержит известные ошибки. Также вы наследуете и настраиваете TabControl или просто используете его как есть?   -  person J Collins    schedule 27.08.2012
comment
@JCollins Я рисую на нем несколько изображений. Это окно чата. Доступность пользователя, имя и новое сообщение указываются значком сообщения и оранжевым фоном. У меня есть только свои TabPages. TabControl не изменился.   -  person sczdavos    schedule 27.08.2012
comment
Где именно событие рисования, которое вы переопределяете? Если бы вы переопределили TabControl и создали свой собственный наследующий элемент управления, вы могли бы использовать SetStyle(ControlStyles.UserPaint, True) в конструкторе, а затем переопределить OnPaint и/или OnPaintBackground, тогда у вас будет полный контроль. Хотя тогда вы будете нести ответственность за рисование вкладок.   -  person J Collins    schedule 27.08.2012
comment
@JCollins Я использую событие DrawItem для TabControl, если вы имеете в виду это. У меня нет собственного TabControl, и я думаю, что если я действительно захочу это сделать, это будет сложно. Могу ли я задать вам часть 2 моего вопроса: как изменить размер неактивных вкладок с обрезанным текстом? А знаете ли вы о каком-то сайте, где показаны некоторые стили в событии Draw? Я бы хотел использовать стиль вкладки по умолчанию, но также хотел бы иметь собственный рисунок. Так что немного вдохновения, как установить стиль вкладок.   -  person sczdavos    schedule 27.08.2012
comment
Если я не ошибаюсь, вы спрашиваете, почему размеры вкладок не изменяются для текста переменной длины? TabControls очень мало контролируют размер вкладки размера, либо он фиксируется, как в вашем случае, либо система автоматически устанавливает размер. По сути, нет способа, наследуя или нет, переопределить это поведение. Что касается рисования, опять же, либо вы берете на себя полный контроль, либо оставляете это на усмотрение системы. Я потратил кучу времени, пытаясь настроить управление вкладками, и это довольно болезненно. Никаких конкретных ссылок, но на sourceforge я обращаюсь за проектами, которые сделали люди.   -  person J Collins    schedule 27.08.2012
comment
@JCollins Я использовал SetStyle(ControlStyles.UserPaint, True) и использовал некоторый код для стилизации компонента. Но я бы хотел использовать собственное событие OnDrawItem. Потому что в моем приложении есть MainForm некоторые переменные и изображения, которые я хочу использовать в событии рисования. Как я могу это сделать?   -  person sczdavos    schedule 18.09.2012


Ответы (2)


Хронологически в своем вопросе вы спрашивали, как избавиться от этой полосы вверху. Если вы настаиваете на использовании «фальшивых» страниц вкладок, где вкладки просто управляют содержимым фиксированного набора элементов управления, то уменьшение высоты элемента управления вкладкой до точки, где это не видно, вероятно, является приемлемым решением. Я только что попробовал, и с некоторыми изменениями он выглядит в основном так, как я думаю, вам нужно. Для справки, я бы порекомендовал на самом деле использовать страницы вкладок по назначению, то есть в качестве хостов для элементов управления, даже если вы создаете настраиваемый элемент управления, который объединяет все элементы управления, которые вы хотите видеть. Это будет лучше соответствовать парадигме табуляции.

Для второго пункта вы хотели бы изменить размер вкладок. Невозможный. Платформа предоставляет два варианта для DrawStyle, Normal и OwnerDrawFixed. Normal позволяет Windows устанавливать размер вкладки на основе текста и шрифта, OwnerDrawFixed означает, что размер вкладки полностью фиксирован. Над этим больше нет контроля. Однако OwnerDrawFixed дает вам доступ к событию OnDrawItem, которое вы хотите использовать для рисования самих вкладок.

Теперь кажется, что вы укусили пулю и установили для UserPaint значение True, что означает, что теперь вы делаете весь рисунок. Я рекомендую на этом этапе установить DrawStyle обратно на Normal, тогда вы можете добавить некоторый закулисный текст, чтобы Windows автоматически контролировала ширину вкладок. Я предупреждаю, что это не будет очень надежным, поскольку у всех разные настройки шрифта и несколько пикселей, и ничего не будет отображаться правильно.

Итак, здесь я укажу на TabControl.GetTabRect(index As Integer), метод, который вы можете использовать для получения ограничивающего прямоугольника данной вкладки. Я использую это в цикле по всем индексам вкладок, а затем делаю весь рисунок, который мне нужен для вкладки, в прямоугольнике, предоставленном на каждой вкладке. Это означает, что мне не нужно использовать OwnerDrawFixed, чтобы получить границы для рисования внутри.

Тем не менее, если вам нужен лучший контроль, вы на 80% просто реализуете именно тот контроль, который хотите видеть, начиная с Control или UserControl. Аналогичного вида можно добиться, перекрывая кнопки с помощью некоторой логики для их рисования и размещения. Тогда вы также можете получить весь текстовый вид, который хотите. Я сам думал так же, но не стал, потому что я все еще принимаю TabPages. Поскольку вы свободны от этого, было бы еще проще...

person J Collins    schedule 18.09.2012
comment
В каком методе вы перебираете все вкладки и рисуете? - person Juozas Kontvainis; 02.01.2013

Просто используйте свойство текста страницы по умолчанию, оно автоматически исправит размер вкладки для вас в соответствии с размером текста. свойство элемента управления вкладкой, а не страницы вкладки. Я надеюсь, что это поможет вам в полной мере.

person sm.abdullah    schedule 07.02.2013