8

新しい MFC 機能 (Feature Pack) でメニューが表示される場所は 3 つあります。

  • メニュー バー (CMFCMenuBar)
  • ポップアップ メニュー (CMFCPopupMenu)
  • CMFCButton の「ドロップダウン メニュー」バージョン

それらすべてのメニューにアイコン(ハイカラーで透明度のあるもの)を入れたいです。メニューバー項目の前にアイコンをカスタム描画するために使用できる CFrameWndEx::OnDrawMenuImage() を見つけました。2008 年にアイコン描画を実装する必要があるため、あまり便利ではありませんが、機能します。他の人については、まだ解決策を見つけていません。メニューのアイコンを自動的に設定する方法はありますか?

4

5 に答える 5

4

これが私がそれを機能させる方法です:

初め

、他の人が言ったように、メインツールバーの横に非表示のツールバーを作成します(私はAppWizardの名前に基づいた通常の名前を使用しています):

MainFrm.h:
class CMainFrame
{
    //...    
    CMFCToolBar m_wndToolBar;
    CMFCToolBar m_wndInvisibleToolBar;
    //...
};

MainFrm.cpp:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    //...

    // Normal, visible toolbar
    if(m_wndToolBar.Create(this,
        TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
    {
        VERIFY( m_wndToolBar.LoadToolBar(
            theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME) );

        // Only the docking makes the toolbar visible
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        DockPane(&m_wndToolBar);
    }

    // Invisible toolbar; simply calling Create(this) seems to be enough
    if(m_wndInvisibleToolBar.Create(this))
    {
        // Just load, no docking and stuff
        VERIFY( m_wndInvisibleToolBar.LoadToolBar(IDR_OTHERTOOLBAR) );
    }
}

2番目:画像とツールバーのリソース

IDR_MAINFRAMEIDR_MAINFRAME_256AppWizardによって生成されました。前者は醜い16色バージョンで、後者は面白いハイカラーバージョンです。
その名前にもかかわらず、私が正しく覚えていれば、AppWizardで生成された画像でさえ24ビットの色深度を持っています。すばらしい点:32ビット画像に置き換えるだけでうまくいきます。

目に見えないツールバーがありますIDR_OTHERTOOLBAR:私はリソースエディタでツールバーを作成しました。いくつかのダミーアイコンとコマンドID。次に、VSはビットマップを生成し、それをハイカラーバージョンに置き換えました。終わり!

ノート

リソースエディタでツールバーを開かないでください。何かを実行する前に、ツールバーを4ビットに変換する必要がある場合があります。そして、それを許可しても(Visual Studioの背後で、結果を再びハイカラー画像に置き換えるためです)、ツールバーを編集できないことがわかりました(場合によっては?)。非常に奇妙な。
その場合は、.rcファイルを直接編集することをお勧めします。

于 2009-07-31T16:36:14.847 に答える
2

この関数を使用してみてください:

CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
   UINT uiBmpResID=0,
   UINT uiColdResID=0,
   UINT uiMenuResID=0,
   UINT uiDisabledResID=0,
   UINT uiMenuDisabledResID=0);

例えば:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

私にとってはとてもうまくいきました。

于 2009-08-06T16:13:42.730 に答える
2

これらのクラスは、Microsoft が BCG を買収したときに MFC に含まれていた BCGToolbar クラスと同じであると私は信じています (ただし、間違っている可能性があります)。その場合は、ツールバーを作成し、アイコンを作成するメニュー項目と同じ ID をツールバー ボタンで使用すると、アイコンが自動的に表示されます。もちろん、実際にツールバーを表示する必要はありません。

于 2008-09-16T14:06:46.757 に答える
2

BCGToolbar では、リソースにツールバーを作成して読み込むだけで十分ですが (ウィンドウは表示しません)、ツールバー ボタンには、リンク先のメニュー項目と同じ ID が必要です。

于 2008-09-18T14:24:04.140 に答える
0

人を驚かせる可能性があることの 1 つは、カスタマイズ可能な (つまり、ロックされていない) ツールバーの場合、最初に作成するツールバーでは、フレームワークが分割され、プログラム内のすべてのアイコンのある種のパレット ビットマップに変わることです。最初のツールバーとは異なる色深度のビットマップ (または png) を持つツールバー (または別のツールバー) を後で追加しようとすると、それらを同じパレットに追加できないため、失敗したように見えます。

于 2009-04-23T23:09:25.910 に答える