PDA

View Full Version : حرفه ای: ساخت یک label با زمینه شفاف و متن متحرک



alireza264
یک شنبه 18 مرداد 1394, 02:40 صبح
سلام
ساخت یک label با زمینه نیمه شفاف با امکان تعیین میزان شفافیت و متن متحرک
برای ساخت ابتدا یک User Control بنام translucent_Scroller_Label به پروژه اضافه کنید
و بعد دستورات مورد نظر رو درون اضافه کنید. توضیح دستورات در مقابل هر دستور نوشته شده که شما می تونید به دلخواه تغییرشون بدبد. یا User Control های دیگه ای رو بسازید
کلیه فایل های به صورت کامل وبه صورت یک فایل Zip نیز در پایین قرار گرفته
امیدوارم مفید واقع بشه

134047

دانلود سورس کامل
134046



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class translucent_Scroller_Label : UserControl
{
// تعریف متغیر های مورد نیاز
#region Local Variables

// لیبل حاشیه داشته باشد یا خیر
public enum BoxBorder
{
None,// بدون حاشیه
Single,// دارای حاشیه
};



private BoxBorder _boxborder = BoxBorder.None;// رسم اولیه بدون حاشیه
private System.Drawing.Color _backColor = Color.Black; //تغیین رنگ زمینه
private System.Drawing.Color _borderColor = Color.White; //تغیین رنگ متن
private int _radius = 20; // میزان گرد شدن گوشه های کنترل بین 0 تا 90
private int _opacity = 125; // میزان شفافیت بین صفر تا 255
private string _text = "Text"; // متن اولیه

// محل قرار گرفتن متن در کنترل
public enum TextAlignment
{
Left,
Center,
Right
};

// جهت حرکت متن
public enum textmovedirection
{
None,
RightToLeft,
DownToUp,
LeftToRight,
UpToDown
}

protected TextAlignment _textAlign = TextAlignment.Center; //محل قرار گرفتن متن هنگام رسم اولیه
protected textmovedirection _movedirection = textmovedirection.None;// جهت حرکت متن هنگام رسم اولیه

// هنگامیکه موس روی کنترل قرار گیرد true
// False و در غیر اینصورت
protected bool _isSelected = false;

private System.Drawing.Color _mouseover_textcolor = Color.LightGray;//تعیین رنگ متن هنگامیکه موس روی کنترل قرار گیرد

// مختصات متن در کنترل
protected int pointX = 0;
protected int pointY = 0;

// مستطیل حاوی متن
protected Rectangle txtRect = new Rectangle();

// مستطیل رسم لیبل
protected Rectangle labelRect = new Rectangle();




#endregion



public translucent_Scroller_Label()
{
InitializeComponent();

base.BackColor = Color.Transparent;// شفاف کردن زمینه
// انتخاب استایل برای کنترل (فرم) - برای استفاده از مد گرافیکی
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, false);
// اعمال استایل کنترل
UpdateStyles();
// مقدار دهی اولیه به نمونه ای ایجاد شده از این کنترل در فرم- مقدار دهی اولیه هنگام استفاده
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
//
// timer1
//
this.timer1.Enabled = false;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
this.timer1.Interval = 100;

}

private void timer1_Tick(object sender, System.EventArgs e)
{
this.Invalidate();// ترسیم انجام شود
this.Update(); // کنترل به هنگام شود
}


//Properties تعریف خصوصیات کنترل جهت نمایش در پنجره
#region Properties

// تعریف مجدد خصوصیت رنگ زمینه
[DefaultValue(typeof(Color), "Black")]
public new Color BackColor
// خوندن مقدار فعلی یا دادن مقدار جدید رنگ زمینه
{
get { return _backColor; }
set
{
_backColor = value;
Invalidate();
}
}


//Appearance تعریف خصوصیت داشتن یا نداشنن خط حاشیه و قرار داد در
[Bindable(true),
Category("Appearance"),
DefaultValue(BoxBorder.None),
Description(" داشتن یا نداشنن خط حاشیه")]
public BoxBorder BoxBorderStyle
{
// خوندن مقدار فعلی یا دادن مقدار جدید خط حاشیه
get { return _boxborder; }
set
{
_boxborder = value;
this.Invalidate();
}
}

