熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

利用Visual C# 2005制作簡單動畫效果

2022-06-13   來源: .NET編程 
一般的 Windows Form 通常是運用各種控件來顯示數據然而如果您希望在窗體中加入特殊效果來凸顯數據內容那麼圖形與動畫將是非常不錯的選擇

  一般來說我們會使用 Net Framework中 的 GDI+ 函式庫來制作圖形與動畫效果在 GDI+ 還沒有推出之前如果要產生二維的 向量圖形影像以及印刷樣式必須使用舊版操作系統中的GDI新的 GDI+ 是 Windows XP 的一部份除了加入新功能之外還最佳化現有功能以便具體改進 GDI(也就是舊版 Windows 包含的繪圖裝置接口)的效能

  程序范例


點擊放大此圖片
圖表

點擊放大此圖片
圖表

點擊放大此圖片
圖表

  我們的程序范例示范了三種動畫效果分別是眨眼效果彈跳的球以及文字閃爍當程序執行時會自動展示第一種眨眼效果如圖表所示

  運用之前「如何利用程序代碼動態存取組件信息」的技巧將組件的 AsmFQName 屬性值指派給窗體的 Text 屬性並將先前已經加入項目資源的四張圖片名稱指派給數組之後就使用此數組來示范眨眼效果程序代碼撰寫於窗體的Load事件處理例程中如下所示

private void Blog_DemoForm_Load(object sender EventArgs e)
{
 AssemblyInfoClass myAssembly = new AssemblyInfoClass();

 thisText = myAssemblyAsmFQName;

 // 指派數組成員
 arrImages[] = PropertiesResourcesEye;
 arrImages[] = PropertiesResourcesEye;
 arrImages[] = PropertiesResourcesEye;
 arrImages[] = PropertiesResourcesEye;
}

點擊放大此圖片
圖表
  如果您要使用 Visual C# 來制作「關於」對話框建議先使用Visual Studio 所提供的模板來產生關於對話框窗體然後再自訂窗體所要呈現的內容(如圖表所示)在此我們選擇將組件的相關信息填入窗體對應的控件請於「關於」對話框窗體的 Load 事件處理例程中撰寫下列程序代碼

private void AboutBox_Load(object sender EventArgs e)
{
 AssemblyInfoClass myAssembly = new AssemblyInfoClass();

 labelProductNameText = 產品名稱 + myAssemblyProduct;
 labelVersionText = 版本 + myAssemblyVersion;
 labelCopyrightText = 版權宣告 + myAssemblyCopyright;
 labelCompanyNameText = 公司名稱 + myAssemblyCompany;
 textBoxDescriptionText = 細部描述 +
 myAssemblyDescription;
}

  要顯示「關於」對話框請替「說明」菜單項目的Click事件處理例程中撰寫下列程序代碼

private void toolStripMenuItem_Click(object sender EventArgs e)
{
 // 顯示關於對話框
 AboutBox MyAboutBox = new AboutBox();

 // 設定關於對話框的啟始位置
 MyAboutBoxStartPosition = FormStartPositionCenterScreen;
 MyAboutBoxShow();
}
  當用戶點選不同的選項按鈕時將會執行下列程序代碼來顯示不同的動畫效果這些程序代碼撰寫於選項按鈕的 CheckedChanged 事件處理函式中如下所列

private void RadioButtons_CheckedChanged(object sender
EventArgs e)
{
 if(optWinkChecked)
 {
  tmrAnimationInterval = WINK_TIMER_INTERVAL;
 }
 else if(optBallChecked)
 {
  tmrAnimationInterval = BALL_TIMER_INTERVAL;
 }
 else if(optTextChecked)
 {
  tmrAnimationInterval = TEXT_TIMER_INTERVAL;
 }
 OnResize(EventArgsEmpty);
}
  自訂函式 RadioButtons_CheckedChanged 會叫用 OnResize 函式來產生不同的圖形請大家注意我們系使用 Graphics 類別的 FillEllipse 方法來繪制球形程序代碼如下所列

