【问题标题】:Scaling the icon used by a maximised MDI child in the parent form's MenuStrip缩放父窗体的 MenuStrip 中最大化 MDI 子级使用的图标
【发布时间】:2011-05-25 04:25:51
【问题描述】:

在 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 中进行了描述,而不是此处的问题。

我很确定这会被描述为“设计使然”,但这仍然很烦人。有没有办法强制上下文菜单图标按比例缩小,有点像调整源图标的大小?我可能也会这样做,但我追求的是某种代码内包罗万象。

【问题讨论】:

    标签: c# .net winforms icons mdi


    【解决方案1】:

    受@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 这看起来像是一个性感解决方案的开始,感谢分享:)
    【解决方案2】:

    我尝试了各种方法,唯一的方法是使用 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;
    

    【讨论】:

    • 谢谢杰里米,我想你可能让我走上了正确的道路:-)
    【解决方案3】:

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

    使用过的 Axialis AX-Icons 我做了以下操作: 1) 打开 *.ICO 文件,点击 Ctrl+A 选择完整的图标图像,点击 Ctrl+C(复制到剪贴板) 2) 点击“New image format”,选择 16x16,为这个 *.ICO 文件选择合适的颜色 3)点击Ctrl+V(粘贴),选择“Resize image to fit the editor area” 4) 点击“保存” 5) 对我的应用程序中 MDI 表单使用的每个 *.ICO 文件重复相同的操作 6)然后在我的应用程序中打开每个 MDI 表单,单击表单的“图标”属性并选择使用相同 *.ICO 文件的新版本

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

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多