Frage

Es gibt drei Orte, an denen Menüs in der neuen MFC-Funktionalität zeigen (Feature Pack):

  • Im Menüleisten (CMFCMenuBar)
  • In Popup-Menüs (CMFCPopupMenu)
  • In der 'Drop-Down-Menü' -Version von CMFCButton

Ich möchte sie alle in den Menüs Symbole (High-Color und mit transparancy) setzen. Ich habe CFrameWndEx gefunden :: OnDrawMenuImage (), die ich um benutzerdefinierte Zeichnen Sie die Symbole vor der Menüleiste Elemente verwenden können. Es ist nicht sehr bequem, Symbol 2008 Zeichnung implementieren zu müssen, aber es funktioniert. Für die anderen habe ich eine Lösung noch nicht gefunden. Gibt es einen Automagic Weg Symbole für Menüs einstellen?

War es hilfreich?

Lösung

Das ist, wie ich es an die Arbeit:

Erste

, wie die andere gesagt, eine unsichtbare Symbolleiste erstellen neben Ihrer Hauptsymbolleiste (Ich bin die üblichen Namen auf Basis von AppWizard Namen):

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) );
    }
}

Zweitens: Die Bilder und Symbolleiste Ressourcen

IDR_MAINFRAME und IDR_MAINFRAME_256 wurden von AppWizard generiert. Erstere ist die hässliche 16 Farbversion und letztere ist die interessante hohe Farbversion.
Trotz seines Namens, wenn ich mich richtig erinnere, auch die Anwendungs-Assistenten generierte Bild hat 24bit Farbtiefe. Die kühle Sache: Just ersetzen Sie es mit einem 32-Bit-Bild und das wird auch funktionieren.

Es ist die unsichtbare Symbolleiste IDR_OTHERTOOLBAR: Ich habe eine Symbolleiste mit dem Ressourcen-Editor erstellt. Nur ein paar Dummy-Symbole und der Befehls-IDs. VS erzeugt dann eine Bitmap, die ich mit meiner hohen Farbversion ersetzt. Fertig!

Hinweis

Öffnen Sie nicht die Symbolleisten mit dem Ressource-Editor: Es kann es konvertieren müssen 4bit, bevor es etwas damit zu tun. Und auch , wenn Sie lassen Sie es tun (weil hinter Visual Studio zurück, wou're geht das Ergebnis mit der hohen Farbbild ersetzen wieder, ha!), Ich fand, dass es (manchmal?) einfach kann die Symbolleiste nicht bearbeiten. Sehr seltsam.
In diesem Fall empfehle ich die RC-Datei direkt zu bearbeiten.

Andere Tipps

Ich glaube, (aber ich kann falsch sein), dass diese Klassen die gleichen wie die BCGToolbar Klassen sind, die in MFC enthalten waren, wenn Microsoft BCG gekauft. Wenn ja, können Sie eine Symbolleiste mit und verwenden die gleiche ID auf einer Symbolleiste auf die Schaltfläche wie in den Menüpunkten erstellen Sie für die Symbole zu erstellen, und sie sollten automatisch angezeigt. Natürlich können Sie nicht wirklich haben, um die Symbolleisten angezeigt werden.

In BCGToolbar, es ist genug, um eine Symbolleiste in den Ressourcen zu erstellen und laden Sie es (aber nicht das Fenster angezeigt werden), aber die Symbolleiste auf der Schaltfläche muß die gleiche ID wie der Menüpunkt haben Sie es zu verknüpfen.

Versuchen Sie, diese Funktion:

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

So z.B .:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

funktionierte sehr gut für mich.

Eine Sache, die eine Person überrascht fangen kann, ist, dass für einen anpassbaren (dh nicht gesperrt) Symbolleiste, die erste Symbolleiste, die Sie machen, der Rahmen aufteilt und verwandelt sich in eine Art Palette Bitmap aller Symbole im Programm. Wenn Sie versuchen, später mehr Symbolleiste hinzufügen (oder verschiedene Symbolleiste), die Bitmaps (oder PNGs) mit einer anderen Farbtiefe hat als die ersten, scheinen sie nicht, weil sie sie nicht zu der gleichen Palette hinzufügen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top