只需製作一個新圖像並將原始圖像粘貼到一個偏移處。然後將其設置爲Button
的Image
。
例子:
private void button1_MouseDown(object sender, MouseEventArgs e)
{
// replace "button_image.png" with the filename of the image you are using
Image normalImage = Image.FromFile("button_image.png");
Image mouseDownImage = new Bitmap(normalImage.Width + 1, normalImage.Height + 1);
Graphics g = Graphics.FromImage(mouseDownImage);
// this will draw the normal image at an offset on mouseDownImage
g.DrawImage(normalImage, 1, 1); // offset is one pixel each for x and y
// clean up
g.Dispose();
button1.Image = mouseDownImage;
}
private void button1_MouseUp(object sender, MouseEventArgs e)
{
// reset image to the normal one
button1.Image = Image.FromFile("button_image.png");
}
編輯:以下功能修復了一個問題,即圖像不「流行」備份當光標離開按鈕區域,而鼠標按鍵仍然按下(見工黨以下評論):
private void button1_MouseMove(object sender, MouseEventArgs e)
{
Point relMousePos = e.Location;
bool mouseOverButton = true;
mouseOverButton &= relMousePos.X > 0;
mouseOverButton &= relMousePos.X < button1.Width;
mouseOverButton &= relMousePos.Y > 0;
mouseOverButton &= relMousePos.Y < button1.Height;
if (mouseOverButton != MouseButtons.None)
{
button1_MouseDown(sender, e);
}
else
{
button1_MouseUp(sender, e);
}
}
這很好地工作,直到您按下按鈕時將光標移到按鈕外面。該按鈕將再次彈出,文本也會彈出,但不會顯示圖像。 此外,一些圖形佈局沒有向下/向右移動文本,所以有一些方法可以確定文本的位置或其他內容,所以圖像始終與文本具有相同的偏移量。 – Labbed
@Labbed:我不知道獲取文本偏移量,您可能需要將按鈕繪製到位圖(有一個函數:'button1.DrawToBitmap')並查找黑色像素。不過,我會編輯我的答案,以便在光標離開按鈕區域時解決問題。 – Timo
謝謝,但現在只要我按下按鈕,它就會觸發MouseDown。尋找黑色像素也不是一個好主意,因爲你可以改變文本的顏色,今天大多數系統都使用ClearType作爲控制文本,所以你也不能查找系統顏色。我實際上甚至沒有使用按鈕上的文字,我只是想讓圖像像其他程序一樣在按鈕上的圖像上移動。我不明白爲什麼.NET默認情況下有這種奇怪的行爲。 – Labbed