PDA

View Full Version : مشکل با tabControl



sg.programmer
دوشنبه 24 مهر 1396, 22:37 عصر
سلام
1)چطور میشه رنگ عنوان مربوط به تب ها را تغییر داد؟
2)چطور میشه کاری کرد که وقتی وارد یک تبی میشیم به طور پیش فرض یکی از باکس ها فکوس شده باشه

vahidwss
سه شنبه 25 مهر 1396, 04:10 صبح
جواب سوال اول :

این کد رو فرم لود بزن :

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tab Control1_DrawItem);


و این کد رو هم تو همون کلاس فرم بزار:

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == tabControl1.SelectedIndex)
{
e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text,
new Font(tabControl1.Font, FontStyle.Bold),
Brushes.Red,
new PointF(e.Bounds.X + 3, e.Bounds.Y + 3));
}
else
{
e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text,
tabControl1.Font,
Brushes.Black,
new PointF(e.Bounds.X + 3, e.Bounds.Y + 3));
}
}


جواب سوال دوم : (اگه سوال رو درست فهمیده باشم)

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabControl1.SelectedIndex == 1)
{
textBox1.Focus();
}
}

با کلیک روی تب دوم تکست باکس 1 که تو همون تب هست به حالت انتخاب در میاد.

sg.programmer
سه شنبه 25 مهر 1396, 17:03 عصر
تشکر مهندس فقط بعد از رنگی شدن تب ها : موقعیت تب ها چپ به راست میشه
باید راست چین بشه

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == tabControl1.SelectedIndex)
{
e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text,
new Font(tabControl1.Font, FontStyle.Bold),
Brushes.Red,
new PointF(e.Bounds.X + 3, e.Bounds.Y + 3));
}
else
{
e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text,
tabControl1.Font,
Brushes.Black,
new PointF(e.Bounds.X + 3, e.Bounds.Y + 3));
}
}

vahidwss
سه شنبه 25 مهر 1396, 18:00 عصر
برای این کار هر دو خاصیت RightToLeft و RightToLeftLayout تب رو True کن.
و کد رویداد tabControl1_DrawItem رو به شکل زیر تغییر بده:

private void TabControl1_DrawItem(object sender,
System.Windows.Forms.DrawItemEventArgs e)
{
var tabRect = this.tabControl1.GetTabRect(e.Index);
tabRect.Inflate(-2, -2);
var sf = new StringFormat(StringFormat.GenericDefault);
if (this.tabControl1.RightToLeft == System.Windows.Forms.RightToLeft.Yes &&
this.tabControl1.RightToLeftLayout == true)
{
tabRect =new Rectangle(
this.tabControl1.ClientRectangle.Width - tabRect.Width - tabRect.X,
tabRect.Y,
tabRect.Width,
tabRect.Height);


sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
}


if (e.Index == tabControl1.SelectedIndex)
{
e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text,
new Font(tabControl1.Font, FontStyle.Bold),
Brushes.Red,
tabRect, sf);
}
else
{
e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text,
tabControl1.Font,
Brushes.Black,
tabRect, sf);
}

}

sg.programmer
سه شنبه 25 مهر 1396, 18:53 عصر
خیلی عالی بود مهندس تشکر

راستی نمیشه این خاصیت نرمال باشه - چون فیکس که میشه تب یکخورده ناجور میشه
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;

vahidwss
سه شنبه 25 مهر 1396, 19:21 عصر
ممنون - خواهش میکنم
متاسفانه با این کد استایل تب به حالت کلاسیک و داخلی میره که امکان ویرایش داره ولی در حالت نرمال روی استایل ویندوز میره و TabControl1_DrawItem دیگه اثر نمیکنه بهش.
اگه روی گرافیک حساس هستین پروژتون رو با WPF بسازید چون آزادی بسیار زیادی از این لحاظ داره.مثل تصویر زیر :

http://vbcity.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.63.59.65/TabControlDemo.jpg