2010-11-10 161 views
9

我有一個問題:一個PictureBox問題

我有3個不同的圖像3個圖片框爲圖片

我能設置爲pictureBox3所以無論圖像看起來一樣.... 。

alt text

編輯: 我想移動pictur eBox3上pictureBox2,

所以沒有選擇將它們合併到單個圖像

回答

6

我會添加另一個例子,根據更新的要求允許移動image3。
得到它的工作,把圖像與透明Resources\transp.png
中採用相同的圖像對所有三個圖像,但你完全可以替代transparentImg的圖像1和圖像2到合適的圖像。

演示開始後,中間的圖像可以在窗體周圍拖放。

public partial class Form1 : Form 
{ 
    private readonly Image transparentImg; // The transparent image 
    private bool isMoving = false;   // true while dragging the image 
    private Point movingPicturePosition = new Point(80, 20); // the position of the moving image 
    private Point offset; // mouse position inside the moving image while dragging 
    public Form1() 
    { 
     InitializeComponent(); 

     // 
     // pictureBox1 
     // 
     this.pictureBox1.Location = new System.Drawing.Point(0, 0); 
     this.pictureBox1.Name = "pictureBox1"; 
     this.pictureBox1.Size = new System.Drawing.Size(231, 235); 
     this.pictureBox1.TabIndex = 0; 
     this.pictureBox1.TabStop = false; 
     this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint); 
     this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown); 
     this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove); 
     this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp); 
     this.Controls.Add(this.pictureBox1); 
     transparentImg = Image.FromFile("..\\..\\Resources\\transp.png"); 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     var g = e.Graphics; 
     g.DrawImageUnscaled(transparentImg, new Point(20, 20));  // image1 
     g.DrawImageUnscaled(transparentImg, new Point(140, 20));  // image2 
     g.DrawImageUnscaled(transparentImg, movingPicturePosition); // image3 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     var r = new Rectangle(movingPicturePosition, transparentImg.Size); 
     if (r.Contains(e.Location)) 
     { 
      isMoving = true; 
      offset = new Point(movingPicturePosition.X - e.X, movingPicturePosition.Y - e.Y); 
     } 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      movingPicturePosition = e.Location; 
      movingPicturePosition.Offset(offset); 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     isMoving = false; 
    } 
} 
+0

謝謝,你的回答很多Albin,它比我預期的更好,偉大的工作! – 2010-11-16 03:58:36

+0

您需要在MouseDown中捕獲鼠標並在MouseUp中釋放捕獲。這確保即使用戶移出窗口時也會發送移動消息。 – Tergiver 2010-11-25 15:17:45

+0

謝謝加載...這是一個很好的答案! – 2011-08-05 06:08:01

2

對於初學者來說,PictureBox3的BackColor屬性設置爲透明。這幾乎適用於所有情況。

您還應該使用具有透明背景而不是白色的圖像,以便您的紫色圓圈周圍沒有白色邊框。 (推薦圖像格式:PNG)


更新
之後我得到了,它的出現設置BackColor以透明不起作用的答覆。在這種情況下,最好處理PictureBox的Paint事件,並自己將新圖像繪製爲Albin suggested

+0

我試圖設置backcolor爲透明,但它不起作用,它給出了形式的顏色.. – 2010-11-10 12:42:24

+0

Javed是正確的,將BackColor設置爲透明不會使實際控制透明 – 2010-11-10 12:47:37

+2

它是透明的,但你看到* form * 像素。堆疊效果不起作用。它可以使工作,但它是很難受的。自己合併圖像要容易得多。 – 2010-11-10 13:36:55

0

你可以通過覆蓋OnPaint和東西來做一些破解,例如here

但我建議將pictureBox2和3中的圖片合併到單個圖片中,然後再將它們顯示在單個圖片框中。

+0

他有可能爲孩子寫一個應用程序,你知道......形狀匹配等等。 – 2010-11-10 12:39:15

+0

我想移動的圖像2圖像3在更新後的問題... – 2010-11-10 12:41:09

+0

@Alex,醒目的MouseDown和mousemove一些重新粉刷應採取照顧。 – 2010-11-10 12:42:30

2

此代碼將這樣的伎倆:

using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
{ 
    g.DrawImage(pictureBox2.Image, 
     (int)((pictureBox1.Image.Width - pictureBox2.Image.Width)/2), 
     (int)((pictureBox1.Image.Height - pictureBox2.Image.Height)/2)); 
    g.Save(); 
    pictureBox1.Refresh(); 
} 

它將從pictureBox2畫pictureBox1的現有圖像上的圖像。

8

確保pictureBox3中的圖像是透明的。將BackColor設置爲透明。在代碼中,將pictureBox3Parent屬性設置爲pictureBox2。調整Location的座標pictureBox3,因爲一旦您更改了Parent,它們將相對於pictureBox2的座標。

private void Form1_Load(object sender, EventArgs e) 
    { 
     pictureBox3.Parent = pictureBox2; 
     pictureBox3.Location = 
      new Point(
       pictureBox3.Location.X 
       - pictureBox2.Location.X, 
       pictureBox3.Location.Y 
       - pictureBox2.Location.Y); 

    } 

在設計師你不會看到透明度,但在運行時你會。

更新

在圖像中,左側顯示設計視圖,右側是運行版本。 Left: Designer view, Right: How it looks at runtime

另一個更新

我真不明白怎麼會是可能的,這並不爲你工作。我想我們必須做出與衆不同的事情。我將描述創建工作示例的確切步驟。如果您遵循完全相同的步驟,我想知道我們是否會得到相同的結果。接下來的步驟描述了要做什麼,並使用我在網上找到的兩張圖片。

  • 使用Visual Studio 2008,使用模板Windows窗體應用程序創建一個新項目。確保該項目針對.NET Framework 3.5。
  • 將窗體的大小設置爲457; 483。
  • 將一個PictureBox控件拖到窗體上。將其位置設置爲0; 0並將其大小設置爲449; 449。
  • 單擊省略號除了它的圖像屬性,單擊導入...按鈕,並在http://a.dryicons.com/files/graphics_previews/retro_blue_background.jpg導入圖像(只需鍵入文件名文本框中輸入URL,然後單擊打開)。然後單擊確定以使用該圖像。
  • 將另一個的PictureBox到窗體上,其位置設置爲0,0和它的尺寸爲256; 256。同時將其BackColor屬性設置爲Transparent。
  • 使用相同的方法,如上所述,導入圖像http://www.axdn.com/redist/axiw_i.png其爲透明圖像。
  • 現在將下面的代碼在窗體的onload事件處理:

    private void Form1_Load(object sender, EventArgs e) 
    { 
        pictureBox2.Parent = pictureBox1; 
    } 
    

這就是它!如果我運行這個程序,我會在另一個圖像上獲得透明圖像。

+0

你可能會認爲你也可以通過使用'pictureBox3.Location.Offset'來改變位置,但這不起作用,因爲'Location'屬性返回一個值,而不是引用。如果你想使用'Offset',你必須創建一個變量來保存'Point',使用'Offset'作爲該變量,並將其分配給'pictureBox3.Location'。 – comecme 2010-12-11 17:51:35

+0

我已經試過(設置父屬性),但它不會透明... – 2010-12-12 03:08:40

+0

這很奇怪。在我的情況下,它確實有效。我添加了一張顯示結果的圖片。你有沒有注意到我說它在設計器中不會是透明的,而只是在運行時? – comecme 2010-12-12 16:12:55