PDA

View Full Version : تصاویر متحرک gif



babak23
شنبه 01 دی 1386, 07:57 صبح
کسی کار با این نوع تصاویر را میدونه ؟

من از این کد برای اجرای فایل های متحرک gif استفاده کردم .این کدها مشکلی ندارند تصویر در هنگام لود شده اجرا میشه و .. به صورت متحرک نمایش داده میشه .



privateGraphics g;
privateEventHandler eh;
public image()
{
InitializeComponent();
g = myGifAnimation.CreateGraphics();
eh = newEventHandler(GifAnimation);

}

privatevoid GifAnimation(object obj, EventArgs args)
{

ImageAnimator.UpdateFrames(myGifAnimation.Backgrou ndImage);
g.Clear(myGifAnimation.BackColor);
g.DrawImage(myGifAnimation.BackgroundImage, newPoint(0, 0));

}
privatevoid image_Load(object sender, EventArgs e)
{
ImageAnimator.Animate(myGifAnimation.BackgroundIma ge, eh);
}



اما وقتی این فرم را میبندم از این خط


g.Clear(myGifAnimation.BackColor);

این خطا را میگیره


A generic error occurred in GDI+.

مشکل از کجاست؟:متفکر:

babak23
شنبه 01 دی 1386, 16:00 عصر
از اساتید کسی نیست که این مشکل را بتونه حل کنه:متفکر:

Pioneers
شنبه 01 دی 1386, 22:50 عصر
اگه در لود شدن مشکلی نداره و فقط در بستن فرم خطا میده، میشه این خطا رو Handle کرد.
دستور try catch

babak23
یک شنبه 02 دی 1386, 08:02 صبح
اگه در لود شدن مشکلی نداره و فقط در بستن فرم خطا میده، میشه این خطا رو Handle کرد.
دستور try catch

مشکل حل شد اما اگه میشه در صورت امکان و تمایل در مورد اینکه چرا همچنیین مشکلی بوجود اومده؟ وچرا با try catch این مشکل برطف میشه را توضیح دهید؟:متفکر:

کد تصحیح شده:


privateGraphics g;
privateEventHandler eh;
public image()
{
InitializeComponent();
g = myGifAnimation.CreateGraphics();
eh = newEventHandler(GifAnimation);

}

privatevoid GifAnimation(object obj, EventArgs args)
{
try
{
ImageAnimator.UpdateFrames(myGifAnimation.Backgrou ndImage);
g.Clear(myGifAnimation.BackColor);
g.DrawImage(myGifAnimation.BackgroundImage, newPoint(0, 0));
}
catch
{
//no problem
}

}
privatevoid image_Load(object sender, EventArgs e)
{
ImageAnimator.Animate(myGifAnimation.BackgroundIma ge, eh);
}

Mahdi.Kiani
یک شنبه 02 دی 1386, 09:00 صبح
مشکل حل شد اما اگه میشه در صورت امکان و تمایل در مورد اینکه چرا همچنیین مشکلی بوجود اومده؟ وچرا با try catch این مشکل برطف میشه را توضیح دهید؟:متفکر:

کد تصحیح شده




privateGraphics g;
privateEventHandler eh;
public image()
{
InitializeComponent();
g = myGifAnimation.CreateGraphics();
eh = newEventHandler(GifAnimation);

}

privatevoid GifAnimation(object obj, EventArgs args)
{
try
{
ImageAnimator.UpdateFrames(myGifAnimation.Backgrou ndImage);
g.Clear(myGifAnimation.BackColor);
g.DrawImage(myGifAnimation.BackgroundImage, newPoint(0, 0));
}
catch
{
//no problem
}

}
privatevoid image_Load(object sender, EventArgs e)
{
ImageAnimator.Animate(myGifAnimation.BackgroundIma ge, eh);
}








به جای دوخ قرمز رنگ در کد فوق، کد



this.Invalidate();

را بنویسید ببینید مشکلتون حل میشه؟
البته وقت نکردم روش فکر کنم. مطمئنا راه حل های خیلی بهتری هم هست!!!




وچرا با try catch این مشکل برطف میشه


اگه فلسفه بلاک های try catch finally را بدانید، ج.اب این سوالتون را میگیرین. شما در بلاک catch هیچ کدی ننوشتید. خوب مسلما وقتی در بلاک try خطایی اتفاق میافته، کنترل برنامه از همون خطی که خطا در اون روی داده به اولین بلاک catch که بتونه اون خطا را handle بکنه میره و کد های درون اون را اجرا می کنه. (یعنی اینکه می تونید یک بلاک try با چند تا catch داشته باشید. که catch عمومی بایستی آخرین catch باشه در کد)
بلاک catch ای که هیچ کدی داخلش نداشته باشه می تونه هر نوع خطایی را handle کنه.
و چون شما در داخل باک catch هیچی ننوشتید خوب طبیعتا هیچ پیغام خطایی هم دریافت نمی کنید. اما این جور استفاده از بلاک های try catch برای handle کردن خطا ها غلط است. در واقع شما خطا را handle نمی کنید. بلکه دارین آن را ماست مالی می کنید. که متاسفانه یا خوشبختانه خیلی از برنامه نویسا از این روش استفاده می کنند.

babak23
یک شنبه 02 دی 1386, 09:13 صبح
به جای دوخ قرمز رنگ در کد فوق، کد


this.Invalidate();

را بنویسید ببینید مشکلتون حل میشه؟
.
البته دیگه خطای مربوطه را نمیده اما تصویر هم ثابت باقی میمونه؟






البته وقت نکردم روش فکر کنم. مطمئنا راه حل های خیلی بهتری هم هست!!!

.
چه راه هایی؟:متفکر: در صورت امکان کسی هست که راه جدید و معقولانه ای را پیشنهاد کنه؟

ARA
یک شنبه 02 دی 1386, 10:32 صبح
سلام راه کلی برای این مسئله از MSDN , و بقول شما معقولانه اینه




using System;
using System.Drawing;
using System.Windows.Forms;
publicclassanimateImage : Form
{
//Create a Bitmpap Object.
Bitmap animatedImage = newBitmap("SampleAnimation.gif");
bool currentlyAnimating = false;
//This method begins the animation.
publicvoid AnimateImage()
{
if (!currentlyAnimating)
{
//Begin the animation only once.
ImageAnimator.Animate(animatedImage, newEventHandler(this.OnFrameChanged));
currentlyAnimating = true;
}
}
privatevoid OnFrameChanged(object o, EventArgs e)
{
//Force a call to the Paint event handler.
this.Invalidate();
}
protectedoverridevoid OnPaint(PaintEventArgs e)
{
//Begin the animation.
AnimateImage();
//Get the next frame ready for rendering.
ImageAnimator.UpdateFrames();
//Draw the next frame in the animation.
e.Graphics.DrawImage(this.animatedImage, newPoint(0, 0));
}
publicstaticvoid Main()
{
Application.Run(newanimateImage());
}
}


من خودم با این کلی کار کردم هیچ مشکلی نداشت اگه مشکلی داشتی بگو

Mahdi.Kiani
یک شنبه 02 دی 1386, 12:19 عصر
البته دیگه خطای مربوطه را نمیده اما تصویر هم ثابت باقی میمونه؟



والا توی این نمونه که فرستادم ظاهرا کار می کنه !!!!