PDA

View Full Version : سوال: مشکل در استفاده از خاصیت opacity فرم ها



SMRAH1
چهارشنبه 27 شهریور 1387, 16:19 عصر
من در برنامه ام می خواهم هنگام زدن یک دکمه فرم اصلی به مرور محو شده و سپس مخفی شود.برای این منظور از کد پایین استفاده کردم:

this.Opacity = 1;
for (int i = 0; i < 99; i++)
{
this.Opacity -= 0.01;
Application.DoEvents();

op -= 0.01;
Thread.Sleep(10);
}

this.Visible = false;
this.Opacity = 1;
البته این کد جواب می دهد ولی یک مشکل جدی دارد.در اولین تنظیم opacity یک لحظه فرم کاملا مشکی می شود (اگر فرم به قدر کافی بزگ و تعداد کنترل های آن زیاد باشد ،این مسئله کاملا به چشم می آید ولی در فرم های ساده کوچک شاید کاربر متوجه آن نشود).کد های متفاوتی در اینترنت جستجو و یافتم که در برنامه خودشان کار می کرد ولی من نتوانستم بفهم چطور این اتفاق می افتد.حتی در یکی از انها ذکر شده بود که این ایراد در .NET 2 است و در تمام فرمها یک تابع private بدون مقدار بازگشتی (void) ،بدون پارامتر و بدون بدنه برنامه (فقط یک جفت {} بود) معرفی شده بودند و در توضیح آن متد به رفع همین ایراد اشاره شده بود ولی در هرحال من نتوانستم از ان استفاده کنم.

درضمن جستجو هم کردم و لی چنین موردی مطرح نشده است.
لطفا برای رفع این مشکل مرا یاری کنید(دلیل مشکل و رفع ایراد)

متشکرم

