2011-05-25 64 views
0

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

下面创建一个基本的应用程序,显示的行为:

  • 创建一个新的解决方案和WinForms项目
  • 变化Form1的的IsMdiContainer到true
  • 添加MenuStrip到Form1
  • 创建一个新的表格称之为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

通过@Jeremy汤普森的回答启发我发现了一个可能解决方法。我将超大图标绘制成新的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(); 
+0

+1这看起来像一个性感解决方案的开始,感谢分享:) – 2011-05-25 23:18:25

1

我尝试过各种东西,我得到它的工作是通过一个16×16大小的图标,除了形式标准的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; 
+0

谢谢杰里米,我想你可能会把我放在正确的道路上:-) – 2011-05-25 07:46:22

0

我面临同样的问题。但看起来它成功地通过简单地将附加的16x16图标图像添加到* .ICO文件中解决。

使用Axialis AX-图标我以下几点: 1)打开* .ico文件,按Ctrl + A全选全图标图像,按Ctrl + C(复制到剪贴板) 2)点击“新图像格式“,选择16x16,为此* .ICO文件选择合适的颜色。 3)点击Ctrl + V(粘贴),选择” * .ICO文件在我的应用程序中由MDI表单使用 6)然后在我的应用程序中打开每个MDI表单,单击表单的“Icon”属性并选择使用相同*的新版本。ICO文件

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

相关问题