30種圖像動畫特效算法(C#多線程版)(下)

這是截屏動畫效果:

這是最後10種特效: php

  
  
  
  
  1.         #region 旋轉放大  
  2.  
  3.         // 原理:使用Graphics的RotateTransform()方法進行座標變換  
  4.         private void Animator21()  
  5.         {  
  6.             const float anglePer = 6; // 每次旋轉的角度,應能被360整除  
  7.             const int roundCount = 2; // 旋轉週數  
  8.             try 
  9.             {  
  10.                 OnDrawStarted(this, EventArgs.Empty);  
  11.                 //ClearBackground();  
  12.  
  13.                 for (float angle = anglePer; angle <= 360 * roundCount; angle += anglePer) // 每次旋轉若干度度,同時進行縮放  
  14.                 {  
  15.                     dc.Clear(Color.FromKnownColor(KnownColor.ButtonFace)); // 清空DC的內容  
  16.                     dc.TranslateTransform(bmp.Width / 2, bmp.Height / 2); // 平移座標軸,以進行基於圖片中心的旋轉  
  17.                     dc.RotateTransform(angle); // 旋轉座標軸  
  18.                     dc.ScaleTransform(angle / 360 / roundCount, angle / 360 / roundCount); // 縮放  
  19.                     dc.TranslateTransform(-bmp.Width / 2, -bmp.Height / 2); // 平移座標軸(復原),用於顯示處理後的圖像  
  20.                     dc.DrawImage(bmp, 0, 0); // 在DC中繪製圖像  
  21.                     dc.ResetTransform(); // 重置DC的全部變換,準備下一次循環  
  22.  
  23.                     ShowBmp();  
  24.                     Thread.Sleep(10 * delay);  
  25.                 }  
  26.             }  
  27.             catch (Exception ex)  
  28.             {  
  29.                 ShowError(ex.Message);  
  30.             }  
  31.             finally 
  32.             {  
  33.                 OnDrawCompleted(this, EventArgs.Empty);  
  34.             }  
  35.         }  
  36.  
  37.         #endregion  
  38.  
  39.         #region 橢圓拉幕  
  40.  
  41.         // 原理:使用TextureBrush載入圖像,而後用Graphics的FillEllipse()方法逐漸擴大顯示面積  
  42.         private void Animator22()  
  43.         {  
  44.             const int stepCount = 3; // 橢圓外接矩形的高每次的增量像素  
  45.             try 
  46.             {  
  47.                 OnDrawStarted(this, EventArgs.Empty);  
  48.                 ClearBackground();  
  49.  
  50.                 TextureBrush textureBrush = new TextureBrush(bmp); // 創建材質畫刷  
  51.                 // 以高度爲橢圓由小到大的增量  
  52.                 // 係數1.5使橢圓加大,直到橢圓的內接矩形等於bmp尺寸  
  53.                 // 係數1.5爲當前長寬比橢圓的估算係數  
  54.                 for (int i = 1; i <= 1.5 * bmp.Height / 2f; i += stepCount)  
  55.                 {  
  56.                     RectangleF rect = new RectangleF(bmp.Width / 2f - i * bmp.Width / bmp.Height, bmp.Height / 2 - i,  
  57.                         2 * i * bmp.Width / bmp.Height, 2 * i); // 在DC中心位置距離橢圓的外接矩形  
  58.                     dc.FillEllipse(textureBrush, rect); // 填充  
  59.  
  60.                     ShowBmp(rect);  
  61.                     Thread.Sleep(10 * delay);  
  62.                 }  
  63.             }  
  64.             catch (Exception ex)  
  65.             {  
  66.                 ShowError(ex.Message);  
  67.             }  
  68.             finally 
  69.             {  
  70.                 OnDrawCompleted(this, EventArgs.Empty);  
  71.             }  
  72.         }  
  73.  
  74.         #endregion  
  75.  
  76.         #region 對角拉伸  
  77.  
  78.         // 原理:使用Graphics的DrawImage()方法的一個重載版本,將圖像繪製在平行四邊形中  
  79.         private void Animator23()  
  80.         {  
  81.             const float stepCount = 4.5f; // 平行四邊形左上定點所在矩形對角線的增量  
  82.             try 
  83.             {  
  84.                 OnDrawStarted(this, EventArgs.Empty);  
  85.                 ClearBackground();  
  86.  
  87.                 // 繪製平行四邊形的三個點爲:左上、右上、左下  
  88.                 // 平行四邊形的右上、左下爲固定點,不斷改變左上點的座標,使其趨於矩形  
  89.                 // 平行四邊形的左上點沿矩形對角線(中心到左上)方向改變,故先計算矩形對角線的一半,並以此爲循環變量  
  90.                 double diagonal = Math.Sqrt(Math.Pow(bmp.Width, 2f) + Math.Pow(bmp.Height, 2f)) / 2f; // 矩形對角線的一半  
  91.                 double a = Math.Atan(Convert.ToDouble(bmp.Height) / bmp.Width); // 計算矩形對角線與底邊(Width)的夾角  
  92.                 for (double i = diagonal; i >= 0; i -= stepCount)  
  93.                 {  
  94.                     // 計算當前左上點的座標  
  95.                     Point point = new Point((int)(Math.Cos(a) * i), (int)(Math.Sin(a) * i));  
  96.                     // 生成平行四邊形左上、右上、左下座標點數組  
  97.                     Point[] points = { point, new Point(bmp.Width, 0), new Point(0, bmp.Height) };  
  98.                     dc.DrawImage(bmp, points); // 將圖像繪製在平行四邊形中  
  99.  
  100.                     ShowBmp();  
  101.                     Thread.Sleep(10 * delay);  
  102.                 }  
  103.                 // 平行四邊形左上定點的位置最終不必定爲(0, 0),故在循環結束後繪製整個位圖  
  104.                 dc.DrawImage(bmp, 0, 0);  
  105.  
  106.                 ShowBmp();  
  107.             }  
  108.             catch (Exception ex)  
  109.             {  
  110.                 ShowError(ex.Message);  
  111.             }  
  112.             finally 
  113.             {  
  114.                 OnDrawCompleted(this, EventArgs.Empty);  
  115.             }  
  116.         }  
  117.  
  118.         #endregion  
  119.  
  120.         #region 旋轉掃描  
  121.  
  122.         // 原理:使用TextureBrush載入圖像,而後用Graphics的FillPie()方法逐漸擴大扇形顯示面積  
  123.         private void Animator24()  
  124.         {  
  125.             const int anglePer = 5; // 每次旋轉的角度,應能被360整除  
  126.             try 
  127.             {  
  128.                 OnDrawStarted(this, EventArgs.Empty);  
  129.                 ClearBackground();  
  130.  
  131.                 // 創建橢圓外接矩形區域,該區域的內接橢圓的內接矩形應不小於bmp尺寸  
  132.                 // 內部使用BitBlt() API函數,大的區域基本不會影響速度  
  133.                 // 座標平移後應保證該矩形的內接橢圓中心與bmp中心重合  
  134.                 Rectangle rect = new Rectangle(-bmp.Width, -bmp.Height, bmp.Width * 3, bmp.Height * 3);  
  135.                 TextureBrush textureBrush = new TextureBrush(bmp); // 創建材質畫刷  
  136.                 // 以扇形跨越角度(單位度)爲增量,即角速度相等,線速度並不相等  
  137.                 for (int i = 0; i <= 360; i += anglePer)  
  138.                 {  
  139.                     dc.FillPie(textureBrush, rect, 180, i); // 填充扇形  
  140.  
  141.                     ShowBmp(rect);  
  142.                     Thread.Sleep(10 * delay);  
  143.                 }  
  144.             }  
  145.             catch (Exception ex)  
  146.             {  
  147.                 ShowError(ex.Message);  
  148.             }  
  149.             finally 
  150.             {  
  151.                 OnDrawCompleted(this, EventArgs.Empty);  
  152.             }  
  153.         }  
  154.  
  155.         #endregion  
  156.  
  157.         #region 多徑掃描  
  158.  
  159.         // 原理:使用TextureBrush載入圖像,而後用Graphics的FillPie()方法分多個角度同步顯示逐漸擴大的扇形區域  
  160.         private void Animator25()  
  161.         {  
  162.             const float pieCount = 8; // 同時掃描的扇形數量  
  163.             try 
  164.             {  
  165.                 OnDrawStarted(this, EventArgs.Empty);  
  166.                 ClearBackground();  
  167.  
  168.                 // 創建橢圓外接矩形區域,該區域的內接橢圓的內接矩形應不小於bmp尺寸  
  169.                 // 內部使用BitBlt() API函數,大的區域基本不會影響速度  
  170.                 // 座標平移後應保證該矩形的內接橢圓中心與bmp中心重合  
  171.                 Rectangle rect = new Rectangle(-bmp.Width, -bmp.Height, bmp.Width * 3, bmp.Height * 3);  
  172.                 TextureBrush textureBrush = new TextureBrush(bmp); // 創建材質畫刷  
  173.                 // 以扇形跨越角度(單位度)爲增量,即角速度相等,線速度並不相等  
  174.                 // 共pieCount個扇形每一個扇形共計360/pieCount度  
  175.                 for (int angle = 1; angle <= Math.Ceiling(360 / pieCount); angle++)  
  176.                 {  
  177.                     // 掃描每一個扇形區域  
  178.                     for (int i = 0; i < pieCount; i++)  
  179.                     {  
  180.                         dc.FillPie(textureBrush, rect, i * 360 / pieCount, angle); // 填充扇形  
  181.                     }  
  182.  
  183.                     ShowBmp(rect);  
  184.                     Thread.Sleep(20 * delay);  
  185.                 }  
  186.             }  
  187.             catch (Exception ex)  
  188.             {  
  189.                 ShowError(ex.Message);  
  190.             }  
  191.             finally 
  192.             {  
  193.                 OnDrawCompleted(this, EventArgs.Empty);  
  194.             }  
  195.         }  
  196.  
  197.         #endregion  
  198.  
  199.         #region 隨機落幕(改進版)  
  200.  
  201.         // 原理:將圖像分紅寬度相等的列,而後每次隨機若干列前進必定的量,直到全部的豎條均到達圖像底端  
  202.         private void Animator26()  
  203.         {  
  204.             const float lineWidth = 15; // 豎條寬度  
  205.             const int stepCount = 6; // 豎條每次前進量  
  206.             try 
  207.             {  
  208.                 OnDrawStarted(this, EventArgs.Empty);  
  209.                 ClearBackground();  
  210.  
  211.                 int colCount = (int)Math.Ceiling(bmp.Width / lineWidth); // 計算列數  
  212.                 Random rnd = new Random(); // 隨機數類  
  213.                 // 該數組保存每一個列前進的位置,即每一個列的高度,自動初始化爲0  
  214.                 int[] colIndex = new int[colCount];  
  215.                 // 按隨機次序逐一顯示每一個豎條  
  216.                 bool flag = false// 表示是否全部的列均顯示完成,即到達了圖像的底邊  
  217.  
  218.                 Region region = new Region(new GraphicsPath()); // 空區域  
  219.                 TextureBrush textureBrush = new TextureBrush(bmp); // 創建位圖材質畫刷  
  220.                 do // 循環直到全部列均顯示完畢,即到達底端  
  221.                 {  
  222.                     for (int i = 0; i < colCount; i++)  
  223.                     {  
  224.                         int col = rnd.Next(colCount); // 隨機生成要顯示的列  
  225.                         if (colIndex[col] < bmp.Height) // 該列未顯示完  
  226.                         {  
  227.                             colIndex[col] += stepCount; // 記錄該列新的位置  
  228.                             RectangleF rect = new RectangleF(col * lineWidth, 0, lineWidth, colIndex[col]);  
  229.                             region.Union(rect);  
  230.                         }  
  231.                         else 
  232.                         {  
  233.                             i--; // 保證每次處理列數爲colCount  
  234.                         }  
  235.                     }  
  236.                     dc.FillRegion(textureBrush, region);  
  237.  
  238.                     ShowBmp(region.GetBounds(dc));  
  239.                     Thread.Sleep(10 * delay);  
  240.  
  241.                     flag = true// 假設全部列已顯示完成  
  242.                     for (int i = 0; i < colIndex.Length; i++)  
  243.                     {  
  244.                         if (colIndex[i] < bmp.Height)  
  245.                         {  
  246.                             flag = false// 存在未顯示完的列,仍需循環  
  247.                             break;  
  248.                         }  
  249.                     }  
  250.                 } while (!flag);  
  251.             }  
  252.             catch (Exception ex)  
  253.             {  
  254.                 ShowError(ex.Message);  
  255.             }  
  256.             finally 
  257.             {  
  258.                 OnDrawCompleted(this, EventArgs.Empty);  
  259.             }  
  260.         }  
  261.  
  262.         #endregion  
  263.  
  264.         #region 螺線內旋  
  265.  
  266.         // 原理:從圖像左上角開始,以分塊大小順時針內旋顯示圖像  
  267.         private void Animator27()  
  268.         {  
  269.             const float blockSize = 45; // 正方塊的邊長  
  270.             try 
  271.             {  
  272.                 OnDrawStarted(this, EventArgs.Empty);  
  273.                 ClearBackground();  
  274.  
  275.                 int cols = (int)Math.Ceiling(bmp.Width / blockSize); // 按照分塊尺寸劃分的列總計  
  276.                 int rows = (int)Math.Ceiling(bmp.Height / blockSize); // 按照分塊尺寸劃分的行總計  
  277.                 Point block = new Point(0, 0); // 當前顯示塊的座標  
  278.                 Rectangle area = new Rectangle(0, 0, cols, rows); // 還沒有顯示分塊的區域座標  
  279.                 int direction = 0; // 內旋方向,0表示向右,1表示向下,2表示向左,3表示向上  
  280.                 for (int i = 0; i < cols * rows; i++) // 循環分塊總數次  
  281.                 {  
  282.                     RectangleF rect = new RectangleF(block.X * blockSize, block.Y * blockSize, blockSize, blockSize);  
  283.                     dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);  
  284.                     switch (direction)  
  285.                     {  
  286.                         case 0: // 當前向右  
  287.                             if (block.X < area.Width - 1) // 還沒有到達右邊界  
  288.                             {  
  289.                                 block.X++; // 繼續向右  
  290.                             }  
  291.                             else // 已到達右邊界  
  292.                             {  
  293.                                 direction = 1; // 方向改成向下  
  294.                                 block.Y++; // 向下  
  295.                                 area.Y++; // 修改待顯示區域的上邊界  
  296.                             }  
  297.                             break;  
  298.                         case 1: // 當前向下  
  299.                             if (block.Y < area.Height - 1) // 還沒有到達下邊界  
  300.                             {  
  301.                                 block.Y++; // 繼續向下  
  302.                             }  
  303.                             else // 已到達下邊界  
  304.                             {  
  305.                                 direction = 2; // 方向改成向左  
  306.                                 block.X--; // 向左  
  307.                                 area.Width--; // 修改待顯示區域的右邊界  
  308.                             }  
  309.                             break;  
  310.                         case 2: // 當前向左  
  311.                             if (block.X > area.X) // 還沒有到達左邊界  
  312.                             {  
  313.                                 block.X--; // 繼續向左  
  314.                             }  
  315.                             else // 已到達左邊界  
  316.                             {  
  317.                                 direction = 3; // 方向改成向上  
  318.                                 block.Y--; // 向上  
  319.                                 area.Height--; // 修改待顯示區域的下邊界  
  320.                             }  
  321.                             break;  
  322.                         default// 當前向上  
  323.                             if (block.Y > area.Y) // 還沒有到達上邊界  
  324.                             {  
  325.                                 block.Y--; // 繼續向上  
  326.                             }  
  327.                             else // 已到達上邊界  
  328.                             {  
  329.                                 direction = 0; // 方向改成向右  
  330.                                 block.X++; // 向右  
  331.                                 area.X++; // 修改待顯示區域的左邊界  
  332.                             }  
  333.                             break;  
  334.                     }  
  335.  
  336.                     ShowBmp(rect);  
  337.                     Thread.Sleep(10 * delay);  
  338.                 }  
  339.             }  
  340.             catch (Exception ex)  
  341.             {  
  342.                 ShowError(ex.Message);  
  343.             }  
  344.             finally 
  345.             {  
  346.                 OnDrawCompleted(this, EventArgs.Empty);  
  347.             }  
  348.         }  
  349.  
  350.         #endregion  
  351.  
  352.         #region 灰度掃描(改進版)  
  353.  
  354.         // 原理:使用ImageAttributes類和顏色轉換矩陣處理圖像,從下到上灰度顯示圖像,而後從上到下轉換爲正片  
  355.         private void Animator28()  
  356.         {  
  357.             const int stepCount = 6; // 每次顯示的像素量  
  358.             try 
  359.             {  
  360.                 OnDrawStarted(this, EventArgs.Empty);  
  361.                 ClearBackground();  
  362.  
  363.                 // ImageAttributes類的實例用於調整顏色,由DrawImage()方法調用  
  364.                 ImageAttributes attributes = new ImageAttributes();  
  365.                 // 創建5*5階RGBA顏色矩陣  
  366.                 ColorMatrix matrix = new ColorMatrix();  
  367.                 // 根據亮度方程將矩陣設爲灰度變換  
  368.                 for (int i = 0; i < 3; i++)  
  369.                 {  
  370.                     matrix[0, i] = 0.299f;  
  371.                     matrix[1, i] = 0.587f;  
  372.                     matrix[2, i] = 0.114f;  
  373.                 }  
  374.                 attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);  
  375.                 // 創建灰度位圖並將輸入位圖轉換爲灰度  
  376.                 Bitmap grayBmp = new Bitmap(bmp.Width, bmp.Height);  
  377.                 Graphics grayDc = Graphics.FromImage(grayBmp);  
  378.                 grayDc.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  379.  
  380.                 // 以灰度方式從下到上繪製整個圖像  
  381.                 for (int y = bmp.Height - 1; y >= 0; y -= stepCount)  
  382.                 {  
  383.                     Rectangle rect = new Rectangle(0, y, bmp.Width, stepCount);  
  384.                     dc.DrawImage(grayBmp, rect, rect, GraphicsUnit.Pixel);  
  385.  
  386.                     ShowBmp(rect);  
  387.                     Thread.Sleep(10 * delay);  
  388.                 }  
  389.                 // 以正片方式從上到下繪製整個圖像  
  390.                 for (int y = 0; y < bmp.Height; y += stepCount)  
  391.                 {  
  392.                     Rectangle rect = new Rectangle(0, y, bmp.Width, stepCount);  
  393.                     dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);  
  394.  
  395.                     ShowBmp(rect);  
  396.                     Thread.Sleep(10 * delay);  
  397.                 }  
  398.             }  
  399.             catch (Exception ex)  
  400.             {  
  401.                 ShowError(ex.Message);  
  402.             }  
  403.             finally 
  404.             {  
  405.                 OnDrawCompleted(this, EventArgs.Empty);  
  406.             }  
  407.         }  
  408.  
  409.         #endregion  
  410.  
  411.         #region 負片追蹤(改進版)  
  412.  
  413.         // 原理:使用ImageAttributes類和顏色轉換矩陣處理圖像,從左到右負片顯示圖像,同時,以滯後方式顯示正片  
  414.         private void Animator29()  
  415.         {  
  416.             const float stepCount = 4; // 每次顯示的像素量  
  417.             const float delayCount = 280; // 轉換爲正片的滯後像素數,該值必須能被stepCount整除  
  418.             try 
  419.             {  
  420.                 OnDrawStarted(this, EventArgs.Empty);  
  421.                 ClearBackground();  
  422.  
  423.                 // ImageAttributes類的實例用於調整顏色,由DrawImage()方法調用  
  424.                 ImageAttributes attributes = new ImageAttributes();  
  425.                 // 創建5*5階RGBA顏色矩陣  
  426.                 ColorMatrix matrix = new ColorMatrix();  
  427.                 // 將矩陣設爲負片變換  
  428.                 matrix.Matrix00 = matrix.Matrix11 = matrix.Matrix22 = -1f;  
  429.                 matrix.Matrix30 = matrix.Matrix31 = matrix.Matrix32 = 1f;  
  430.                 attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);  
  431.                 // 創建負片圖像  
  432.                 Bitmap negativeBmp = new Bitmap(bmp.Width, bmp.Height);  
  433.                 // 轉換負片圖像  
  434.                 Graphics negativeDc = Graphics.FromImage(negativeBmp);  
  435.                 negativeDc.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);  
  436.  
  437.                 // 以負片方式從左到右繪製整個圖像,正片繪製在負片進行到delay時開始,並以合適的速度前進,剛好與負片同時到達右邊  
  438.                 for (int x = 0; x < bmp.Width; x += (int)stepCount)  
  439.                 {  
  440.                     // 負片顯示區域  
  441.                     RectangleF rect1 = new RectangleF(x, 0, stepCount, bmp.Height);  
  442.                     dc.DrawImage(negativeBmp, rect1, rect1, GraphicsUnit.Pixel);  
  443.                     RectangleF rect2 = RectangleF.Empty;  
  444.                     if (x >= delayCount) // 顯示正片區域  
  445.                     {  
  446.                         // 正片顯示區域計算方法:  
  447.                         // 正片起始位置:(x - delay) * bmp.Width / (bmp.Width - delay)  
  448.                         // 當前負片已顯示到delay,還需顯示bmp.Width - delay,而正片還需顯示bmp.Width  
  449.                         // 即負片每顯示一次,正片需顯示負片的bmp.Width / (bmp.Width - delay)倍  
  450.                         // 所以,正片每次的起始位置爲(x - delay) * bmp.Width / (bmp.Width - delay)  
  451.                         // 正片增量:bmp.Width / ((bmp.Width - delay) / stepCount)  
  452.                         // 正片共需顯示bmp.Width  
  453.                         // 負片還有((bmp.Width - delay) / stepCount)次便顯示完成,即正片也有一樣的次數  
  454.                         // 所以,正片每次顯示bmp.Width / ((bmp.Width - delay) / stepCount)  
  455.                         rect2 = new RectangleF((x - delayCount) * bmp.Width / (bmp.Width - delayCount), 0,  
  456.                             bmp.Width / ((bmp.Width - delayCount) / stepCount), bmp.Height);  
  457.                         dc.DrawImage(bmp, rect2, rect2, GraphicsUnit.Pixel);  
  458.                     }  
  459.  
  460.                     ShowBmp(RectangleF.Union(rect1, rect2));  
  461.                     Thread.Sleep(10 * delay);  
  462.                 }  
  463.             }  
  464.             catch (Exception ex)  
  465.             {  
  466.                 ShowError(ex.Message);  
  467.             }  
  468.             finally 
  469.             {  
  470.                 OnDrawCompleted(this, EventArgs.Empty);  
  471.             }  
  472.         }  
  473.  
  474.         #endregion  
  475.  
  476.         #region 水平卷軸  
  477.  
  478.         // 原理:從左到右顯示逐步圖像,在已顯示區域的右邊緣壓縮顯示剩餘圖像  
  479.         private void Animator30()  
  480.         {  
  481.             const float blockWidth = 80; // 壓縮圖像區域的寬度(像素)  
  482.             const float stepCount = 6; // 每次顯示步進寬度(像素)  
  483.             try 
  484.             {  
  485.                 OnDrawStarted(this, EventArgs.Empty);  
  486.                 ClearBackground();  
  487.  
  488.                 for (int x = 0; x <= Math.Ceiling((bmp.Width - blockWidth) / stepCount); x++)  
  489.                 {  
  490.                     // 繪製不壓縮的顯示區域  
  491.                     RectangleF rect = new RectangleF(x * stepCount, 0, stepCount, bmp.Height);  
  492.                     dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);  
  493.                     // 繪製壓縮區域  
  494.                     RectangleF sourRect = new RectangleF((x + 1) * stepCount, 0, bmp.Width - x * stepCount, bmp.Height); // 還沒有顯示的區域  
  495.                     RectangleF destRect = new RectangleF((x + 1) * stepCount, 0, blockWidth, bmp.Height); // 壓縮豎條區域  
  496.                     dc.DrawImage(bmp, destRect, sourRect, GraphicsUnit.Pixel);  
  497.  
  498.                     ShowBmp(RectangleF.Union(rect, destRect));  
  499.                     Thread.Sleep(10 * delay);  
  500.                 }  
  501.             }  
  502.             catch (Exception ex)  
  503.             {  
  504.                 ShowError(ex.Message);  
  505.             }  
  506.             finally 
  507.             {  
  508.                 OnDrawCompleted(this, EventArgs.Empty);  
  509.             }  
  510.         }  
  511.  
  512.         #endregion  
  513.     }  
  514.  

下面的連接或附件能夠下載該軟件完整的源文件,包含全部資源和一個已編譯的可執行文件,至少須要.NET 3.5架構支持:
http://mengliao.blog.51cto.com/p_w_upload/201101/876134_1294304450.rar
(全文完)windows

相關文章
相關標籤/搜索