Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# 缩放父窗体中最大化MDI子级使用的图标';梅努斯特普酒店_C#_.net_Winforms_Icons_Mdi - Fatal编程技术网

C# 缩放父窗体中最大化MDI子级使用的图标';梅努斯特普酒店

C# 缩放父窗体中最大化MDI子级使用的图标';梅努斯特普酒店,c#,.net,winforms,icons,mdi,C#,.net,Winforms,Icons,Mdi,在MDI应用程序中,当MDI子窗体最大化时,该窗体的图标将用作上下文菜单图标,显示在父窗体菜单的左侧。当我将MDI应用程序中使用的表单的图标设置为大于16x16(我使用的是32x32)的值时,图标将不缩放,菜单的大小也会随之调整。请注意,如果ICO文件还包含16x16版本的图标,则其工作正常 下面创建了一个显示行为的基本应用程序: 创建新的解决方案和WinForms项目 将Form1的IsMdiContainer更改为true 在表单1中添加一个MenuStrip 创建一个新表单,将其称为Md

在MDI应用程序中,当MDI子窗体最大化时,该窗体的图标将用作上下文菜单图标,显示在父窗体菜单的左侧。当我将MDI应用程序中使用的表单的图标设置为大于16x16(我使用的是32x32)的值时,图标将不缩放,菜单的大小也会随之调整。请注意,如果ICO文件还包含16x16版本的图标,则其工作正常

下面创建了一个显示行为的基本应用程序:

  • 创建新的解决方案和WinForms项目
  • 将Form1的IsMdiContainer更改为
    true
  • 在表单1中添加一个
    MenuStrip
  • 创建一个新表单,将其称为
    MdiChildForm
  • 将MdiChildForm的图标设置为32x32 ICO文件
  • Form1
    添加菜单项中,双击该菜单项以创建
    单击事件处理程序并添加以下内容:

    var child = new MdiChildForm();
    child.MdiParent = this;
    child.Show();
    child.WindowState = FormWindowState.Maximized;
    
  • 构建并运行,单击菜单项

请注意,当再次单击菜单项时,图标将更改为默认图标,这在中进行了描述,而不是此处的问题


我很确定这会被描述为“设计的”,但它仍然很烦人。有没有办法强制上下文菜单图标缩小,比如调整源图标的大小?我可能也会这么做,但我在追求某种代码内的通吃。

我尝试了各种方法,唯一可行的方法是使用16x16大小的图标,以及表单标准的32x32图标:

var child = new MdiChildForm();
child.MdiParent = this;
child.Icon = new System.Drawing.Icon("scanner_magnifier_16x16.ico", new Size(16, 16));    
child.Show();
child.WindowState = FormWindowState.Maximized;

我尝试了各种方法,唯一可行的方法是使用16x16大小的图标,以及表单标准32x32图标:

var child = new MdiChildForm();
child.MdiParent = this;
child.Icon = new System.Drawing.Icon("scanner_magnifier_16x16.ico", new Size(16, 16));    
child.Show();
child.WindowState = FormWindowState.Maximized;

受@Jeremy Thompson回答的启发,我找到了一个可能的解决办法。我将超大的图标绘制成一个新的16x16位图,从中创建一个新图标,并将其分配回子窗体。在显示表单之前,需要指定新图标

这段代码几乎没有经过测试,而且可能有bug和漏洞,我不是GDI专家,所以要小心它可能会破坏东西:

var bmp = new Bitmap(16, 16);
using (var g = Graphics.FromImage(bmp))
{
    g.DrawImage(child.Icon.ToBitmap(), new Rectangle(0, 0, 16, 16));
}
var newIcon = Icon.FromHandle(bmp.GetHicon());
child.Icon = newIcon;
// ...
child.Show();

受@Jeremy Thompson回答的启发,我找到了一个可能的解决办法。我将超大的图标绘制成一个新的16x16位图,从中创建一个新图标,并将其分配回子窗体。在显示表单之前,需要指定新图标

这段代码几乎没有经过测试,而且可能有bug和漏洞,我不是GDI专家,所以要小心它可能会破坏东西:

var bmp = new Bitmap(16, 16);
using (var g = Graphics.FromImage(bmp))
{
    g.DrawImage(child.Icon.ToBitmap(), new Rectangle(0, 0, 16, 16));
}
var newIcon = Icon.FromHandle(bmp.GetHicon());
child.Icon = newIcon;
// ...
child.Show();

我也面临同样的问题。但似乎通过简单地将额外的16x16图标图像添加到*.ICO文件中就成功地解决了这个问题

我使用了Axialis AX图标,如下所示: 1) 打开*.ICO文件,单击Ctrl+A选择完整图标图像,单击Ctrl+C(复制到剪贴板) 2) 单击“新建图像格式”,选择16x16,为该*.ICO文件选择合适的颜色 3) 单击Ctrl+V(粘贴),选择“调整图像大小以适应编辑器区域” 4) 单击“保存” 5) 对我的应用程序中MDI表单使用的每个*.ICO文件重复相同的操作 6) 然后打开我的应用程序中的每个MDI表单,单击表单的“图标”属性并选择使用相同*.ICO文件的新版本


正如我现在看到的,它工作得很好。在菜单中,它使用小图标,所以当MDI窗体最大化时,主菜单的大小不再跳跃。

我也遇到了同样的问题。但似乎通过简单地将额外的16x16图标图像添加到*.ICO文件中就成功地解决了这个问题

我使用了Axialis AX图标,如下所示: 1) 打开*.ICO文件,单击Ctrl+A选择完整图标图像,单击Ctrl+C(复制到剪贴板) 2) 单击“新建图像格式”,选择16x16,为该*.ICO文件选择合适的颜色 3) 单击Ctrl+V(粘贴),选择“调整图像大小以适应编辑器区域” 4) 单击“保存” 5) 对我的应用程序中MDI表单使用的每个*.ICO文件重复相同的操作 6) 然后打开我的应用程序中的每个MDI表单,单击表单的“图标”属性并选择使用相同*.ICO文件的新版本


正如我现在看到的,它工作得很好。在菜单菜单中,它使用了小图标,因此当MDI窗体最大化时,主菜单的大小不再跳跃。

谢谢Jeremy,我想你可能让我走上了正确的道路:-)谢谢Jeremy,我想你可能让我走上了正确的道路:-)这看起来像是一个性感解决方案的开始,感谢分享:)+1这看起来像是一个性感解决方案的开始,感谢分享:)