PDA

View Full Version : ساخت یک label که متنش دارای حاشیه(OutLine) هستش



alireza264
پنج شنبه 04 تیر 1394, 01:10 صبح
سلام چند روز پیش دوست عزیر reza_ali202000 (http://barnamenevis.org/member.php?62953-reza_ali202000) کار قشنگی کرد ویه textbox رو به اشترک گذاشت .لذا منم به نشانه سپاس این label به اشتراک میزارم و نحوه کارشو توضیح میدم . لازم به ذکره اگه کسی بخواد textbox یا شی دیگه ای بسازه با همین روش و تعیین خصوصات ومتد های های مورد نیازش می تونه اینکاره بکنه اما باید ابتدا ارث بر رو از label به کنترل مورد نظرش تغییر بده
132577

ابتدا یک Component بنام BorderLabel به پروژه اضافه میکنیم و فضاهای کاری مورد نظر را می نویسیم

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;



سپس ارثبری component رو به label تغییر میدیم تا کامپوننت بدونه هدف ساخت label هست و ازش ارثبری کنه

public partial class BorderLabel : Label


متغیر های مورد نیاز


private float borderSize;// اندازه حاشیه متن
private Color borderColor;// رنگ حاشیه متن

private PointF point;// محل قزارگیری لیبل برای تعیین اندازه طول بر اساس اتوسایز
private SizeF drawSize;// تعیین اندازه متن بر اساس اندازه فونت
private Pen drawPen;// پر کردن حاشیه متن اگه اندازه چند پیکسل بود
private GraphicsPath drawPath;// ترسیم متن
private SolidBrush forecolorBrush;// رنگ زمینه متن



سازنده کامپوننت و مقدار دهی اولیه فیلدها برای پالت پیش فرض

public BorderLabel()
{
this.borderSize = 1f;
this.borderColor = Color.White;
this.drawPath = new GraphicsPath();
this.drawPen = new Pen(new SolidBrush(this.borderColor), borderSize);
this.forecolorBrush = new SolidBrush(this.ForeColor);

this.Invalidate();
}



تعیین خصوصیت در Appearance

[Browsable(true)]
[Category("Appearance")]
[Description("این لیبل دارای حاشیه متن میباشد")]
[DefaultValue(1f)]


تعیین خصوصیت های جدید ویا تغییر اونایی که هستند بدیهی است که خصوصیت هایی که نام برده نشده اند تغییری ندارند و دارای حالت استانداره


public float BorderSize
{
get { return this.borderSize; }//خواندن مقدار فعلی اندازه حاشیه
set //تعیین مقدار جدید اندازه حاشیه بر اساس مقدار داده شده کاربر
{
this.borderSize = value;
if (value == 0)
{
//اگر مقدار حاشیه صفر بود حاشیه دیده نشود

this.drawPen.Color = Color.Transparent;
}
else
{

this.drawPen.Color = this.BorderColor; //تنظیم رنگ حاشیه
this.drawPen.Width = value; //عرض حاشیه با مقدار جدید تنظیم شود با توجه به رنگ خظ بالا
}

this.OnTextChanged(EventArgs.Empty);// تغییرات در متن ترسیمی اعمال شود
}
}

[Browsable(true)]
[Category("Appearance")]
[DefaultValue(typeof(Color), "Red")]
[Description("تعیین رنگ حاشیه")]
public Color BorderColor
{
get { return this.borderColor; }//خواندن مقدار فعلی رنگ حاشیه
set//تعیین رنگ جدید حاشیه بر اساس مقدار داده شده کاربر
{
this.borderColor = value;

if (this.BorderSize != 0) //گر مقدار حاشیه صفر نبودرنگ جدید برای قلم رسم انتخاب شود
this.drawPen.Color = value;

this.Invalidate(); // ترسیم انجام شود
}
}



رها سازی منابع

protected override void Dispose(bool disposing)// آزاد سازی منابع گرفته شده
{
if (disposing)
{

if (this.forecolorBrush != null)
this.forecolorBrush.Dispose();

if (this.drawPath != null)
this.drawPath.Dispose();

if (this.drawPen != null)
this.drawPen.Dispose();

}
base.Dispose(disposing);
}



تعریف متد های مورد نیاز چرا متد ها دوباره تعریف شده اند در حالیکه همان وظیفه قبلی را انجام میدهند؟ دلیل تعریف مجدد متد ها اینه که در label یک ترسیم عادی متن را انجام میدیم اما اینجا از یک ترسیم گرافیگی باید انجام بشه
دستوراتی مانند drawو private GraphicsPath drawPath; و this.drawPath = new GraphicsPath(); داریم

// از نوع Protect
//استفاده شده تا فقط برای اعضای هم نوع قابل دسترس باشه
protected override void OnFontChanged(EventArgs e) // اعمال فونت
{
base.OnFontChanged(e);
this.Invalidate();
}

protected override void OnTextAlignChanged(EventArgs e)// چینش متن
{
base.OnTextAlignChanged(e);
this.Invalidate();
}

protected override void OnTextChanged(EventArgs e)// رسم متن در قالب جدید
{
base.OnTextChanged(e);
}

protected override void OnForeColorChanged(EventArgs e)// ترسیم رنگ زمینه متن
{
this.forecolorBrush.Color = base.ForeColor;
base.OnForeColorChanged(e);
this.Invalidate();
}




ساخت شی

protected override void OnPaint(PaintEventArgs e) // ترسیم شی نهایی
{


if (this.Text.Length == 0)
return;



e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;// اگر حالت چند رنگ داشتیم لبه های رنگ ها دیده نشه
e.Graphics.CompositingQuality = CompositingQuality.HighQuality;


this.drawSize = e.Graphics.MeasureString(this.Text, this.Font, new PointF(), StringFormat.GenericTypographic);// فضای محدوده مورد نیاز متن


// اگر اتوسایز باشه نحوه چینش متن بی معنیه و اندازه
//بر اساس اندازه مورد نیاز متنه و متن از ابتدای لیبل نما یش داده میشه
// و قاصله قرار گرفتن متن در شی از سمت چپ و بالا با توجه به Padding.Left و Padding.Top
if (this.AutoSize)
{
this.point.X = this.Padding.Left;
this.point.Y = this.Padding.Top;
}
else// اگر اتوسایز نباشه نحوه چینش متن و محل قرار گرفتن متن در شی از سمت چپ رو تعیین می کنیم
{
// چپ چین کردن متن
if (this.TextAlign == ContentAlignment.TopLeft ||
this.TextAlign == ContentAlignment.MiddleLeft ||
this.TextAlign == ContentAlignment.BottomLeft)
this.point.X = this.Padding.Left;// قاصله قرار گرفتن متن در شی از سمت چپ

// وسط چین کردن متن
else if (this.TextAlign == ContentAlignment.TopCenter ||
this.TextAlign == ContentAlignment.MiddleCenter ||
this.TextAlign == ContentAlignment.BottomCenter)
point.X = (this.Width - this.drawSize.Width) / 2; // قرار گرفتن متن در شی با فاصله از دو طرف

// راست چین کردن متن
else point.X = this.Width - (this.Padding.Right + this.drawSize.Width);// قاصله قرار گرفتن متن در شی از سمت راست


// بالا چین کردن متن
if (this.TextAlign == ContentAlignment.TopLeft ||
this.TextAlign == ContentAlignment.TopCenter ||
this.TextAlign == ContentAlignment.TopRight)
point.Y = this.Padding.Top;// قاصله قرار گرفتن متن در شی از بالا

// وسط چین کردن از ارتفاع متن
else if (this.TextAlign == ContentAlignment.MiddleLeft ||
this.TextAlign == ContentAlignment.MiddleCenter ||
this.TextAlign == ContentAlignment.MiddleRight)
point.Y = (this.Height - this.drawSize.Height) / 2;// قاصله قرار گرفتن متن در شی از بالا و پایین

// پایین چین کردن متن
else point.Y = this.Height - (this.Padding.Bottom + this.drawSize.Height);// محل قرار گرفتن متن در شی از سمت چپ
}




float fontSize = e.Graphics.DpiY * this.Font.SizeInPoints / 72;

this.drawPath.Reset();
this.drawPath.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, fontSize,
point, StringFormat.GenericTypographic); // ریختن متن به شی با ویژگی های قونت انتخابی

e.Graphics.FillPath(this.forecolorBrush, this.drawPath);// بر کردن زمینه متن با رنگ مورد نظر
e.Graphics.DrawPath(this.drawPen, this.drawPath);// ترسیم شی نهایی

}