//Appearance تعریف خصوصیت رنگ خط حاشیه و قرار دادن در
[DefaultValue(typeof(Color), "White"),
Category("Appearance"),
Description("خصوصیت رنگ خط حاشیه")]
public Color BorderColor
{
get { return _borderColor; }
set
{
_borderColor = value;
Invalidate();
}
}

//Appearance تعریف خصوصیت میزان شفافیت و قرار دادن در
[Bindable(true),
Category("Appearance"),
DefaultValue(125),
Description("خصوصیت میزان شفافیت مقدار بین 0 تا 255")
]
public int Opacity
{
get { return _opacity; }
set
{
_opacity = value;
this.Invalidate();
}
}

//Appearance تعریف خصوصیت متن درون کنترل و قرار دادن در
[Bindable(true),
Category("Appearance"),
DefaultValue("Text"),
Description("خصوصیت متن")
]
public String Caption
{
get { return _text; }
set
{
_text = value;
this.Invalidate();
}
}

// تعریف مجدد خصوصیت فونت متن

public override Font Font
{
get { return base.Font; }
set
{
base.Font = value;
this.Invalidate();
}
}

// تعریف مجدد خصوصیت رنگ متن
public override Color ForeColor
{
get { return base.ForeColor; }
set
{
base.ForeColor = value;
this.Invalidate();
}
}

//Appearance تعریف خصوصیت تعیین رنگ متن هنگامیکه موس روی کنترل قرار گیردو قرار دادن در
[Bindable(true),
Category("Appearance"),
Description("خصوصیت تعیین رنگ متن هنگامیکه موس روی کنترل قرار گیرد"),
]
public Color MouseOver_TextColor
{
get { return _mouseover_textcolor; }
set { _mouseover_textcolor = value; this.Invalidate(); }
}

//Appearance تعریف خصوصیت محل قرارگیری متن در کنترل (راست چپ یا وسط )و قرار دادن در
[Bindable(true),
Category("Appearance"),
Description("خصوصیت محل قرارگیری متن در کنترل "),
DefaultValue(TextAlignment.Center)
]
public TextAlignment TextAlign
{
get { return _textAlign; }
set
{
_textAlign = value;
this.Invalidate();
}
}



//Layout تعریف خصوصیت میزان گرد شدن گوشه های کنترل بین 0 تا 90و قرار دادن در
[Bindable(true),
Category("Layout"),
DefaultValue(20),
Description("خصوصیت میزان گرد شدن گوشه های کنترل-مقدار بین 0 تا 90")
]
public int Radius
{
get { return _radius; }
set
{
_radius = value;
this.Invalidate();
}
}


//Behavior تعریف خصوصیت متن حرکت کند یا خیر و قرار دادن در
[Bindable(true),
Category("Behavior"),
Description("خصوصیت متن حرکت کند یا خیر"),
DefaultValue(false)
]
public bool MovingActive
{
get
{
return this.timer1.Enabled;
}
set
{
if (value == false) _movedirection = textmovedirection.None;
this.timer1.Enabled = value;
this.Invalidate();
}
}

//Behavior تعریف خصوصیت جهت حرکت متن و قرار دادن در
[Bindable(true),
Category("Behavior"),
Description("خصوصیت جهت حرکت متن"),
DefaultValue(textmovedirection.None)
]
public textmovedirection TextMoving
{
get { return _movedirection; }
set
{
_movedirection = value;
this.Invalidate();
}
}




#endregion



// تعریف متد ها
#region Methods

// ترسیم شی نهایی
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;// اگر حالت چند رنگ داشتیم لبه های رنگ ها دیده نشه

if (_boxborder == BoxBorder.Single) DrawBorder(e.Graphics);// رسم حاشیه

DrawLabelBackground(e.Graphics); // ترسیم رنگ زمینه
DrawText(e); // ترسیم متن
}

