Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调整大小时调整按钮中包含的图像大小_C#_Winforms_Button - Fatal编程技术网

C# 调整大小时调整按钮中包含的图像大小

C# 调整大小时调整按钮中包含的图像大小,c#,winforms,button,C#,Winforms,Button,我有一个包含图像和文本的按钮: 调整应用程序大小时,我会调整标签大小以适应新按钮的高度,但不会调整图像大小: 我看到一个解决方案是将图像设置为BackgroundImage,但它与我的按钮的设计不匹配: this.buttonClose.Dock = System.Windows.Forms.DockStyle.Fill; this.buttonClose.Image = ((System.Drawing.Image)(resources.GetObject("buttonClose.Image

我有一个包含图像和文本的按钮:

调整应用程序大小时,我会调整标签大小以适应新按钮的高度,但不会调整图像大小:

我看到一个解决方案是将图像设置为BackgroundImage,但它与我的按钮的设计不匹配:

this.buttonClose.Dock = System.Windows.Forms.DockStyle.Fill;
this.buttonClose.Image = ((System.Drawing.Image)(resources.GetObject("buttonClose.Image")));
this.buttonClose.Name = "buttonClose";
this.buttonClose.Size = new System.Drawing.Size(482, 28);
this.buttonClose.Text = "Close";
this.buttonClose.TextAlign = ContentAlignment.MiddleRight;
this.buttonClose.TextImageRelation = TextImageRelation.ImageBeforeText;
this.buttonClose.UseVisualStyleBackColor = true;
this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);

如果要自动调整应用程序的大小,请使用此方法

创建名为resize的类

并粘贴此代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace YOUR APPLICATION NAMESPACE
{

   public class ClassResize
    {
       List<System.Drawing.Rectangle> AryControlsStorage = new List<System.Drawing.Rectangle>();
       private bool ShowRowHeader=false;

       private Form form { get; set; }
       private float FontSize { get; set; }
       private System.Drawing.SizeF FormSize { get; set; }

       public ClassResize(Form FForm)
       {
           form = FForm;
           FormSize = FForm.ClientSize;
           FontSize = FForm.Font.Size;
       }
       private static IEnumerable<Control> GetAllControls(Control c)
       {
           return c.Controls.Cast<Control>().SelectMany(item=>           
           GetAllControls(item)).Concat(c.Controls.Cast<Control>()).Where(control=>
                control.Name !=string.Empty);
       }
       public void GetInitialSize()
       {
           var _Controls = GetAllControls(form);
           foreach (Control control in _Controls)
           {
               AryControlsStorage.Add(control.Bounds);
               if (control.GetType() == typeof(DataGridView))
                   DGColumnAdjust(((DataGridView)control), ShowRowHeader);

           }

       }
       public void Resize()
       {
           double FormRatioWidth = (double)form.ClientSize.Width / (double)FormSize.Width;
           double FormRatioHeight=(double)form.ClientSize.Height / (double)FormSize.Height;
           var _Controls = GetAllControls(form);
           int Postion = -1;
           foreach(Control control in _Controls)
           {
               Postion += 1;
               System.Drawing.Size _ControlsSize = new System.Drawing.Size((int)(AryControlsStorage[Postion].Width * FormRatioWidth),
                   (int)(AryControlsStorage[Postion].Height * FormRatioHeight));
               System.Drawing.Point _ControlsPoint = new System.Drawing.Point((int)(AryControlsStorage[Postion].X * FormRatioWidth),
    (int)(AryControlsStorage[Postion].Y * FormRatioHeight));
               control.Bounds = new System.Drawing.Rectangle(_ControlsPoint, _ControlsSize);
               if (control.GetType() == typeof(DataGridView))
                   DGColumnAdjust(((DataGridView)control),ShowRowHeader);
               //control.Font = new System.Drawing.Font(form.Font.FontFamily,
               //(float)(((Convert.ToDouble(FontSize) * FormRatioWidth) / 1.5) + ((Convert.ToDouble(FontSize) * FormRatioHeight) / 1.5)));



           }

       }

       private void DGColumnAdjust(DataGridView dgv, bool _showRowHeader)
       {
           int intRowHeader = 0;
           const int Hscrolbarwidth = 5;
           if (_showRowHeader)
           {
               intRowHeader = dgv.RowHeadersWidth;
           }
           else
           {
               dgv.RowHeadersVisible = false;
           }
               for (int i = 0; i < dgv.ColumnCount; i++)
               {
                   if (dgv.Dock == DockStyle.Fill)
                       dgv.Columns[i].Width = ((dgv.Width - intRowHeader) / dgv.ColumnCount);
                   else
                       dgv.Columns[i].Width = ((dgv.Width - intRowHeader - Hscrolbarwidth) / dgv.ColumnCount);

               }
           }


    }
}

