缩放父窗体的MenuStrip中最大化MDI子项使用的图标

时间:2011-05-25 04:25:51

标签: c# .net winforms icons mdi

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

以下内容创建一个显示行为的基本应用程序:

  • 创建一个新的解决方案和WinForms项目
  • 将Form1的IsMdiContainer更改为true
  • 向Form1
  • 添加MenuStrip
  • 创建一个新表单,将其命名为MdiChildForm
  • MdiChildForm的图标设置为32x32 ICO文件,here's one I prepared earlier
  • Form1中添加一个菜单项,双击它以创建Click事件处理程序并添加以下内容:

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

请注意,再次单击该菜单项时,图标将更改为默认值,this question中对此进行了描述,此处不存在问题。

我很确定这将被描述为“按设计”,但它仍然令人讨厌。有没有办法强制缩小上下文菜单图标,重新调整源图标的大小?我也可能会这样做,但我正在使用某种代码内容。

3 个答案:

答案 0 :(得分:3)

受@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();

答案 1 :(得分:1)

我尝试了各种各样的东西,除了表格标准32x32图标之外,我使用它的唯一方法是使用16x16大小的图标:

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;

答案 2 :(得分:0)

我遇到了同样的问题。但似乎只需在* .ICO文件中添加额外的16x16图标图像即可成功解决。

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

正如我现在所见,它运作良好。在菜单菜单中,它使用小图标,因此当MDI表单最大化时,主菜单的大小不再跳转。