SajjadKhati
کاربر فعال <A href="http://forum.majidonline.com/f
بله. اون Invalidate ها با همون ترتیب اجرای کدتون اعمال میشه، یک نخ که بیشتر نیست. با همون ترتیب که درخواست Invalidate شده Invalidate میشن. اما همانطور که قبلا هم گفتم و در توضیحات InvalidateRect هم نوشته، پیام WM_PAINT چیزی نیست که اولا همیشه و با هر Invalidate ای ارسال بشه و ثانیا اگه پیامش در صف اجرا قرار گرفت فورا نوبت اش برسه. هر پنجره ای هم صف پیام های مجزایی داره.
براتون با کد و مثال هم نشون دادم که ارتباط مستقیمی بین ایندو نیست.
چند بار در مورد WS_EX_TRANSPARENT گفتم و گوش نکردید.
#1176
#1137
خیلی ممنون.
خوب اون مگه invalidate اگه برای یه کنترل ، چند بار پی در پی اجرا کنیم ، ویندوز یا کدهای (درون متد Invalidate) در سی شارپ تصمیم میگیرن یه بارش را فقط ارسال کنن ولی ما که برای هر کنترل ، یه invalidate را ارسال میکنیم . هر کنترل که ربطی به یکی دیگه نداره.
ملاک درستی برای مقایسه قرار ندادید.
شما کنترل خودتون رو Invalidate میکنید و بعد کنترل دیگری رو که از هر نوعی میتونه باشه.
اگر اون کنترل بعدی یک کنترل عادی مثل button باشه که برایش هیچ فرقی نمی کنه که کنترل زیرش شفاف ئه یا نه. مهم نیست که رسم زیرش با تاخیر انجام بشه یا نه. مهم نیست اصلا رسمی زیرش بشه یا نه. پس اینکه روی کنترل تون button قرار میدید و درست عمل میکنه نشونه این نیست که کنترل شما رسمش درسته و با رسم روی خودش مشکلی نداره. دلیلش صرفا اینه که هر پنجره عادی که روی کنترل شما قرار بگیره درست دیده میشه. دکمه ای که پنجره اش بالاتر ازدکمه شما است که هیچوقت زیر پنجره کنترل شما نمیره. کنترل های زیرین هم بهشون درخواست Invalidate میدید. صف پیام هاشون هم خالیه و به موقع رسم میکنند. میمونه کنترل خودتون که رسمش مشکل داره.
چرا مهمه رسم هاش.
فرض کنید یه دکمه ی button ، پشت کنترل TransparentControl باشه . اگه رسم ها ، به همون ترتیبی که من میگم مثل الان رعایت نشه و مثلا اول کنترل TransparentControl رسم بشه و بعد رسم Button انجام بشه ، باعث میشه کنترل Button که لایه ی زیری بود ، خودشو جلوتر نمایش بده و همین مشکلی که من با دو کنترل TransparentControl روی هم دارم ، پیش بیاد.
الان این کدی که دیشب گفتین و انجام دادم ، بخشی از دو کنترل TransparentControl را درست رد اما همین مشکل را بوجود آورد.یعنی وقتی یه Button ای پشت TransparentControl قرار داشته باشه ، باعث شد که بعد از TransparentControl رسمش انجام بشه و Button به جلو بیاد.
شما در یک رخداد کنترل خودتون ، میایید درخواست میدید برای رسم. این رسم کی میتونه شروع بشه؟ وقتی پیام قبلی پردازش شده و پیام دیگری در صف جلوتر از اون نیست. شما مادامی که در اون روتین رخداد فلان هستید که رسم مجبوره تو صف بمونه. این انتظار برای سایر کنترل ها مهم نیست چون خیلی کوتاهه و به رسم سایر پنجره ها کاری ندارند. به سادگی Invalidate میکنند و از روتین رخداد فرضا کلیک خارج میشن و رسم انجام میشه. ولی کنترل شما میخواد توی اون رخداد که منجر به تغییر ظاهر شده بعد از رسم خودش سایر کنترل ها رو هم وادار به رسم کنه. رسم خودش به ناچار منتظر میمونه و رسم سایر کنترل ها که صف انتظارشون خالی است جلوتر از خودش انجام میشه.
به خوبی که احتمالا هیچوقت نمیشه ولی من جای شما باشم در AllParents_Invalidated صرفا تا Invalidate کنترل خودتون پیش میرم و اون بخش رسم کنترل های جلویی رو از اونجا Cut میکنم و برمیدارم و منتقل میکنم به انتهای OnPaint، یعنی وقتی کنترل های جلویی رو Invalidate میکنید که کنترل خودتون Paint شده، نه وقتی که تازه درخواست Paint کردید.
همونطور که در پست قبل گفتم ، این دو خط آخر که گفتین و بواد کردم را انجام دادم . وقتی موس را روی کنترل پشتی میبرم ، درست رسم میشه (یعنی کنترل پشتی ، به پشت میره) اما وقتی روی کنترل جلویی میبرم ، خراب میشه و کنترل پشتی ، به جلو میاد .
البته این شاید بشه درست کرد و در وهله ی اول مهم نباشه اما مهمتر اینه که اون قضیه ای که یه کنترل دیگه مثل کنترل Button در پشت قرار میگرفت (در پاراگراف قبلی توضیح دادم) هم بهم میریزه و دو جا مشکل پیش میاد . با کد قبلی ، کنترل های عادیِ Button و ... که در پشت و جلو بودن ، کاملا درست کار میکردن.
کلا الان چی کار کنم که هر دو با هم مشکلی براشون پیش نیاد و این هم حل بشه؟