13 種 PICSHOW 圖檔換頁特效之 C# 實作演練 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
PICSHOW 是一套開放 Delphi 源碼的換頁特效控件 , 目前最新版為 4.1 版 , 共有 172 種轉場特效 , 而且是全部開放原始碼 , 只是 C# 的 USER 無法使用 , 除非你用 Delphi 包成 *.dll 檔 , 再給 C# 來 CALL , 否則只有依樣畫葫蘆自己寫了 , 小弟我先拋磚引玉用 C# 改寫 PICSHOW 提供的前 13 種轉場特效 , 其它有興趣的人請繼續 , 記得要分享一下 SOURCE CODE 以造福吾輩 原文網址 http://tw.myblog.yahoo.com/bruce0211/article?mid=169 (含 BCB 使用 PICSHOW 的解決方案) //------------------------------------------------------------------------------------------------------------------------------------- //Form1 上請先放一個 pictureBox1 跟 一個 Button , 下面是 button1_click() 的內容 using System.Threading; private void button1_Click(object sender, System.EventArgs e) { //Random randObj = new Random(new RNGCryptoServiceProvider().GetHashCode()); //for .NET 2.0 Random randObj = new Random(); int n=randObj.Next(1,13); //取 1-13 隨機值 string pic_name=""; if (pic_name=="IMG_2817.bmp") //要用兩張以上的照片來切換 , 否則有些特效在同張照片看不出效果 pic_name="IMG_2821.JPG"; else pic_name="IMG_2817.bmp"; Effect(pic_name,n); //把檔名跟轉場特效參數代入 (目前只能用 1-13) } //------------------------------------------------------------------------------------------------------------------------------------- private void Effect(string image_name, int n) { Bitmap MyBmp = new Bitmap(image_name); //C# Bitmap 還真好用, 可以直接吃非 bmp 檔 //先把圖檔 SIZE 調到跟畫布大小一樣比較好處理 (調好的圖檔放於 MyBmp1) Bitmap MyBmp1 = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics g = Graphics.FromImage((Image)MyBmp1); //g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(MyBmp, 0, 0, pictureBox1.Width, pictureBox1.Height); g.Dispose(); Bitmap MyBmp2 = new Bitmap(pictureBox1.Width, pictureBox1.Height); int W=pictureBox1.Width; int H=pictureBox1.Height; int X=0; int Y=0; int dd=24; for (int d=1; d<=dd; d ) { Thread.Sleep(5); X=(int)(W/dd*d); Y=(int)(H/dd*d); if (X>W || Y>H) { break; } switch (n) { case 1 : Effect001(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 2 : Effect002(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 3 : Effect003(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 4 : Effect004(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 5 : Effect005(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 6 : Effect006(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 7 : Effect007(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 8 : Effect008(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 9 : Effect009(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 10 : Effect010(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 11 : Effect011(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 12 : Effect012(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; case 13 : Effect013(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, X, Y, 0); break; } pictureBox1.Image=(Image)MyBmp2; pictureBox1.Refresh(); } switch (n) { case 1 : Effect001(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 2 : Effect002(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 3 : Effect003(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 4 : Effect004(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 5 : Effect005(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 6 : Effect006(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 7 : Effect007(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 8 : Effect008(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 9 : Effect009(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 10 : Effect010(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 11 : Effect011(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 12 : Effect012(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; case 13 : Effect013(ref MyBmp2, MyBmp1, pictureBox1.Width, pictureBox1.Height, W, H, 100); break; } pictureBox1.Image=(Image)MyBmp2; pictureBox1.Refresh(); pictureBox1.BackgroundImage = MyBmp1; //base of the next image } //------------------------------------------------------------------------------------------------------------------------------------- // 實作 PICSHOW 的前 13 種轉場特效開始 , 附上原 Delphi Source Code 的比對 //------------------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Expand from right private void Effect001(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //StretchBlt(Display->Canvas->Handle, W - X, 0, X, H, // Image->Canvas->Handle, 0, 0, W, H, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(W - X, 0, X, H); Rectangle sr = new Rectangle(0, 0, W, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Expand from left private void Effect002(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //StretchBlt(Display.Canvas.Handle, 0, 0, X, H, // Image.Canvas.Handle, 0, 0, W, H, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(0, 0, X, H); Rectangle sr = new Rectangle(0, 0, W, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Slide in from right private void Effect003(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //BitBlt(Display.Canvas.Handle, W - X, 0, W, H, // Image.Canvas.Handle, 0, 0, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(W - X, 0, X, H); Rectangle sr = new Rectangle(0, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Slide in from left private void Effect004(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //BitBlt(Display.Canvas.Handle, X - W, 0, W, H, // Image.Canvas.Handle, 0, 0, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(0, 0, X, H); Rectangle sr = new Rectangle(W - X, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Reveal from left private void Effect005(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //BitBlt(Display.Canvas.Handle, 0, 0, X, H, // Image.Canvas.Handle, 0, 0, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(0, 0, X, H); Rectangle sr = new Rectangle(0, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Reveal from right private void Effect006(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //BitBlt(Display.Canvas.Handle, W - X, 0, X, H, // Image.Canvas.Handle, W - X, 0, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(W - X, 0, X, H); Rectangle sr = new Rectangle(W - X, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Expand in from right private void Effect007(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //StretchBlt(Display.Canvas.Handle, 0, 0, (2 * W) - X, H, // Image.Canvas.Handle, 0, 0, X, H, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(0, 0, (2 * W) - X, H); Rectangle sr = new Rectangle(0, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Expand in from left private void Effect008(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //StretchBlt(Display.Canvas.Handle, X - W, 0, (2 * W) - X, H, // Image.Canvas.Handle, W - X, 0, X, H, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(X - W, 0, (2 * W) - X, H); Rectangle sr = new Rectangle(W - X, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Expand in to middle private void Effect009(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //StretchBlt(Display.Canvas.Handle, X - W, 0, (3 * W) - (2 * X), H, // Image.Canvas.Handle, (W - X) div 2, 0, X, H, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle(X - W, 0, (3 * W) - (2 * X), H); Rectangle sr = new Rectangle((W - X) / 2, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Expand out from middle private void Effect010(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { //StretchBlt(Display.Canvas.Handle, (W - X) div 2, 0, X, H, // Image.Canvas.Handle, 0, 0, W, H, // SRCCOPY); Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle((W - X) / 2, 0, X, H); Rectangle sr = new Rectangle(0, 0, W, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Reveal out from middle private void Effect011(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { /* var mWX: Integer; mWX := (W - X) div 2; BitBlt(Display.Canvas.Handle, mWX, 0, X, H, Image.Canvas.Handle, mWX, 0, SRCCOPY); */ int mWX = (W - X) / 2; Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle( mWX, 0, X, H); Rectangle sr = new Rectangle( mWX, 0, X, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Reveal in from sides private void Effect012(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { /* var mX: Integer; mX := X div 2; BitBlt(Display.Canvas.Handle, 0, 0, mX, H, Image.Canvas.Handle, 0, 0, SRCCOPY); BitBlt(Display.Canvas.Handle, W - mX, 0, mX, H, Image.Canvas.Handle, W - mX, 0, SRCCOPY); */ int mX = X / 2; Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle( 0, 0, mX, H); Rectangle sr = new Rectangle( 0, 0, mX, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); Rectangle dr2 = new Rectangle( W - mX, 0, mX, H); Rectangle sr2 = new Rectangle( W - mX, 0, mX, H); g.DrawImage(image, dr2, sr2, GraphicsUnit.Pixel); g.Dispose(); } //--------------------------------------------------------------------------- // Expand in from sides private void Effect013(ref Bitmap Display, Bitmap image, int W, int H, int X, int Y, int Progress) { /* var mX, mW: Integer; mX := X div 2; mW := W div 2; StretchBlt(Display.Canvas.Handle, 0, 0, mX, H, Image.Canvas.Handle, 0, 0, mW, H, SRCCOPY); StretchBlt(Display.Canvas.Handle, W - mX, 0, mX, H, Image.Canvas.Handle, mW, 0, mW, H, SRCCOPY); */ int mX = X / 2; int mW = W / 2; Graphics g = Graphics.FromImage((Image)Display); Rectangle dr = new Rectangle( 0, 0, mX, H); Rectangle sr = new Rectangle( 0, 0, mW, H); g.DrawImage(image, dr, sr, GraphicsUnit.Pixel); Rectangle dr2 = new Rectangle( W - mX, 0, mX, H); Rectangle sr2 = new Rectangle( mW, 0, mW, H); g.DrawImage(image, dr2, sr2, GraphicsUnit.Pixel); g.Dispose(); } 編輯記錄
digitraveler 重新編輯於 2009-03-14 08:42:27, 註解 無‧
digitraveler 重新編輯於 2009-03-14 08:55:39, 註解 無‧ digitraveler 重新編輯於 2009-03-15 04:44:45, 註解 無‧ digitraveler 重新編輯於 2009-03-15 04:47:28, 註解 無‧ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |