最後,利用定時器將圖形連續重繪於窗體上,便產生了動畫效果。程序代碼撰寫於定時器的 Tick 事件處理例程中,如下所示:
private void tmrAnimation_Tick(object sender, EventArgs e)
{
// 眨眼效果。
if(optWink.Checked)
{
Graphics grfx = CreateGraphics();
// 將數組中之圖形繪制在畫面上。
grfx.DrawImage(arrImages[intCurrentImage],(int)(
(ClIEntSize.Width - arrImages[intCurrentImage].Width) / 2),
(int)((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,(int)(intBallPositionX - intBallBitmapWidth / 2),
(int)(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 = new SizeF(grfx.MeasureString(strText, font));
// X坐標與Y坐標的配對。
PointF ptfTextStart = new PointF((float)(ClIEntSize.Width - sizfText.Width) / 2,
(float)(ClIEntSize.Height - sizfText.Height) / 2);
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 += intGradiantStep;
if (intCurrentGradIEntShift == 500)
{
intGradiantStep = -5;
}
else if (intCurrentGradIEntShift == -50)
{
intGradiantStep = 5;
}
}
}