Laden...

TabPage.Text zweizeilig

Erstellt von steffen_dec vor 16 Jahren Letzter Beitrag vor 15 Jahren 6.685 Views
S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 16 Jahren
TabPage.Text zweizeilig

Hallo Leute,

ich stelle in der Bezeichnung eines TabPages zwei Informationen in zwei Zeilen dar:


tabCam.Text = strName + "\r\n" + strJobname;

Dies funktioniert nicht mehr sobald man das Windows-Design auf "Windows klassisch" umgestellt hat. Dann wird CR-LF einfach verschluckt.

Wie kann man den Text dennoch zweizeilig anzeigen lassen?

MFG
Steffen

H
10 Beiträge seit 2008
vor 16 Jahren

Hi steffen,

ohne es getestet zu haben, versuchs mal mit string1 + Environment.Newline + string2

Gruß

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 16 Jahren

Hi,

das funktioniert leider auch nicht 🙁

wenn ich beim debuggen die Eigenschaften nach dem Befehl (genauso wie bei meinem Code auch) anschaue dann steht in der Text-Eigenschaft "String1\r\nString2" und in der Bezeichnung des Tabs steht dann "String1String2"...

Gruß
Steffen

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo steffen_dec,

wenn es nur bei "Windows klassisch" nicht geht, spricht einiges dafür, dass "Windows klassisch" mehrzeilige Tabs einfach nicht unterstützt.

herbivore

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 15 Jahren

Hallo Leute,

ich wollte dieses Problem nochmal in Angriff nehmen. Ich hatte bisher es so gelöst dass ich die zwei Texte mit Bindestrich in einer Zeile angezeigt habe. Bei längeren Texten ist es aber recht unschön.

Mein Ansatz:

im Form_Load (TAB ist mein TabControl):


if (!Application.RenderWithVisualStyles)
            {
                TAB.DrawMode = TabDrawMode.OwnerDrawFixed;
                //TAB.SizeMode = TabSizeMode.Fixed;

                TAB.DrawItem += new DrawItemEventHandler(TAB_DrawItem);
            }


void TAB_DrawItem(object sender, DrawItemEventArgs e)
        {
            TabControl tabControl = (TabControl)sender;
            TabPage currentTab = tabControl.TabPages[e.Index];
            Graphics g = e.Graphics;
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Near;
            sf.LineAlignment = StringAlignment.Center;
            
            string tabText = currentTab.Text;
            
            RectangleF tabRect = (RectangleF)e.Bounds;
            RectangleF textRect = tabRect;

            float fMaxWidth = 0.0f;
            
            string[] myStrings = tabText.Split('\n');
            for (int i = 0; i < myStrings.Length; i++ )
            {
                myStrings[i] = myStrings[i].Replace("\r", "");
                if (g.MeasureString(myStrings[i], currentTab.Font).Width > fMaxWidth)
                    fMaxWidth = g.MeasureString(myStrings[i], currentTab.Font).Width;
            }

            if (tabText.Contains("\n"))
            {
                textRect.Width = fMaxWidth;
                tabRect.Width = fMaxWidth * 1.05f;
            }
            else
            {
                textRect.Width *= 1.1f;
                tabRect.Width *= 1.1f;
            }
            

            if (e.Index == tabControl.SelectedIndex)
            {
                tabRect.Inflate(1, 1);
            }       

            g.Clip = new Region(tabRect);
            g.Clear(Control.DefaultBackColor);
            g.ResetClip();

            g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf);
            sf.Dispose();
        }

der Text wird richtig umgebrochen, nur die Größe des Tabs wo man draufklickt, ist viel zu groß. Ich habe dies versucht mit Hilfe von MeasureString einzuschränken, nur klappt dass wohl nicht ganz...

Hat dass schon mal jemand gemacht und kann mir einen Tip geben was ich da falsch mache?

Vielen Dank
Steffen

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 15 Jahren

Und noch eine Frage zu den TabPages:

