خیلی ممنون استاد آرمین.
نکته ی مهم اینه که وقتی کنترلی را Invalidate میکنیم ، زمانی اجرا میشه که پیام (رویداد و هر کدی) توی صف برای پردازش نباشه. اگه باشه ، اول اونا را اجرا میکنه و بعد نوبت به Invalidate اون کنترل میرسه (که اول اون کنترل را ، نامعتبر ، و بعد رسم اش میکنه) . پس اشکال کار من توی این سه خط ، در تابع AllParents_Invalidated بود :
پس باید هر کدوم از این خط ها که میخواد اجرا بشه (و Invalidate کنترل مورد نظر را در پی داره) ، باید زمانی اجرا بشه که مطمئن بشیم اون خط قبلی ، رسم اش تمام شد (نه صرفا با فراخونی Invalidate ، رسم میشه همونطور که قبلا توضیح دادین) و بعد خط بعدی شو اجرا کنیم.کد:if (this.Equals(TransparentControl.TranspControlEventDoingFlag) == true) { this.InvalidateForeOrBackgroundControls(this.BackgroundControls, this.BackgroundControlInvalidateRegiones); this.Invalidate(); this.InvalidateForeOrBackgroundControls(this.ForegroundControls, this.ForeGroundControlInvalidateRegiones); }
این 3 خط را این طور ویرایش کردم که خط اول را همونجا گذاشتم باشه . بعدش تایمری را استارت کردم و خط دوم (this.Invalidate) را توی تایمر گذاشتم باشه (چون اگه اشتباه نکنم ، تایمر هم مثل Invalidate ، زمانی اجرا میشه که پیام (رویداد و هر کدی) توی صف برای پردازش نباشه. پس در این صورت ، مطمئنیم که اول ، خط اول ، رسم اش تمام شد و بعد نوبت تایمر مون میرسه .
اما خط سوم را دیگه نمیشه توی تایمر گذاشت چون دو تایمر ممکنه زمان اجراشون (طی مدت زمانی که میگذره یا به هر دلیل دیگه) ، تداخل پیدا کنن . بنابراین کد سوم را توی متد OnPaint (بعد از کدهای رسم مربوط به کنترل TransparentControl ، میذاریم) و حالا مطمئن هستیم که بعد از رسم کنترل TransparentControl ، عملیات Invalidate مربوط به کنترل های جلویی انجام میشه.
این کار (کد بالا که آخرین تغییرات کلاسش را در زیر هم پیوست میکنم) را انجام دادم . در این صورت (با این تغییراتی که گفتم) ، اگه دو کنترلِ TransparentControl را جلو و عقب هم بذاریم ، جواب میده و کنترل های جلو و عقب ، درست رسم میشه (البته بجز یه اشکال کوچیک که اگه اول ، موس را روی کنترل پشتی ببریم (موس را دیگه از اون کنترل ، خارج نکنیم) و از همونجا ، موس را روی کنترلِ جلویی ببریم ، ترتیب رسم ، باز به هم میریزه که با خارج کردن موس از همین کنترلِ جلویی ، دوباره درست میشه . حالت های دیگه ، مشکل خاصی انگار نبود) .
اما در حالتی که پشت کنترلِ TransparentControl مون ، یه کنترل دیگه مثل Button باشه ، با اونکه کنترل TransparentControl مون جلو هست ، ولی پشت اش رسم میشه.
برای تست این قضیه ، کد زیر را در رویداد Form_Load بنویسین (همونطور که میدونین ، بجای مسیر فایل ها ، یه فایل png ای که بخشی اش transparent باشه ، بدید یا بیت مپی بدید که بخشی اش transparent باشه . اندازه ی بیت مپ هاتون جوری باشه که در کد زیر ، بخشی از هر دو شی از کنترل های transparentControl و button روی هم بیفتن . در مثال زیر ، اندازه های شی بیت مپ ، 24 در 24 هستن) :
الان این مشکل از کجاست که با اونکه شی transparentControl ، در جلوی کنترل button قرار داره (وقتی موس را روی کنترل transparentControl میبریم) ، اما جلوش رسم نمیشه؟کد:private TransparentControl transparentControl; private void Form1_Load(object sender, EventArgs e) { Bitmap bitmap = new Bitmap(@"E:\Project\Visual Studio\C#.Net\Saved Project\0 Important Project\Poshtibangir Tolo\PoshtibangirTolo\bin\Debug\Icon\PanelToolBar\Close\Close.png"); bitmap = TransparentControlBitmap.SetColor(bitmap, Color.Red); TransparentControlBitmap controlBitmap = new TransparentControlBitmap(bitmap, new Bitmap(bitmap.Width, bitmap.Height), new Bitmap(bitmap.Width, bitmap.Height), new Bitmap(bitmap.Width, bitmap.Height)); controlBitmap.GraphicInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; controlBitmap.SetColor(bitmap, ExportBitmapFor.MouseEnterBitmap, Color.DeepSkyBlue); controlBitmap.SetColor(bitmap, ExportBitmapFor.MouseDownBitmap, Color.Blue); controlBitmap.SetColor(bitmap, ExportBitmapFor.ControlDisabledBitmap, Color.Yellow); this.transparentControl = new TransparentControl(controlBitmap, new Point(200, 10)); this.transparentControl.Text = "Close"; this.Controls.Add(transparentControl); Button button = new Button() { BackColor = Color.GreenYellow, Bounds = new Rectangle(210, 20, 80, 35), Text = "Back Button", Parent = this }; button.BringToFront(); }
فایل پیوستی شامل آخرین تغییرات را هم بی زحمت از اینجا دانلود کنید.
خیلی ممنون برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید






پاسخ با نقل قول

Bookmarks