سؤال

لذلك أنا في الأساس صنع زر مخصص.

السلوك المطلوب:

عندما ينتهي أحد المستخدمين ، ستتلاشى صورة Mouseover.

عندما يتلاشى المستخدم من الصورة/الصورة المضغوطة.

استثناءات:

إذا قام أحد المستخدمين بتدوين أو إيقاف تشغيله ، بينما يتم تشغيل الرسوم المتحركة المتلازمة ، فسوف تحتاج إلى:

  • توقف على الفور عن الرسوم المتحركة التي تلعب حاليًا
  • ابدأ في التلاشي في الرسوم المتحركة الجديدة من الموقف الحالي. على سبيل المثال: دعنا نقول مستخدمًا ينتهي ، وقد لعبت الرسوم المتحركة Mouseover ، إذا أرادت الفأر ، ثم يعود بسرعة إلى ما لا يزال الرسوم المتحركة Mouseoff لا يزال يلعب ، فلن يبدأ الماوس في البداية من البداية .. ولكن من حيث توقف الرسوم المتحركة Mouseoff.
هل كانت مفيدة؟

المحلول

لقد فعلت شيئًا مشابهًا لهذا من قبل ، وقمت بتطبيقه باستخدام GDI+.

يجب أن يقوم الزر شيئين في طريقة الرسم.

  1. ارسم الزر الافتراضي دون أي معيات للشفافية.
  2. ارسم صورة Mouseove مع ألفا معينة.

استخدم عامل خلفية لإعطائك الرسوم المتحركة السلسة. لذلك على Mouseover ابدأ عامل الخلفية وجعله يعمل حتى يصل إلى ألفا إلى 1.0 فهرنهايت. عند إزالة الماوس من الزر ، يجب أن يقلل العامل من ألفا حتى يصل إلى 0.0F. احصل على متغير يسمى Fadingin حتى يفهم عامل الخلفية ما ينبغي أن يفعله. يجب أن يعين حدث الماوس والخارج بشكل صحيح بشكل صحيح على True أو False ، ثم ابدأ عامل الخلفية (إذا لم يكن Runnung بالفعل).

يمكن أن تبدو طريقة DoWork للخلفية تبدو مثل هذا:

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
  long ticks1 = 0;
  long ticks2 = 0;
  double interval = (double)Stopwatch.Frequency / 60;
  while (true) {
    ticks2 = Stopwatch.GetTimestamp();
    if (ticks2 >= ticks1 + interval) {
      ticks1 = Stopwatch.GetTimestamp();

      if(_fadeIn){
        _fadeAlpha += 0.1f;
        if(_fadeAlpha > 1f){
          _fadeAlpha = 1f;
          break;
        }
      }else{
        _fadeAlpha -= 0.1f;
        if(_fadeAlpha < 0f){
          _fadeAlpha = 0f;
          break;
        }
      }
      backgroundWorker.ReportProgress(0);
    }
    Thread.Sleep(1);
  }
  backgroundWorker.ReportProgress(0);
}

ستجعل بنية التوقيت والحلقة هنا هدفًا للرسوم المتحركة 60 إطارًا في الثانية.

يجب أن يغير ColourtWorker ProgressChanged فقط colormatrix إلى قيمة ألفا المناسبة ، وربط colormatrix بـ ImageAttributes ، وإبطال عنصر التحكم عن طريق الاتصال بإلغاء. يجب القيام بذلك بحيث يتم طلب إعادة رسم واجهة المستخدم الرسومية من الخيط الرئيسي ، وليس مؤشر ترابط عمال الخلفية. إذا قمت بذلك مباشرة من Dowork ، فستحصل على استثناء إذا حاولت تعديل ImageAttributes أثناء إجراء عملية السحب.

آمل أن يساعدك هذا في صنع رسوم متحركة ناعمة على الزر الخاص بك.

نصائح أخرى

تحتاج إلى اختيار صورة واحدة لتكون في الأسفل ، وواحدة لتكون في الأعلى. ستحتاج القيمة الموجودة في الأعلى إلى تعديل قيمة ألفا من 0 إلى 255 في خطوات لإنشاء الرسوم المتحركة.

هذه موضوع منتدى MSDN تفاصيل طريقة للمزج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top