نحوه استفاده : برنامه رو Rebuild کنین تا borderlabel به toolbox اضافه بشه و مثل بقیه کنترل ها انتخابش کنین و در فرم قرار بدین

132582


سورس کامل
132579

حسن1370
پنج شنبه 04 تیر 1394, 02:32 صبح
چجوری میشه اندازه خط دور نوشته رو بیشتر کرد

alireza264
پنج شنبه 04 تیر 1394, 11:51 صبح
چجوری میشه اندازه خط دور نوشته رو بیشتر کرد
سلام
متونی از پنجره properties تغییر بدی و همینطور از توی کد


borderlabel1.borderSize = 5f;
borderlabel1.borderSize = 4.3f;

ebrahim.rayatparvar
شنبه 06 تیر 1394, 13:11 عصر
کار زیبا و خیلی خوب بود :تشویق:

CsharpNevisi
یک شنبه 07 تیر 1394, 17:16 عصر
چطوری میتونم از این کامپوننت اکسپورت بگیرم تا تو پروژه های دیگه هم استفاده کنم ؟؟

alireza264
دوشنبه 08 تیر 1394, 00:47 صبح
سلام فایل پیوست رو دانلود کن داخلش فایل BorderLabel.cs هستش اونو به پروژه اضافه کن

132704


برنامه رو Rebuild کنین تا borderlabel به toolbox اضافه بشه