PDA

View Full Version : سوال: textbox



sokotn2008
جمعه 15 خرداد 1388, 02:11 صبح
سلام
می خواستم بدونم چطوری می شه کناره های textbox ام را پخ (گرد مثله بیضی ) د ر بیارم ممنون می شم اگر کمکم کنید و همین طور butten ها

HamidNazari
جمعه 15 خرداد 1388, 11:06 صبح
شما برای این کار می بایست اول یک کلاس فرزند از کنترل مورد نظرتون درست کنین .
و در مرحلهء بعدی توسط پراپرتی Region مربوط به اون کنترل ، بگین که کدام ناحیه از اون باید دیده بشه که قسمت نسبتاً سخت قضیه س که وقت و حوصله می خواد .
من یه نمونه براتون درست کردم . وقتی سایز TextBox کوچیک باشه ظاهرش چندان چنگی به دل نمیزنه ولی اگه Multiline و بزرگش کنین گوشه هاش رو قشنگتر می تونین ببینین و اگه متغیر Radius رو تغییر بدین روی خم گوشه ها تأثیر میذاره .


public partial class MyCurvedTextBox : System.Windows.Forms.TextBox
{
public MyCurvedTextBox()
{
BorderStyle = System.Windows.Forms.BorderStyle.None;
}

private void ChangeRegion()
{
var path = new System.Drawing.Drawing2D.GraphicsPath();

float Radius = 4.0f;

path.AddLine(Radius, 0, Width - (Radius * 2), 0);
path.AddArc(Width - (Radius * 2), 0, Radius * 2, Radius * 2, 270, 90);
path.AddLine(Width, Radius, Width, Height - (Radius * 2));
path.AddArc(Width - (Radius * 2), Height - (Radius * 2), Radius * 2, Radius * 2, 0, 90);
path.AddLine(Width - (Radius * 2), Height, Radius, Height);
path.AddArc(0, Height - (Radius * 2), Radius * 2, Radius * 2, 90, 90);
path.AddLine(0, Height - (Radius * 2), 0, Radius);
path.AddArc(0, 0, Radius * 2, Radius * 2, 180, 90);
path.CloseFigure();

Region = new System.Drawing.Region(path);
}

private const int WM_PAINT = 0x000F;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_PAINT:
ChangeRegion();
break;
}

base.WndProc(ref m);
}
}

یک نکته در مورد متد WndProc بگم . بهتر بود متد ChangeRegion روی OnPaint صدا زده بشه . اما از اونجا که از Net Framework 1.1. به بعد کشیده شدن یه سری کنترل ها از جمله TextBox به خود سیستم های عامل واگذار شد ، OnPaint هیچ موقع صدا زده نمیشه و منم مجبور شدم یه جای دیگه خرش رو بچسبم .

sokotn2008
یک شنبه 17 خرداد 1388, 15:09 عصر
با سلام
ببخشید من برنامه شما را نوشتم در واقع اول یه کلاس ایجاد کردم و کدهای شما را در آن قرار دادم ولی به var که شما نوشتهاید ایراد می گیرد د رواقع خط پنجم و بعد از آن هم من که این کلاس را ایجاد کردم حالا باید چطوری ازش استفاده کنم کجا صداش بزنم می شه یه نمونه ی run شدش رو برام بذارید ممنون می شم بای

HamidNazari
دوشنبه 18 خرداد 1388, 09:23 صبح
معذرت میخوام بابت var ، مربوطه به C# 3.0 هستش و اگه تغییرش بدین به System.Drawing.Drawing2D.GraphicsPath درست میشه . با اینحال من یه پروژه نمونه درست کردم براتون . وقتی که پروژه رو Build کنین ، میبینین که در Toolbox یه آیتم جدید به اسم MyCurvedTextBox اضافه شده . از اونجا به بعد میتونین باهاش مثل یه TextBox معمولی برخورد کنین و به فرمتون اضافه ش کنین . وقتی هم در پنجره Properties بهش نگاه کنین میبینین که یه پراپرتی به اسم Radius داره که به صورت پیش فرض روی 4ه و با تغییر مقدارش خمیدگی گوشه ها کم و زیاد میشه .

فقط باید تأکید کنم که این یه کلاس بهینه شده نیست و فقط برای نشون دادن قدرت پراپرتی Region نوشتمش و کم و کاستی زیاد داره . بخصوص متد ChangeRegion و کشیدن خط و منحنی ها .
پس اگه وقتی داشتین Form1 رو باز میکردین دیزاینر منفجر (!) شد ، یه بار پروژه رو Build کنید و بعد دوباره فرم رو باز کنین .