protected override void OnResize(EventArgs ea)
{
 if (optWinkChecked)
 {
  Graphics grfx = CreateGraphics();

  // 重繪窗體
  thisRefresh();
 }
 else if (optBallChecked)
 {
  Graphics grfx = CreateGraphics();
  grfxClear(BackColor);

  double dblRadius = MathMin(ClientSizeWidth / grfxDpiXClientSizeHeight / grfxDpiY) / intBallSize;
  intBallRadiusX = (int)(dblRadius * grfxDpiX);
  intBallRadiusY = (int)(dblRadius * grfxDpiY);

  intBallMoveX = (int)(MathMax( intBallRadiusX / intMoveSize));
  intBallMoveY = (int)(MathMax( intBallRadiusY / intMoveSize));

  intBitmapWidthMargin = intBallMoveX;
  intBitmapHeightMargin = intBallMoveY;

  intBallBitmapWidth = * (intBallRadiusX + intBitmapWidthMargin);
  intBallBitmapHeight = * (intBallRadiusY + intBitmapHeightMargin);

  bitmap = new Bitmap(intBallBitmapWidth intBallBitmapHeight);
  grfx = GraphicsFromImage(bitmap);
  grfxClear(BackColor);
  // 繪制球形
  grfxFillEllipse(BrushesRed new Rectangle(intBallMoveXintBallMoveY * intBallRadiusX * intBallRadiusY));

  intBallPositionX = (int)(ClientSizeWidth / );
  intBallPositionY = (int)(ClientSizeHeight / );
 }
 else if (optTextChecked)
 {
  Graphics grfx = CreateGraphics();
  grfxClear(BackColor);
 }
}

  最後利用定時器將圖形連續重繪於窗體上便產生了動畫效果程序代碼撰寫於定時器的 Tick 事件處理例程中如下所示

private void tmrAnimation_Tick(object sender EventArgs e)
{
 // 眨眼效果
 if(optWinkChecked)
 {
  Graphics grfx = CreateGraphics();

  // 將數組中之圖形繪制在畫面上
  grfxDrawImage(arrImages[intCurrentImage](int)(
(ClientSizeWidth arrImages[intCurrentImage]Width) / )
(int)((ClientSizeHeight arrImages[intCurrentImage]Height) / )
arrImages[intCurrentImage]WidtharrImages[intCurrentImage]Height);

  intCurrentImage += j;

  if(intCurrentImage == )
  {
   j = ;
  }
  else if(intCurrentImage == )
  {
   j = ;
  }
 }
 else if(optBallChecked) // 彈跳的球
 {
  Graphics grfx = CreateGraphics();

  // 將球繪制在畫面上
  grfxDrawImage(bitmap(int)(intBallPositionX intBallBitmapWidth / )
(int)(intBallPositionY intBallBitmapHeight / )
intBallBitmapWidth intBallBitmapHeight);

  // 移動球的位置
  intBallPositionX += intBallMoveX;
  intBallPositionY += intBallMoveY;

  // 球碰到左右邊界
  if(intBallPositionX + intBallRadiusX >= ClientSizeWidth || intBallPositionX intBallRadiusX <= )
  {
   intBallMoveX = intBallMoveX;
   SystemSoundsBeepPlay();
  }

  // 球碰到上下邊界
  if(intBallPositionY + intBallRadiusY >= ClientSizeHeight || intBallPositionY intBallRadiusY <= )
  {
   intBallMoveY = intBallMoveY;
   SystemSoundsBeepPlay();
  }
 }
 else if (optTextChecked) // 閃動文字
 {
  Graphics grfx = CreateGraphics();

  // 設定文字的字型與大小
  Font font = new Font(Microsoft Sans Serif FontStyleBold GraphicsUnitPoint);

  // 設定要顯示的文字
  string strText = 章立民研究室;
  SizeF sizfText = new SizeF(grfxMeasureString(strText font));

  // X坐標與Y坐標的配對
  PointF ptfTextStart = new PointF((float)(ClientSizeWidth sizfTextWidth) /
(float)(ClientSizeHeight sizfTextHeight) / );

  PointF ptfGradientStart = new PointF( );
  PointF ptfGradientEnd = new PointF(intCurrentGradientShift );

  // 設定筆刷
  LinearGradientBrush grBrush = new LinearGradientBrush(ptfGradientStart ptfGradientEnd ColorBlue BackColor);

  // 將文字繪制在畫面上
  grfxDrawString(strText font grBrush ptfTextStart);

  // 以不同的坐標繪制文字造成閃動效果
  intCurrentGradientShift += intGradiantStep;

  if (intCurrentGradientShift == )
  {
   intGradiantStep = ;
  }
  else if (intCurrentGradientShift == )
  {
   intGradiantStep = ;
  }
 }
}


From:http://tw.wingwit.com/Article/program/net/201311/13166.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.