问题描述
|
在MDI应用程序中,当MDI子窗体最大化时,该窗体的图标用作上下文菜单图标,显示在父窗体的MenuStrip的左侧。当我将MDI应用程序中使用的表单的图标设置为大于16x16(我使用的是32x32)时,该图标将按比例缩放,菜单也将调整为适合自己的尺寸。请注意,如果ICO文件还包含图标的16x16版本,则可以正常工作。
下面创建了一个显示该行为的基本应用程序:
创建一个新的解决方案和WinForms项目
将Form1 \的IsMdiContainer更改为
true
向Form1添加ѭ1
创建一个新表格,将其命名为“2ѭ”
将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,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;
,我遇到了同样的问题。但似乎只需将其他16x16图标图像添加到* .ICO文件即可成功解决。
我使用了以下Axialis AX-Icons:
1)打开* .ICO文件,单击Ctrl + A选择完整的图标图像,单击Ctrl + C(复制到剪贴板)
2)单击“新图像格式”,选择16x16,为此* .ICO文件选择合适的颜色
3)点击Ctrl + V(粘贴),选择“调整图片大小以适合编辑器区域”
4)点击“保存”
5)对我的应用程序中MDI表单使用的每个* .ICO文件重复相同的操作
6)然后在我的应用程序中打开每个MDI表单,单击“ Icon \”属性作为表单,然后选择使用同一* .ICO文件的新版本
正如我现在所看到的,它工作正常。在菜单菜单中,它使用小图标,因此当MDI形式最大化时,主菜单的大小不再跳跃。