اذهب إلى المحتوى

السؤال

نشر

اريد كود لزر استئناف تشغيل في السي شارب ، حيث يحتوي على رسوم متحركة 

هذا كود استئناف التشغيل  private void continRun_Click(object sender, EventArgs e)
        {
            paused.Enabled = true;
            continRun.Enabled = false;
            stopAnimation = false; // قم بإلغاء الإيقاف
            PlayButton(true);
        }    لكن لا يفي بالغرض

 

Recommended Posts

  • 1
نشر

من الأفضل محاولة تنفيذه لتحقيق استفادة، من خلال Visual Studio اختاري Create a new project وابحثي عن Windows Forms App (.NET Framework) أو Windows Forms App في حال تستخدمين .NET Core

ثم اختاري اختر C# كلغة البرمجة، وتسمية المشروع واضغطي على Create.

ستظهر لكِ نافذة تحتوي على نموذج فارغ Form، وهو الواجهة التي سنضيف إليها الزر، ثم في نافذة Solution Explorer على الجانب الأيمن، افتحي ملف Form1.cs.

وفي وضع التصميم Design View، انقر يبزر الفأرة الأيمن على النموذج واختاري Properties وبها:

  • غيّري Text إلى Resume Button Example ليظهر كعنوان النافذة
  • ثم Size إلى 300 عرض × 200 ارتفاع ليكون حجم النافذة مناسبًا
  • ثم StartPosition إلى CenterScreen لجعل النافذة تظهر في المنتصف

وفي في شريط الأدوات Toolbox على الجانب الأيسر، ابحثي عن Button واسحبيه إلى النموذج، ثم ضعي الزر في مكان مناسب وليكن وسط النموذج تقريبًا.

بعد ذلك ستكتبي الكود، انقري بزر الفأرة الأيمن على الزر في وضع التصميم واختاري View Code، أو افتحي ملف Form1.cs مباشرة، ستجدي كود يبدأ بـ public partial class Form1 : Form.

قبل أي دالة قومي بكتابة المتغيرات التالية:

  • تخزين العرض الأصلي
  • تخزين الإرتفاع
  • متغير لمتابعة حجم الزر بتصغيره وتكبيره
  • متغير خاص بوقت الـ animation

كالتالي:

private int originalWidth;  
private int originalHeight;
private bool isExpanding = false; 
private Timer animationTimer; 

ثم في دالة في دالة Form1()، أضيفي كود بعد InitializeComponent() لإسناد متغيري الطول والعرض إلى button1.Width وbutton1.Height

بعد ذلك عليك إعداد المؤقت timer 

animationTimer = new Timer(); 
animationTimer.Interval = 30; 

ثم إضافة حدث النقر Click، في في وضع التصميم، انقري مرتين على الزر، وسيُنشئ Visual Studio دالة button1_Click، اكتبي بها:

MessageBox.Show("تم النقر على زر الاستئناف!");

ثم حدث تمرير المؤشر على الزر MouseEnter  في نافذة Properties للزر، انقري على أيقونة البرق Events وابحثي عن MouseEnter، انقري مرتين بجانبه لإنشاء دالة واكتبي بها:

isExpanding = true; 
animationTimer.Start();

ثم حدث مغادرة المؤشر MouseLeave بنفس الكيفية حاولي كتابة الكود الخاص به.

بعد ذلك تنفيذ الرسوم المتحركة، بربط المؤقت بحدث، في Form1() بعد إعداد animationTimer.Interval، أضيفي التالي لربط المؤقت بدالة:

animationTimer.Tick += AnimationTimer_Tick; 

ثم عليكِ كتابة تلك الدالة وهي AnimationTimer_Tick لتحريك الزر بناءًا على ما سبق.

في حال واجهتي صعوبة أخبريني.

  • 0
نشر
بتاريخ 22 ساعة قال Mustafa Suleiman:

من الأفضل محاولة تنفيذه لتحقيق استفادة، من خلال Visual Studio اختاري Create a new project وابحثي عن Windows Forms App (.NET Framework) أو Windows Forms App في حال تستخدمين .NET Core

ثم اختاري اختر C# كلغة البرمجة، وتسمية المشروع واضغطي على Create.

ستظهر لكِ نافذة تحتوي على نموذج فارغ Form، وهو الواجهة التي سنضيف إليها الزر، ثم في نافذة Solution Explorer على الجانب الأيمن، افتحي ملف Form1.cs.

وفي وضع التصميم Design View، انقر يبزر الفأرة الأيمن على النموذج واختاري Properties وبها:

  • غيّري Text إلى Resume Button Example ليظهر كعنوان النافذة
  • ثم Size إلى 300 عرض × 200 ارتفاع ليكون حجم النافذة مناسبًا
  • ثم StartPosition إلى CenterScreen لجعل النافذة تظهر في المنتصف

وفي في شريط الأدوات Toolbox على الجانب الأيسر، ابحثي عن Button واسحبيه إلى النموذج، ثم ضعي الزر في مكان مناسب وليكن وسط النموذج تقريبًا.

