پاسخ: مشکل این کلاس کنترل در سی شارپ چیه؟
سلامی مجدد
آخرین تغییراتی که دادم را فایل این کلاس را در زیر میذارم.
الان مشکلش اینه که وقتی پروپرتی TextAutoSize از کلاس TransparentControl را تغییر میدم ، متن ای که رسم میکنه ، وقتی موس را روی این کنترل میبریم ، ضخیم رسم میکنه . دلیل شو گشتم ، ولی پیدا نکردم . کسی میدونه راهنمایی کنه؟
الان این کد زیر ، اشکالی که در بالا توضیح دادم را نمایان میکنه (اول روی دکمه ی AutoSize ، کلیک راست کنید و به متن کنترل TransparentControl هم دقت کنید که خواهید دید کمی ضخیم تر میشه . اگه فرم را مینیمایز و بعد به حالت اولیه اش برگردونید ، متن ، نازک میشه. اگه دوباره این کاری که گفتم را انجام بدین یا موس را روی کنترل ببرید ، متن ، ضخیم تر میشه) :
کد:
private void Form1_Load(object sender, EventArgs e)
{
Button btnAutoSize = new Button { Bounds = new Rectangle(10, 10, 100, 35), Parent = this, Text = "AutoSize", BackColor = Color.WhiteSmoke };
btnAutoSize.MouseUp += new MouseEventHandler(this.Button3_MouseUp);
TransparentControlText text = new TransparentControlText("salam");
this.transparentControl = new TransparentControl(text, new Rectangle(new Point(100, 200), new Size(250, 100)), false);
this.Controls.Add(this.transparentControl);
}
private void Button3_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.transparentControl.TextAutoSize = false;
else if (e.Button == MouseButtons.Right)
this.transparentControl.TextAutoSize = true;
}
دانلود آخرین تغییرات فایل TransparentControl :
برای مشاهده این لینک/عکس می بایست عضو شوید !برای عضویت اینجا کلیک کنید ]
با تشکر :give_rose:
پاسخ: مشکل این کلاس کنترل در سی شارپ چیه؟
سلامی مجدد
انگار حدودا ، بهتر پیدا کردم که مشکل از کجاست (اما هنوز دقیق متوجه نشدم) .
مشکل انگار از کدهای تغییر سایز در TransparentControl هست . ربطی به TransparentControlText نداره.
مثلا کدهای زیر ، مشکلی ندارن (این کد ، رویداد Button3_MouseUp در کد بالاست که تغییر کرده) (برای آپدیت و رسم ، بعد از کلیک روی دکمه ، موس را روی کنترل TransparentControl ببرید) :
کد:
private void Button3_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.transparentControl.TransparentControlText.Text = "salam";
else if (e.Button == MouseButtons.Right)
this.transparentControl.TransparentControlText.Text = "khobi?";
}
یا
کد:
private void Button3_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.transparentControl.TransparentControlText.TextFont = this.Font;
else if (e.Button == MouseButtons.Right)
this.transparentControl.TransparentControlText.Text = "khobi?";
}
اما این کد مشکل داره :
کد:
private void Button3_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.transparentControl.Size = new Size(250, 100);
else if (e.Button == MouseButtons.Right)
this.transparentControl.Size = new Size(180, 70);
}
حالا داخل کلاس TransparentControlText مشکل خودش را نشون میده چون داخل رویداد TransparentControl_TextAutoSizeChanged ، کدِ this.TransparentControl.Size = fontSize.ToSize() را بکار بردم.
پاسخ: مشکل این کلاس کنترل در سی شارپ چیه؟
سلامی مجدد
مشکل یافت شد. بخاطر این بود که داخل رویداد AllParents_Invalidated ، وقتی جابجایی یا تغییر اندازه صورت میگرفت ، متد InvalidateBackgroundsAndThisControl ، دو بار اجرا میشد. چون هر بار که این تابع اجرا میشه ، به کنترل والدش کاری نداره و کنترل والدش را invalidate نمیکنه.
بنابراین ، کد این رویداد را به زیر تغییر دادم و درست شد :
کد:
private void AllParents_Invalidated(object sender, InvalidateEventArgs e)
{
// در این قسمت ، عمل Invalidate کردن یا همون رسم کردن کنترل TransparentControl را فقط روی اون کنترلی انجام میده که عملیات موس روی اون کنترل انجام گرفته باشه .
// همچنین اگه مکان کنترل جاری مون تغییر کنه ، همون کنترل رسم میشه.
if (this.Equals(TransparentControl.TranspControlEventDoingFlag) == true || this.IsLocationChangeDoingFlag == true)
this.InvalidateBackgroundsAndThisControl();
}