2013-07-07 178 views
0

我在.NET中的按鈕上的圖像有一個相當惱人的問題。它們的行爲並不像您期望按鈕上的圖像行爲那樣。單擊按鈕時按鈕圖像與文本不對齊?

在按鈕的屬性中,您可以設置圖像。所以我選擇一個圖像,並在按鈕上顯示圖像!到現在爲止還挺好。 單擊按鈕或按下狀態時,按鈕文本向下移動一個像素以創建深度。但不是形象!它會保持在同一個位置,而且看起來很奇怪。 還有BackgroundImage屬性,但更糟的是!因爲如果我將BackgroundImageLayout設置爲None而不是Center,圖像將向上移動,並在按下時向左移動,這是文本的完全相反方向!那是怎麼回事?

無論如何,我想要實現的是一個按鈕圖像,就像文本在按鈕處於按下狀態時移動一樣。有沒有辦法做到這一點?

回答

0

只需製作一個新圖像並將原始圖像粘貼到一個偏移處。然後將其設置爲ButtonImage

例子:

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); 
    } 
} 
+0

這很好地工作,直到您按下按鈕時將光標移到按鈕外面。該按鈕將再次彈出,文本也會彈出,但不會顯示圖像。 此外,一些圖形佈局沒有向下/向右移動文本,所以有一些方法可以確定文本的位置或其他內容,所以圖像始終與文本具有相同的偏移量。 – Labbed

+0

@Labbed:我不知道獲取文本偏移量,您可能需要將按鈕繪製到位圖(有一個函數:'button1.DrawToBitmap')並查找黑色像素。不過,我會編輯我的答案,以便在光標離開按鈕區域時解決問題。 – Timo

+0

謝謝,但現在只要我按下按鈕,它就會觸發MouseDown。尋找黑色像素也不是一個好主意,因爲你可以改變文本的顏色,今天大多數系統都使用ClearType作爲控制文本,所以你也不能查找系統顏色。我實際上甚至沒有使用按鈕上的文字,我只是想讓圖像像其他程序一樣在按鈕上的圖像上移動。我不明白爲什麼.NET默認情況下有這種奇怪的行爲。 – Labbed