C# 缩放父窗体中最大化MDI子级使用的图标';梅努斯特普酒店
在MDI应用程序中,当MDI子窗体最大化时,该窗体的图标将用作上下文菜单图标,显示在父窗体菜单的左侧。当我将MDI应用程序中使用的表单的图标设置为大于16x16(我使用的是32x32)的值时,图标将不缩放,菜单的大小也会随之调整。请注意,如果ICO文件还包含16x16版本的图标,则其工作正常 下面创建了一个显示行为的基本应用程序: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
- 创建新的解决方案和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这看起来像是一个性感解决方案的开始,感谢分享:)