2010-03-07 3 views
1

Я ищу кнопку управления, которая будет AutoSize его изображение. Обычные кнопки управления этим не будут. Я использую C# .Net 2.0.ImageButton, что будет авторазмер изображения

Например, у меня есть кнопка размером 200 x 50 пикселей и изображение 800 x 100 пикселей. Я хочу изменить размер изображения так, чтобы он был немного слева, рядом с текстом кнопки. С PictureBox я могу это сделать. Но когда я лежал PictureBox над Button, это было очень уродливо, потому что вы не можете щелкнуть там.

ответ

5

Вы можете сделать это следующим образом:

button.Image = Image.FromFile(path); 
button.AutoSize = true; 

Например: Или, Вы можете создать новый тип кнопки, которая будет изменять размер изображения:

public class AutoSizeButton : Button 
{ 

    public new Image Image 
    { 
     get { return base.Image; } 
     set 
     { 
      Image newImage = new Bitmap(Width, Height); 
      using (Graphics g = Graphics.FromImage(newImage)) 
      { 
       g.DrawImage(value, 0, 0, Width, Height); 
      } 
      base.Image = newImage; 
     } 
    } 
} 

Тест:

AutoSizeButton button = new AutoSizeButton(); 
button.Location = new Point(27, 52); 
button.Name = "button"; 
button.Size = new Size(75, 23); 
button.Text = "Test"; 
button.UseVisualStyleBackColor = true; 
button.Image = Image.FromFile(path); 
Controls.Add(button); 
+0

TAHT Autosize кнопку к изображению, а не изображение на кнопке. Чтобы уточнить, я отредактирую свой вопрос. – Kovu

0

Первоначально я предлагал использовать стандартный ImageButton, но затем прочитал ваш комментарий, что вы пытаетесь изменить размер кнопки изображение. Для этого используют LinkButton:

<asp:LinkButton ID="foo" runat="server" OnClick="LinkButton1_Click"> 
    <asp:Image ID="imagefoo" runat="server" ImageUrl="~/Foo.jpg" /> 
</asp:LinkButton> 
4

Я искал версию этого в vb.net, так что я начал с ответом Михайло и улучшили это немного. Этот код изменяет размер изображения пропорционально, центрирует изображение в кнопке и обеспечивает внутреннее заполнение изображения.

Эта кнопка фактически не использует свойство «Изображение» кнопки и предоставляет свойство «AutoScaleImage», которое должно устанавливаться попеременно.

Вот версия C# - VB.net внизу. Наслаждайтесь!

[System.ComponentModel.DesignerCategory("")] 
public class AutoScaleButton : Button 
{ 

    private Image _AutoScaleImage; 
    public Image AutoScaleImage { 
    get { return _AutoScaleImage; } 
    set { 
     _AutoScaleImage = value; 
     if (value != null) 
     this.Invalidate(); 
    } 
    } 

    private int _AutoScaleBorder; 
    public int AutoScaleBorder { 
    get { return _AutoScaleBorder; } 
    set { 
     _AutoScaleBorder = value; 
     this.Invalidate(); 
    } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
    base.OnPaint(e); 
    DrawResizeImage(ref e.Graphics); 
    } 


    private void DrawResizeImage(Graphics g) 
    { 
    if (_AutoScaleImage == null) 
     return; 
    int iB = AutoScaleBorder; 
    int iOff = 0; 
    Rectangle rectLoc = default(Rectangle); 
    Rectangle rectSrc = default(Rectangle); 

    Size sizeDst = new Size(Math.Max(0, this.Width - 2 * iB), 
      Math.Max(0, this.Height - 2 * iB)); 
    Size sizeSrc = new Size(_AutoScaleImage.Width, 
      _AutoScaleImage.Height); 
    double ratioDst = sizeDst.Height/sizeDst.Width; 
    double ratioSrc = sizeSrc.Height/sizeSrc.Width; 

    rectSrc = new Rectangle(0, 0, sizeSrc.Width, sizeSrc.Height); 

    if (ratioDst < ratioSrc) { 
     iOff = (sizeDst.Width - 
     (sizeDst.Height * sizeSrc.Width/sizeSrc.Height))/2; 
     rectLoc = new Rectangle(iB + iOff, 
      iB, 
      sizeDst.Height * sizeSrc.Width/sizeSrc.Height, 
      sizeDst.Height); 
    } else { 
     iOff = (sizeDst.Height - (sizeDst.Width * sizeSrc.Height/sizeSrc.Width))/2; 
     rectLoc = new Rectangle(iB, 
      iB + iOff, 
      sizeDst.Width, 
      sizeDst.Width * sizeSrc.Height/sizeSrc.Width); 
    } 

    g.DrawImage(_AutoScaleImage, rectLoc, rectSrc, GraphicsUnit.Pixel); 

    } 

} 