//متد رسم حاشیه
private void DrawBorder(Graphics g)
{
Rectangle rect = this.ClientRectangle;// تعریف یک مستطیل درون کنترل که از خصوصیت های کنترل ارثبری میکند
// تعیین اندازه طول وعرض مستطیل تعریف شده
// چون اندازه مستطیل بدلیل ارثبری با اندازه کنترل یکی است یک واحد از طول و عرض کم شده تا دیده شود
rect.Width--;
rect.Height--;

// رسم مستطیل با توجه به اندازه ومیزان گرد شدن لبه
using (GraphicsPath bp = GetPath(rect, _radius))
{
using (Pen p = new Pen(_borderColor))
{
g.DrawPath(p, bp);
}
}
}

// ترسیم رنگ زمینه مستطیل و محل قرارگیری از لبه های کنترل

private void DrawLabelBackground(Graphics g)
{
Rectangle rect = this.ClientRectangle;
labelRect = rect;

rect.X++;// فاصله محل قرارگیری از لبه کناری
rect.Y++;// فاصله محل قرارگیری از لبه بالایی
rect.Width -= 2; // میزان فرو رفتگی رنگ نسبت به حاشیه در عرض
rect.Height -= 2;// میزان فرو رفتگی رنگ نسبت به حاشیه در ارتفاع

// رسم مستطیل متن
using (GraphicsPath bb = GetPath(rect, _radius))
{
using (Brush br = new SolidBrush(Color.FromArgb(_opacity, _backColor)))
{
g.FillPath(br, bb);
}
}
}

protected GraphicsPath GetPath(Rectangle rc, int r)
// GraphicsPath ساخت لبه های گرد شده با استفاده
//rنععین میزان گردن شدن لبه ها با
{
int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;
r = r << 1;
GraphicsPath path = new GraphicsPath();
//path اگر میزان گردن شدن بیشتر از صفر بودرسم شکل با استفاده از
if (r > 0)
{
if (r > h) { r = h; }; // اگر مقدار گرد شدن بیشتر از ارثفاع بود
if (r > w) { r = w; }; // اگر مقدار گرد شدن بیشتر از عرض بود
path.AddArc(x, y, r, r, 180, 90); //گرد شدن بالا سمت چپ
path.AddArc(x + w - r, y, r, r, 270, 90); //گرد شدن بالا سمت راست
path.AddArc(x + w - r, y + h - r, r, r, 0, 90); //گرد شدن پایین سمت راست
path.AddArc(x, y + h - r, r, r, 90, 90); //گرد شدن پایین سمت چپ
path.CloseFigure();
}
else // اگر میزان گردن شدن بیشتر از صفر نبود یک مستطیل رسم کن
{
path.AddRectangle(rc);
}

return path;
}


protected void DrawText(PaintEventArgs pe)
{
// تعیین اندازه محدوده متن با توجه به فونت برای رسم
SizeF sz = pe.Graphics.MeasureString(_text, base.Font);


// تشخیص جهت حرکت متن و اجرای متد مربوط
switch (_movedirection)
{
case textmovedirection.None:
NoMove();
break;
case textmovedirection.RightToLeft:
MoveRightToLeft();
break;
case textmovedirection.DownToUp:
MoveDownToUp();
break;
case textmovedirection.LeftToRight:
MoveLeftToRight();
break;
case textmovedirection.UpToDown:
MoveUpToDown();
break;
}

// رسم مستطیل حاوی متن
txtRect = new Rectangle(this.pointX, this.pointY, (int)sz.Width + 1, (int)sz.Height);

// اگر موس روی کنترل قرار گرفت
// isSelected=true
// ورنگ متن مجدد باید تنظیم شود
Brush brush_Text = new SolidBrush(base.ForeColor);
Brush brush_Textmouseover = new SolidBrush(_mouseover_textcolor);


if (_isSelected)
pe.Graphics.DrawString(_text, base.Font, brush_Textmouseover, txtRect);
else
pe.Graphics.DrawString(_text, base.Font, brush_Text, txtRect);
}


// متد متن بدون حرکت
protected void NoMove()
{
// اگر متن بدون حرکت باشد فقط کافیست متن با توجه به محل قرارگیری رسم شود
switch (_textAlign)
{
case TextAlignment.Left:
pointX = (int)this.labelRect.X;
break;
case TextAlignment.Center:
pointX = (this.labelRect.Width - this.txtRect.Width) / 2;
break;
case TextAlignment.Right:
pointX = (this.labelRect.Width - this.txtRect.Width);
break;
}
pointY = (this.labelRect.Height - this.txtRect.Height) / 2;
}


