2013-07-07 3 views
0

J'ai un problème plutôt irritant avec les images sur les boutons dans .NET. Ils ne se comportent pas comme vous vous attendez à ce qu'une image sur un bouton se comporte.L'image du bouton n'est pas alignée avec le texte lorsque vous cliquez sur le bouton?

Dans les propriétés d'un bouton, vous pouvez définir Image. Donc je sélectionne une image et l'image apparaît sur le bouton! Jusqu'ici tout va bien. Lorsqu'un bouton est cliqué, ou dans un état enfoncé, le texte du bouton se déplace vers le bas et vers la droite d'un pixel pour créer une profondeur. Mais pas l'image! Il restera dans la même position, et il aura l'air bizarre. Il y a aussi la propriété BackgroundImage, mais c'est encore pire! Car si je définis BackgroundImageLayout sur None au lieu de Center, l'image se déplacera et laissera lorsque j'appuierai, dans la direction opposée du texte! Qu'est-ce qui se passe avec ça? Quoi qu'il en soit, ce que je veux réaliser est une image de bouton qui se déplace exactement comme le texte se déplacerait lorsque le bouton est dans un état enfoncé. Y a-t-il un moyen de faire cela?

Répondre

0

Juste faire une nouvelle image et coller l'original à un décalage. Définissez ensuite comme ButtonImage.

Exemple:

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"); 
} 

EDIT: La fonction suivante corrige un problème où l'image ne serait pas « pop » en arrière lorsque le curseur quitte la zone du bouton tandis que le bouton de la souris est toujours pressée (voir Peines commentaire ci-dessous):

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

Cela fonctionne bien jusqu'à ce que vous déplaciez le curseur en dehors du bouton pendant que le bouton est enfoncé. Le bouton apparaîtra à nouveau, tout comme le texte, mais pas l'image. De même, certaines mises en page graphiques n'ont pas le texte vers le bas/droite, donc ce serait génial d'avoir un moyen de déterminer la position du texte, ou quelque chose, donc l'image a toujours le même décalage que le texte. – Labbed

+0

@Labbed: Je ne suis pas sûr d'obtenir le décalage de texte, vous devrez probablement dessiner le bouton sur un bitmap (il y a une fonction pour cela: 'button1.DrawToBitmap') et rechercher des pixels noirs. Cependant, je vais modifier ma réponse pour résoudre le problème lorsque le curseur quitte la zone du bouton. – Timo

+0

Merci, mais maintenant il va déclencher MouseDown dès que je passe le bouton. La recherche de pixels noirs n'est pas non plus une bonne idée, puisque vous pouvez changer la couleur du texte et la plupart des systèmes utilisent aujourd'hui ClearType pour le texte de contrôle, donc vous ne pouvez pas non plus rechercher la couleur du système. Je n'utilise même pas de texte sur le bouton, je veux juste que l'image bouge comme dans d'autres programmes avec des images sur les boutons. Je ne comprends pas pourquoi .NET a ce comportement bizarre par défaut. – Labbed

Questions connexes