بعد ذلك ستكتبي الكود، انقري بزر الفأرة الأيمن على الزر في وضع التصميم واختاري View Code، أو افتحي ملف Form1.cs مباشرة، ستجدي كود يبدأ بـ public partial class Form1 : Form.

قبل أي دالة قومي بكتابة المتغيرات التالية:

  • تخزين العرض الأصلي
  • تخزين الإرتفاع
  • متغير لمتابعة حجم الزر بتصغيره وتكبيره
  • متغير خاص بوقت الـ animation

كالتالي:

private int originalWidth;  
private int originalHeight;
private bool isExpanding = false; 
private Timer animationTimer; 

ثم في دالة في دالة Form1()، أضيفي كود بعد InitializeComponent() لإسناد متغيري الطول والعرض إلى button1.Width وbutton1.Height

بعد ذلك عليك إعداد المؤقت timer 

animationTimer = new Timer(); 
animationTimer.Interval = 30; 

ثم إضافة حدث النقر Click، في في وضع التصميم، انقري مرتين على الزر، وسيُنشئ Visual Studio دالة button1_Click، اكتبي بها:

MessageBox.Show("تم النقر على زر الاستئناف!");

ثم حدث تمرير المؤشر على الزر MouseEnter  في نافذة Properties للزر، انقري على أيقونة البرق Events وابحثي عن MouseEnter، انقري مرتين بجانبه لإنشاء دالة واكتبي بها:

isExpanding = true; 
animationTimer.Start();

ثم حدث مغادرة المؤشر MouseLeave بنفس الكيفية حاولي كتابة الكود الخاص به.

بعد ذلك تنفيذ الرسوم المتحركة، بربط المؤقت بحدث، في Form1() بعد إعداد animationTimer.Interval، أضيفي التالي لربط المؤقت بدالة:

animationTimer.Tick += AnimationTimer_Tick; 

ثم عليكِ كتابة تلك الدالة وهي AnimationTimer_Tick لتحريك الزر بناءًا على ما سبق.

في حال واجهتي صعوبة أخبريني.

لا اقصد هكذا

 

  • 0
نشر
بتاريخ On 21‏/3‏/2025 at 00:27 قال Sola Majed:

لا اقصد هكذا

في ملف Form1.cs لديكِ حاولي تحسين دالة continRun_Click للتعامل مع استئناف العمليات بشكل صحيح، مع إضافة رسوم متحركة للزر نفسه، واستخدام Task لضمان استمرارية العمليات غير المتزامنة.

private bool isAnimating = false;
private CancellationTokenSource animationCTS; 

private async void continRun_Click(object sender, EventArgs e)
{
    if (isAnimating) return; 

    continRun.Enabled = false;

    paused.Enabled = true;
    stopAnimation = false;

    animationCTS = new CancellationTokenSource();

    try
    {
        await AnimateButton(continRun, animationCTS.Token);

        await ResumeAnimation();
    }
    catch (OperationCanceledException)
    {
        // التعامل مع الإلغاء إذا لزم الأمر
        stopAnimation = true;
    }
    finally
    {
        continRun.Enabled = true;
        isAnimating = false;
    }
}

private async Task AnimateButton(Button button, CancellationToken token)
{
    isAnimating = true;
    Size originalSize = button.Size;
    Point originalLocation = button.Location;

    try
    {
        for (int i = 0; i < 5; i++)
        {
            if (token.IsCancellationRequested) throw new OperationCanceledException();
            button.Size = new Size(originalSize.Width + (i * 2), originalSize.Height + (i * 2));
            button.Location = new Point(originalLocation.X - i, originalLocation.Y - i);
            await Task.Delay(30, token);
            button.Invalidate();
        }

        for (int i = 5; i >= 0; i--)
        {
            if (token.IsCancellationRequested) throw new OperationCanceledException();
            button.Size = new Size(originalSize.Width + (i * 2), originalSize.Height + (i * 2));
            button.Location = new Point(originalLocation.X - i, originalLocation.Y - i);
            await Task.Delay(30, token);
            button.Invalidate();
        }
    }
    finally
    {
        button.Size = originalSize;
        button.Location = originalLocation;
    }
}

private async Task ResumeAnimation()
{
    if (!stopAnimation)
    {
        PlayButton(true); 

      
        await Task.Run(() =>
        {
            if (!stopAnimation)
            {
                switch (currentProcess) 
                {
                    case "Add":
                        AddProcess(); 
                        break;
                    case "Sub":
                        SubProcess(); 
                        break;
                    case "Mul":
                        MulProcess(); 
                        break;
                    case "Div":
                        DivProcess(); 
                        break;
                    default:
                        break;
                }
            }
        });
    }
}

وإضافة  المتغيرات التالية في بداية الكلاس لتتبع الحالة:

private string currentProcess = "Add";
private bool isAnimating = false;
private CancellationTokenSource animationCTS;

ويجب أن تكون دالة PlayButton(bool) متوافقة مع الاستئناف، تستطيعي استبدالها باستدعاء الدالة الخاصة بالتشغيل.

وإضافة using:

using System.Threading;
using System.Threading.Tasks;

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...