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
Hi steffen,
ohne es getestet zu haben, versuchs mal mit string1 + Environment.Newline + string2
Gruß
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
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
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
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)
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
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 ....
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?
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)...
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...
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.