Wie kann man die "Header-Width" jeder TabPage manuell setzen?

ich hab nur die Möglichkeit gefunden alle auf einmal zu setzen. (ItemSize und SizeMode auf Fixed des TabControls)

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo steffen_dec,

ich habe zugegeben keine Ahnung, woran es bei dir genau liegt, aber hier ein paar Ideen, an denen es liegen könnte:

herbivore

T
511 Beiträge seit 2008
vor 15 Jahren

Die Fragen die Du hast, kannst Du nur dadurch beantworten, indem Du die ein eigenes TabControl schreibst.
Da zeichnest Du dann die Tabreiter und die Controls so wie Du es brauchst und fertig. Ist zwar etwas Aufwand, aber das funktioniert einwandfrei.

Nicht für das Leben, für die Arbeit lernen wir ...
Windows ist Klasse, ich nehme es um Linux zu downloaden ....

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 15 Jahren

ich habe jetzt die SizeMode auf Fixed gestellt und so gehts jetzt, nur werden alle TabPage-Header auf die gleiche Breite gesetzt...


        void TAB_DrawItem(object sender, DrawItemEventArgs e)
        {
            TabControl tabControl = (TabControl)sender;
            TabPage currentTab = tabControl.TabPages[e.Index];
            Graphics g = e.Graphics;
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Near;
            sf.LineAlignment = StringAlignment.Center;
            
            string tabText = currentTab.Text;
            
            RectangleF tabRect = (RectangleF)e.Bounds;
            RectangleF textRect = tabRect;

            float fMaxWidth = 0.0f;
            
            string[] myStrings = tabText.Split('\n');
            for (int i = 0; i < myStrings.Length; i++ )
            {
                myStrings[i] = myStrings[i].Replace("\r", "");
                if (g.MeasureString(myStrings[i], currentTab.Font).Width > fMaxWidth)
                    fMaxWidth = g.MeasureString(myStrings[i], currentTab.Font).Width;
            }

            //Korrekturwert
            fMaxWidth += 5;

            if (tabControl.ItemSize.Width < (int)Math.Ceiling(fMaxWidth))
                tabControl.ItemSize = new Size((int)Math.Ceiling(fMaxWidth), tabControl.ItemSize.Height);

            if (e.Index == tabControl.SelectedIndex)
            {
                tabRect.Inflate(1, 1);
            }       

            g.Clip = new Region(tabRect);
            g.Clear(Control.DefaultBackColor);
            g.ResetClip();

            g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf);
            sf.Dispose();
        }

sobald ich die sizemode auf normal stelle, lässt sich die Breite nicht einstellen da er dann automatisch breiter macht weil er ja kein CRLF kennt....

Weiß jemand wie man jede Tabpage-Header-Width manuell setzen kann?

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 15 Jahren

ich habe jetzt ein workaround gefunden...

ich setze die SizeMode auf Normal und übergebe dem TabPage den längsten String der in den zwei Zeilen vorkommt und überschreibe diesen dann in DrawItem mit den richtigen Daten (zweizeilig)...

916 Beiträge seit 2008
vor 15 Jahren

Dann sind doch aber trotzdem alle Tabs noch gleich lang, zwar so lang wie der längste text, aber alle gleich lang, oder seh ich das flasch?

Again what learned...

5.299 Beiträge seit 2008
vor 15 Jahren

hey!

Du könntest doch auch die blöden Reiter verstecken, und ordentliche Buttons anbringen.


         //diese Einstellungen verstecken die Reiter erst zur Laufzeit
         //zur Design-Zeit sind die Reiter ja sehr nützlich
         tabControl1.SizeMode = TabSizeMode.Fixed;
         tabControl1.ItemSize = new Size(0, 1);
         tabControl1.Appearance = TabAppearance.Buttons;

Oder gleich ein FramesetLike proggen, und die Info mit einem (evtl. datengebundenen) Label darstellen.

Der frühe Apfel fängt den Wurm.