缩放父窗体中最大化MDI子项使用的图标';s菜单条
本文关键字:图标 菜单 窗体 最大化 MDI 缩放 | 更新日期: 2023-09-27 17:57:40
在MDI应用程序中,当MDI子窗体最大化时,该窗体的图标将用作上下文菜单图标,显示在父窗体的MenuStrip的左侧。当我将MDI应用程序中使用的窗体的图标设置为大于16x16(我使用的是32x32)时,图标将不缩放,菜单将根据需要调整大小。请注意,如果ICO文件还包含图标的16x16版本,则工作正常。
下面创建了一个显示行为的基本应用程序:
- 创建新的解决方案和WinForms项目
- 将Form1的IsMdiContainer更改为
true
- 将
MenuStrip
添加到Form1 - 创建一个新表单,称之为
MdiChildForm
- 将
MdiChildForm
的图标设置为32x32 ICO文件,这是我之前准备的 -
在
Form1
中添加一个菜单项,双击它以创建Click
事件处理程序,并添加以下内容:var child = new MdiChildForm(); child.MdiParent = this; child.Show(); child.WindowState = FormWindowState.Maximized;
-
构建并运行,单击菜单项
请注意,当您再次单击菜单项时,图标将变为默认图标,这在本问题中有描述,而不是此处的问题。
我敢肯定这会被描述为"设计",但它仍然令人讨厌。有没有办法强制上下文菜单图标缩小,比如调整源图标的大小?我可能也会这么做,但我追求的是某种代码内的包罗万象。
受到@Jeremy Thompson的回答的启发,我找到了一个可能的解决方法。我取一个超大的图标,将其绘制成一个新的16x16位图,从中创建一个新图标,并将其分配回子窗体。在显示窗体之前,需要分配新图标。
这段代码几乎没有经过测试,可能有漏洞,而且我不是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大小的图标,此外还有标准的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;
我也遇到了同样的问题。但似乎通过在*.ICO文件中添加额外的16x16图标图像就成功地解决了这个问题。
使用Axialis AX图标我做了以下操作:1) 打开*.ICO文件,点击Ctrl+A选择完整的图标图像,点击Ctrl+C(复制到剪贴板)2) 点击"新图像格式",选择16x16,为这个*.ICO文件选择合适的颜色3) 单击Ctrl+V(粘贴),选择"调整图像大小以适应编辑器区域"4) 单击"保存"5) 对我的应用程序中MDI表单使用的每个*.ICO文件重复相同操作6) 然后打开我的应用程序中的每个MDI表单,单击该表单的"图标"属性,并选择使用相同*.ICO文件的新版本
正如我现在所看到的,它运行良好。在菜单菜单中,它使用小图标,所以当MDI形式最大化时,主菜单的大小不再跳跃。