Или моя оригинальная версия VB.NET.

<System.ComponentModel.DesignerCategory("")> _ 
Public Class AutoScaleButton 
    Inherits Button 

    Private _AutoScaleImage As Image 
    Public Property AutoScaleImage() As Image 
    Get 
     Return _AutoScaleImage 
    End Get 
    Set(value As Image) 
     _AutoScaleImage = value 
     If value IsNot Nothing Then Me.Invalidate() 
    End Set 
    End Property 

    Private _AutoScaleBorder As Integer 
    Public Property AutoScaleBorder() As Integer 
    Get 
     Return _AutoScaleBorder 
    End Get 
    Set(ByVal value As Integer) 
     _AutoScaleBorder = value 
     Me.Invalidate() 
    End Set 
    End Property 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 
    MyBase.OnPaint(e) 
    DrawResizeImage(e.Graphics) 
    End Sub 

    Private Sub DrawResizeImage(ByRef g As Graphics) 

    If _AutoScaleImage Is Nothing Then Exit Sub 
    Dim iB As Integer = AutoScaleBorder, iOff As Integer = 0 
    Dim rectLoc As Rectangle, rectSrc As Rectangle 

    Dim sizeDst As Size = New Size(Math.Max(0, Me.Width - 2 * iB), Math.Max(0, Me.Height - 2 * iB)) 
    Dim sizeSrc As Size = New Size(_AutoScaleImage.Width, _AutoScaleImage.Height) 
    Dim ratioDst As Double = sizeDst.Height/sizeDst.Width 
    Dim ratioSrc As Double = sizeSrc.Height/sizeSrc.Width 

    rectSrc = New Rectangle(0, 0, sizeSrc.Width, sizeSrc.Height) 

    If ratioDst < ratioSrc Then 
     iOff = (sizeDst.Width - (sizeDst.Height * sizeSrc.Width/sizeSrc.Height))/2 
     rectLoc = New Rectangle(iB + iOff, iB, _ 
           sizeDst.Height * sizeSrc.Width/sizeSrc.Height, _ 
           sizeDst.Height) 
    Else 
     iOff = (sizeDst.Height - (sizeDst.Width * sizeSrc.Height/sizeSrc.Width))/2 
     rectLoc = New Rectangle(iB, iB + iOff, _ 
           sizeDst.Width, _ 
           sizeDst.Width * sizeSrc.Height/sizeSrc.Width) 
    End If 

    g.DrawImage(_AutoScaleImage, rectLoc, rectSrc, GraphicsUnit.Pixel) 

    End Sub 

End Class 
+0

Код не компилируется, 'DrawResizeImage (ref e.Graphics);' выдает ошибку. Однако при его исправлении (нет необходимости в 'ref', в C# все объекты, за исключением типов значений, передаются по ссылке в любом случае), именно это я и искал. –

2
public class ExtButton : Button 
{ 

    public new Image Image 
    { 
     get { return base.Image; } 
     set { 
      base.Image = ScaleImage(value, this.Width, this.Height); 
     } 
    } 

    private Image ScaleImage(Image image, int maxWidth, int maxHeight) 
    { 
     var ratioX = (double)maxWidth/image.Width; 
     var ratioY = (double)maxHeight/image.Height; 
     var ratio = Math.Min(ratioX, ratioY); 

     var newWidth = (int)(image.Width * ratio); 
     var newHeight = (int)(image.Height * ratio); 

     var newImage = new Bitmap(newWidth, newHeight); 
     Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight); 
     return newImage; 
    } 

} 
Смежные вопросы