2011-05-25 24 views
0

MDIアプリケーションでは、MDI子フォームが最大化されると、フォームのアイコンが親フォームの左側に表示されるコンテキストメニューアイコンとして使用されますMenuStrip。 MDIアプリケーションで使用されるフォームのアイコンを16x16よりも大きなものに設定すると(アイコンは32x32を使用しています)、アイコンはスケーリングされずに描画され、メニューはサイズに合わせてサイズが変更されます。 ICOファイルにアイコンの16x16バージョンも含まれている場合は、正常に動作することに注意してください。親フォームのMenuStripで最大化されたMDI子によって使用されるアイコンのスケーリング

以下の挙動を示している基本的なアプリケーションを作成:true

  • から
  • 変更Form1のIsMdiContainerはMenuStrip新しいを作成
  • Form1にを追加する新しいソリューションとWinFormsのプロジェクトを作成します

    • を書式、電話番号MdiChildForm
    • MdiChildFormのアイコンを32x32 ICOファイルのに設定しますForm1
    • Clickイベントハンドラを作成し、以下を追加し、それをダブルクリックして、メニュー項目を追加します。

      var child = new MdiChildForm(); 
      child.MdiParent = this; 
      child.Show(); 
      child.WindowState = FormWindowState.Maximized; 
      
    • ビルドと実行を、メニュー項目をクリックし

    メニュー項目を再度クリックするとアイコンがデフォルトのアイコンに変わりますが、これはthis questionに記載されていますが、ここで問題にはなりません。

    私はこれが「設計」として記述されると確信していますが、それにもかかわらず、迷惑です。コンテキストメニューのアイコンを強制的に縮小し、ソースアイコンのサイズを変更する方法はありますか?おそらくこれもやっていますが、私はコード内で何かをキャッチオールしています。

    答えて

    3

    私は可能性を発見しました回避策。私は特大のアイコンを取って、それを新しい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これはセクシーな解決策の始まりのようです。 –

    1

    私はいろいろなことを試してみましたが、私はそれが働いてしまった唯一の方法は、フォームの標準的な32×32のアイコンに加えて、16×16サイズのアイコンを使用していた:

    @Jeremyトンプソンの答えに触発さ
    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

    ありがとうございます。私はあなたが正しい方向に私を入れているかもしれないと思います: –

    0

    私は同じ問題に直面しました。しかし、* .ICOファイルに16x16のアイコンイメージを追加するだけで、うまく解決されたようです。

    私は次のようでしたAxialis AX-アイコンに使用

    : 1)を開き、* .icoファイル、完全なアイコン画像を選択するには、Ctrl + Aをクリックし、クリップボードにコピーするには、Ctrl + Cを(クリック) 2)「新しい画像フォーマットをクリックしてください"を選択し、16x16を選択し、この* .ICOファイルに適切な色を選択します 3)Ctrl + V(貼り付け)をクリックし、"画像を編集領域に合わせてサイズを変更 "を選択します 4)"保存 "をクリックします 5) *私のアプリケーションでMDIフォームで使用される.ICOファイル 6)アプリケーションのすべてのMDIフォームを開き、フォームの "アイコン"プロパティをクリックし、同じ*の新しいバージョンを使用することを選択します。ICOファイル

    これでわかるように、うまくいきます。メニューメニューでは小さなアイコンを使用するので、MDIフォームが最大化されてもメインメニューのサイズはジャンプしません。

    関連する問題