// متدحرکت راست به چپ متن
protected void MoveRightToLeft()
{
// فقط کافیست که فاصله محل متن ازلبه کناری کاهش یابد و اگر از منفی اندازه عرض کمتر شده آنرا مجدد تنظیم کنیم

if (pointX < -this.txtRect.Width)
pointX = this.labelRect.X + this.labelRect.Width;
else
pointX -= 2;

// در این حالت محل قرارگیری تنظبیم شده متن اهمیتی ندارد و متن نسبت به ارتفاع همواره در وسط است
pointY = (this.labelRect.Height - this.txtRect.Height) / 2;
}

// متدحرکت چپ به راست متن
protected void MoveLeftToRight()
{
// فقط کافیست که فاصله محل متن ازلبه کناری افزایش یابد و اگر از اندازه عرض بعلاوه محل متن بیشتر شد آنرا مجدد تنظیم کنیم
if (pointX > this.labelRect.X + this.labelRect.Width)
pointX = this.labelRect.X - this.txtRect.Width;
else
pointX += 2;
// در این حالت محل قرارگیری تنظبیم شده متن اهمیتی ندارد و متن نسبت به ارتفاع همواره در وسط است
pointY = (this.labelRect.Height - this.txtRect.Height) / 2;
}

// متدحرکت پایین به بالا
protected void MoveDownToUp()
{
// در این حالت محل قرارگیری تنظبیم شده متن اهمیتی ندارد و متن نسبت به عرض همواره در وسط است
pointX = (this.labelRect.Width - this.txtRect.Width) / 2;

// فقط کافیست که فاصله محل متن ازلبه بالایی کاهش یابد و اگر از منفی اندازه ارتفاع کمتر شده آنرا مجدد تنظیم کنیم
if (pointY < -this.txtRect.Height)
pointY = (int)this.labelRect.Y + this.labelRect.Height;
else
pointY -= 2;
}


// متدحرکت بالا به پایین ا
protected void MoveUpToDown()
{
pointX = (this.labelRect.Width - this.txtRect.Width) / 2;
if (pointY > this.labelRect.Y + this.labelRect.Height)
pointY = (int)this.labelRect.Y - this.labelRect.Height;
else
pointY += 2;
}


// اگر موس رو کنترل قرار گرفت
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
_isSelected = true;
this.Invalidate();
}

// اگر موس از روی کنترل خارج شد
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
_isSelected = false;
this.Invalidate();
}


}

#endregion
}



دانلود سورس کامل
134046

armin.hashemi
یک شنبه 18 مرداد 1394, 14:09 عصر
سلام
میش اینو جوری عوض کنید تا بشه ارش بجای Messagebox استفاده کرد

mahtab_Asadi
یک شنبه 18 مرداد 1394, 18:44 عصر
سلام
میشه بگید کاربردش چیه و به چه دردی میخوره

حسن1370
دوشنبه 19 مرداد 1394, 23:53 عصر
سلام
میشه بگید کاربردش چیه و به چه دردی میخوره

سلام
دوست عزیز mahtab_Asadi بجای انتقاد کردن . شما یک نمونه کاربردی بذار

alireza264
پنج شنبه 22 مرداد 1394, 12:37 عصر
سلام
هدف از این تایپ آموزش طراحی یک user control بود. نه چیز دیگه برای همینه که توضیحات خطوط برنامه نوشته شده
اما با کمی تغییر میشه کاملا کاربردیش کرد. این کنترل در واقع یه border حاوی Progressbar بود که در زمانیکه کار پردازشی انجام میشد صفخه رو میپوشوند تا نمای زیبایی به برنامه بده و ضمن پر شدن Progressbar فرآیند های کامل شده و مرحله در حال اجرا به اطلاع کاربر برسه. که من اون قسمتاشو برداشتم تا هرکسی خواست به دلخواه خودش تغییر بده . از همه مهندسین و اساتید گرامی هم درخواست دارم که نظر بدن و یا تغییر مورد نظرشونو اعمال کنن .
پیشاپیش از همه سپاسگزارم