这将自动调整窗体中所有控件的大小

最终找到了一个解决方案,可能不是最好的,但运行良好:

private Dictionary<Button, Image> dicButtonsBaseImage = new Dictionary<Button, Image>();
private void SetImageButton(Button btn, Image img)
{
    // Initiate image for button
    btn.Image = img;

    // set method dor sizeChanged
    btn.SizeChanged += Control_SizeChanged;

    // Save image associated for this button
    if (!dicButtonsBaseImage.ContainsKey(btn))
        dicButtonsBaseImage.Add(btn, img);
    else
        dicButtonsBaseImage[btn] = img;

    // Init image size
    resizeImageSize(btn);
}

private void Control_SizeChanged(object sender, EventArgs e)
{
    Control c = sender as Control;
    if (c != null)
    {
        Button b = sender as Button;
        if (b != null)
        {
            resizeImageSize(b);
        }
    }
}

private static void resizeImageSize(Button b)
{
    if (b.Image != null && dicButtonsBaseImage.ContainsKey(b))
    {
        // Set a margin (top/bot) to 8px
        if (b.Height - 8 < dicButtonsBaseImage[b].Height)
        {
            int newHeight = b.Height - 8;
            if (newHeight <= 0)
                newHeight = 1;
            Image img = new Bitmap(dicButtonsBaseImage[b], new Size(dicButtonsBaseImage[b].Width, newHeight));
            b.Image = img;
        }
        else
        {
            b.Image = dicButtonsBaseImage[b];
        }
    }
}

可能重复@fuchs777正如我所说的,我不想使用BackgroundImage同时拥有文本和图像我不想使用BackgroundImage同时拥有文本和图像,但你也可以使用BackgroundImage同时拥有这两个!加上背景图像拉伸和缩放的布局选项@是的,我可以使用BackgroundImageLayout,但我不能或不知道如何定义图像显示的位置。在“我的关闭”按钮中,图像和文本被定义为ImageBeforeText,并且都位于中间。我不认为我可以有相同的行为背景。我想把文字和图像想象成一个街区。你可以在图片右侧添加一些空白,创建每个图片的2-3个版本,或者动态调整图片的大小。是的,我知道,但这种方法解决了调整大小的问题。嗯,他没有。只有图像有,我看不出你的代码会有什么帮助。。
private Dictionary<Button, Image> dicButtonsBaseImage = new Dictionary<Button, Image>();
private void SetImageButton(Button btn, Image img)
{
    // Initiate image for button
    btn.Image = img;

    // set method dor sizeChanged
    btn.SizeChanged += Control_SizeChanged;

    // Save image associated for this button
    if (!dicButtonsBaseImage.ContainsKey(btn))
        dicButtonsBaseImage.Add(btn, img);
    else
        dicButtonsBaseImage[btn] = img;

    // Init image size
    resizeImageSize(btn);
}

private void Control_SizeChanged(object sender, EventArgs e)
{
    Control c = sender as Control;
    if (c != null)
    {
        Button b = sender as Button;
        if (b != null)
        {
            resizeImageSize(b);
        }
    }
}

private static void resizeImageSize(Button b)
{
    if (b.Image != null && dicButtonsBaseImage.ContainsKey(b))
    {
        // Set a margin (top/bot) to 8px
        if (b.Height - 8 < dicButtonsBaseImage[b].Height)
        {
            int newHeight = b.Height - 8;
            if (newHeight <= 0)
                newHeight = 1;
            Image img = new Bitmap(dicButtonsBaseImage[b], new Size(dicButtonsBaseImage[b].Width, newHeight));
            b.Image = img;
        }
        else
        {
            b.Image = dicButtonsBaseImage[b];
        }
    }
}