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

Разработваме gwt-уеб приложение с Google App Engine. Сега нашето приложение стана бавно поради много jstl логика в jsp страниците. По-рано исках да използвам услугата memcache на appengine, но след като прочетох някои документи, разбрах, че „Ehcache“ е по-добър от memcache с поддръжка на gae.

Поправете ме, ако греша, и моля, отговорете ми с подходящо решение, ако някой има идея относно това.

  -  person sczdavos    schedule 27.08.2012
comment
Ако не греша, питате защо разделите не се преоразмеряват за текст с променлива дължина? TabControls имат много малък контрол върху размера на раздела за размер, или той е фиксиран, както във вашия случай, или системата автоматично задава размера. По принцип няма начин, наследяване или не, да се отмени това поведение. Що се отнася до рисуването, отново или поемате пълен контрол, или го оставяте на системата. Прекарах много време в опити да персонализирам контролата на раздела и това е доста болезнено. Няма конкретни връзки, но sourceforge е моят избор за проекти, които хората са направили.   -  person J Collins    schedule 27.08.2012
comment
@JCollins Използвах SetStyle(ControlStyles.UserPaint, True) и използвах малко код за стилизиране на компонент. Но бих искал да използвам собствено събитие OnDrawItem. Защото имам в моето приложение MainForm някои променливи и изображения, които искам да използвам в събитие Drawing. Как мога да направя това?   -  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