線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3345
推到 Plurk!
推到 Facebook!

13 種 PICSHOW 圖檔換頁特效之 C# 實作演練

 
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-13 22:31:47 IP:218.173.xxx.xxx 訂閱

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, 註解 無‧
系統時間:2024-05-15 7:28:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!