mdssoft
پنج شنبه 28 شهریور 1387, 01:43 صبح
سلام.
این شاید مشکلت رو بر طرف کنه . (http://www.codeproject.com/KB/cs/OpacityInCSharp.aspx)

rostamkhani
پنج شنبه 28 شهریور 1387, 02:22 صبح
سلام
این کد این کاری میخوایین رو انجام میده تنها کافیست فرم هاتون از فرو ZeytoonForm ارث ببرین
نکته که برای حل مشکلی که گفتین (سیاه شدن فرم) یک این که موقع نمایش از تابع


this.showForm();

استفاده کنین .
و نکته مهم دیگر نباید Opacity فرم برابر با 1 شود و نحایتا میتوانید مثلا 0.99 قرار دهید که در
برنامه از 255/254 استفاده شده در این حالت دیگر مشکل پرش و سیاه شدن پیش نمیاد .

Mahdi.Kiani
پنج شنبه 28 شهریور 1387, 08:44 صبح
سلام اخوی
این مقاله را ببینید (http://www.codeproject.com/KB/cs/FormAnimation.aspx)

SMRAH1
پنج شنبه 28 شهریور 1387, 16:57 عصر
mdssoft (http://barnamenevis.org/forum/member.php?u=39485) جان ،توی این برنامه نیز همین مشکلی که نوشته ام وجود دارد.(در لحظه ابتدا نمایش فرم با کمی دقت متوجه یک لحظه سیاه شدن فرم می شوید).
r.kiani (http://barnamenevis.org/forum/member.php?u=47458) عزیر،با مشکل من مرتبط نبود ولی مقاله قشنگی بود.(نمایش dynamic فرم!!! ایده جالبی است.)
دوست من rostamkhan (http://barnamenevis.org/forum/member.php?u=22652) همانطور که اشاره کرده بودید در این برنامه هیچ گاه opacity به 1 نمی رسد (تقریبا 1 می شود).البته این موضوع مشکل را تا حد زیادی حل می کند و کاربر متوجه تفاوت opacity 1 و .99 نمی شود.
اما به نظر من، باید این مسئله یک راه حل اساسی داشته باشد.در واقع تا آنجا که من متوجه شده ام هرگاه opacity از مقدار 1 به مقداری مخالف یک تغییر می کند ،این اتفاق (سیاه شدن لحظه ای فرم)رخ میدهد.اگر کسی از دوستان علت دقیق را میداند (فرآیند ایجاد این مشکل) را یا راه بهتری را می داند لطفا راهنمایی کند.

درضمن در source برنامه Paint.Net (http://www.getpaint.net/index.html) نوشته بود :

// Bypassing Form.Opacity eliminates a "black flickering" that occurs when
// the form transitions from Opacity=1.0 to Opacity != 1.0, or vice versa.
// It appears to be a result of toggling the WS_EX_LAYERED style, or the
// fact that Form.Opacity re-applies visual styles when this value transition
// takes place.و برای رفع این مشکل همانند ان برنامه از توابع API استفاده کدم (دقیقا همان سورس را کپی کردم) ولی نشد!!

از تمام دوستان متشکرم.
و هنوز منتظر!
موفق باشید

Mahdi.Kiani
پنج شنبه 28 شهریور 1387, 22:54 عصر
سلام اخوی
اصلا مقاله را مشاهده کردید؟ مطالب اونو خوندید؟ مقاله در ارتباط با نشان دادن فرم به صورت انیمیشن با استفاده از API ای به نام AnimateWindow می باشد که با تنظیم flag هایی، می توانید حالت های مختلفی را شبیه سازی نمایید.
یکی از آن حالت ها که ارتباط با مشکل شما دارد، حالت fade کردن می باشد که توسط کد زیر اجرا می شود


flags = WinAPI.AW_ACTIVATE|WinAPI.AW_BLEND;
animatedForm a = new animatedForm(animationTime,flags);
a.Show();

Amir Oveisi
پنج شنبه 28 شهریور 1387, 23:12 عصر
من برنامه شما رو اجرا کردم و در کامپیوتر من مشکلی که فرمودید رخ نمیده.
به هر حال لینکی که جناب کیانی گذاشتن در صورت وجود مشکل، مشکلتون رو برطرف خواهد کرد.

SMRAH1
پنج شنبه 28 شهریور 1387, 23:16 عصر
سلام

r.kiani (http://barnamenevis.org/forum/member.php?u=47458) عزیز،متشکرم از یاد آوریتان ولی اگر توجه کنید تابع AnimateWindow خود در هنگام بستن دازای مشکلاتی است (به همین دلیل در source برنامه در btnClose_Click از animatedForm.cs ،حالت انیمیشن بستن را برداشته است .برای تست ایراد های آن، این فرم را آنقدر بزگ کنید تا بزگتر از فرم والد شود.در ضمن چند کنترل دیگر هم به آن بیافزایید و حالت انیمیشن بستن را فعال کنید تا کاملا متوجه مشکلات شوید)
در کل این نوع استفاده از انیمشن بسیار جذاب است.ولی مشکل اصلی من در Opacity است (بستن به شکل effect بهانه ایست برای نمایش این مشکل هرچند که این مسئله باعث شد من مطلب جدیدی در ابطه با AnimateWindow بیاموزم).
در ضمن یاد آوری می کنم که مشکل opacity فقط وقتی دیده می شود که از opacity یک به مقداری غیر یک تغییر کند و نه در حالات دیگر (مثل افزایش یا ... در opacity)... توضیح دیگر اینکه این فرآیند (سیاه شدن یکباره فرم) آنقدر سریع است که شاید کاربر متوجه نشود ولی در فرمهای بزرگ با تعداد زیادی کنترل،کاملا نظر کاربر را جلب می کند (قابل توجه دوست گرامی bermooda (http://barnamenevis.org/forum/member.php?u=17736)).

از توجه شما ممنونم و منتظر راهنماییتان هستم.

SMRAH1
جمعه 29 شهریور 1387, 14:58 عصر
سلام

چنانچه یک فرم را از پایه طراحی کنید و opacity اون رو به مقداری غیر از 1 هم تنظیم کنید (در هرکجای برنامه از بعد از InitalCOmponnet تا رویداد shown فرم) به محض نمایش فرم (visible = true) دوباره این فرآیند سیاه شدن دیده می شود.
تنها راهی که توانستم از این مسئله جلو گیری کنم این بود که opacity را صفر کردم و بعد گام به گام به آن افزودم تا به مقدار مطلوب رسیدم.

هنوز منتظر راه حل های شما هستم.

SMRAH1
یک شنبه 31 شهریور 1387, 01:43 صبح
دوستان نظری ندارند؟

samirdev
یک شنبه 31 شهریور 1387, 16:02 عصر
می تونی تو حلقه ای که نوشتی یک this.Refresh(); بزاری تا فرمت یک رفرش هم بشه این جوری سیاه نمیشه و لی پیشنهاد می کنم از AnimateWindow که دوستان توضیحشو دادن استفاده کنی.