我有一個問題:一個PictureBox問題
我有3個不同的圖像3個圖片框爲圖片
我能設置爲pictureBox3所以無論圖像看起來一樣.... 。
編輯: 我想移動pictur eBox3上pictureBox2,
所以沒有選擇將它們合併到單個圖像
我有一個問題:一個PictureBox問題
我有3個不同的圖像3個圖片框爲圖片
我能設置爲pictureBox3所以無論圖像看起來一樣.... 。
編輯: 我想移動pictur eBox3上pictureBox2,
所以沒有選擇將它們合併到單個圖像
我會添加另一個例子,根據更新的要求允許移動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;
}
}
對於初學者來說,PictureBox3的BackColor
屬性設置爲透明。這幾乎適用於所有情況。
您還應該使用具有透明背景而不是白色的圖像,以便您的紫色圓圈周圍沒有白色邊框。 (推薦圖像格式:PNG)
更新
之後我得到了,它的出現設置BackColor
以透明不起作用的答覆。在這種情況下,最好處理PictureBox的Paint
事件,並自己將新圖像繪製爲Albin suggested。
我試圖設置backcolor爲透明,但它不起作用,它給出了形式的顏色.. – 2010-11-10 12:42:24
Javed是正確的,將BackColor設置爲透明不會使實際控制透明 – 2010-11-10 12:47:37
它是透明的,但你看到* form * 像素。堆疊效果不起作用。它可以使工作,但它是很難受的。自己合併圖像要容易得多。 – 2010-11-10 13:36:55
你可以通過覆蓋OnPaint和東西來做一些破解,例如here。
但我建議將pictureBox2和3中的圖片合併到單個圖片中,然後再將它們顯示在單個圖片框中。
他有可能爲孩子寫一個應用程序,你知道......形狀匹配等等。 – 2010-11-10 12:39:15
我想移動的圖像2圖像3在更新後的問題... – 2010-11-10 12:41:09
@Alex,醒目的MouseDown和mousemove一些重新粉刷應採取照顧。 – 2010-11-10 12:42:30
此代碼將這樣的伎倆:
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的現有圖像上的圖像。
確保pictureBox3
中的圖像是透明的。將BackColor
設置爲透明。在代碼中,將pictureBox3
的Parent
屬性設置爲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);
}
在設計師你不會看到透明度,但在運行時你會。
更新
在圖像中,左側顯示設計視圖,右側是運行版本。
另一個更新
我真不明白怎麼會是可能的,這並不爲你工作。我想我們必須做出與衆不同的事情。我將描述創建工作示例的確切步驟。如果您遵循完全相同的步驟,我想知道我們是否會得到相同的結果。接下來的步驟描述了要做什麼,並使用我在網上找到的兩張圖片。
現在將下面的代碼在窗體的onload事件處理:
private void Form1_Load(object sender, EventArgs e)
{
pictureBox2.Parent = pictureBox1;
}
這就是它!如果我運行這個程序,我會在另一個圖像上獲得透明圖像。
你可能會認爲你也可以通過使用'pictureBox3.Location.Offset'來改變位置,但這不起作用,因爲'Location'屬性返回一個值,而不是引用。如果你想使用'Offset',你必須創建一個變量來保存'Point',使用'Offset'作爲該變量,並將其分配給'pictureBox3.Location'。 – comecme 2010-12-11 17:51:35
我已經試過(設置父屬性),但它不會透明... – 2010-12-12 03:08:40
這很奇怪。在我的情況下,它確實有效。我添加了一張顯示結果的圖片。你有沒有注意到我說它在設計器中不會是透明的,而只是在運行時? – comecme 2010-12-12 16:12:55
謝謝,你的回答很多Albin,它比我預期的更好,偉大的工作! – 2010-11-16 03:58:36
您需要在MouseDown中捕獲鼠標並在MouseUp中釋放捕獲。這確保即使用戶移出窗口時也會發送移動消息。 – Tergiver 2010-11-25 15:17:45
謝謝加載...這是一個很好的答案! – 2011-08-05 06:08:01