利用 Timer 定期重繪圖形產生動畫效果,完整程式碼:
private void tmrAnimation_Tick(object sender, EventArgs e)
{
// 眨眼效果
if (optWink.Checked)
{
Graphics grfx = CreateGraphics();
grfx.DrawImage(arrImages[intCurrentImage],
(ClientSize.Width - arrImages[intCurrentImage].Width) / 2,
(ClientSize.Height - arrImages[intCurrentImage].Height) / 2,
arrImages[intCurrentImage].Width, arrImages[intCurrentImage].Height);
intCurrentImage += j;
if (intCurrentImage == 3) j = -1;
else if (intCurrentImage == 0) j = 1;
}
// 彈跳的球
else if (optBall.Checked)
{
Graphics grfx = CreateGraphics();
grfx.DrawImage(bitmap,
intBallPositionX - intBallBitmapWidth / 2,
intBallPositionY - intBallBitmapHeight / 2,
intBallBitmapWidth, intBallBitmapHeight);
intBallPositionX += intBallMoveX;
intBallPositionY += intBallMoveY;
// 左右邊界反彈
if (intBallPositionX + intBallRadiusX >= ClientSize.Width ||
intBallPositionX - intBallRadiusX <= 0)
{
intBallMoveX = -intBallMoveX;
SystemSounds.Beep.Play();
}
// 上下邊界反彈
if (intBallPositionY + intBallRadiusY >= ClientSize.Height ||
intBallPositionY - intBallRadiusY <= 75)
{
intBallMoveY = -intBallMoveY;
SystemSounds.Beep.Play();
}
}
// 閃動文字
else if (optText.Checked)
{
Graphics grfx = CreateGraphics();
Font font = new Font("Microsoft Sans Serif", 48, FontStyle.Bold, GraphicsUnit.Point);
string strText = "章立民研究室";
SizeF sizfText = grfx.MeasureString(strText, font);
PointF ptfTextStart = new PointF(
(ClientSize.Width - sizfText.Width) / 2f,
(ClientSize.Height - sizfText.Height) / 2f);
PointF ptfGradientStart = new PointF(0, 0);
PointF ptfGradientEnd = new PointF(intCurrentGradientShift, 200);
LinearGradientBrush grBrush = new LinearGradientBrush(
ptfGradientStart, ptfGradientEnd, Color.Blue, BackColor);
grfx.DrawString(strText, font, grBrush, ptfTextStart);
intCurrentGradientShift += intGradientStep;
if (intCurrentGradientShift == 500) intGradientStep = -5;
else if (intCurrentGradientShift == -50) intGradientStep = 5;
}
}
三種效果透過 RadioButton 切換,各自調整 Timer.Interval 控制速度。