2011-05-25 77 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表格被最大化時,主菜單的大小不再跳躍。

相關問題