Problem mit ALT-Shortcuts und CMFCToolbarbuttons



  • Hallo,

    ich habe einen modalen CDialog und dort oben eine Leiste mit Buttons folgendermaßen
    eingefügt (wndToolBar ist Member vom Dialog und vom Typ CMyDynamicToolBar : public CToolBar):

    m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, 100));       
    m_wndToolBar.InsertButton(CMFCToolBarButton(ID_BTN, -1, "Ei&nfügen"));
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar.ShowWindow(SW_SHOW);
    // damit Klicks auf Buttons hier beim Dialog ankommen:
    m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
    m_wndToolBar.AdjustLayout();
    

    Leider kommt aber die Tastenkombination ALT-n nicht beim
    Dialog an, sondern scheinbar beim MainFrame der Anwendung.
    Das Programm, an dem ich arbeite ist riesig, habe die Stelle nicht
    gefunden, wo die Nachricht ankommt.

    Weiß jemand, warum das nicht geht? Bei CButton hat es funktioniert.
    Muss ich vielleicht noch irgendeine Property von Toolbar oder Button setzen?

    Bin für jede Hilfe dankbar, habe nach mehrstündiger Suche nichts Passendes
    im Internet gefunden. :-((

    Viele Grüße
    Christian


  • Mod

    Benutze SetOwner. Ansonsten gibt es einige Spezialitäten bzgl. ToolBars in Dialogen.

    Lies mal auf www.codeproject.com nach...
    Toolbars waren für Dialoge ursprünglich nie konzipiert.

    Oder hier:
    https://jeffpar.github.io/kbarchive/kb/141/Q141751/

    Das ist ein "leider gelöschter" KB Artikel aus der MSDN.



  • Hallo,

    mit SetOwner habe ich es nicht hinbekommen.

    Ich rufe ja SetToolBarBtnText auf, dabei enthalten die Strings ein &, z.B. "Ein&fügen".
    Bei CButton war ist es ja dann so, dass automatisch der Shortcut funktioniert.
    Im Beispiel also ALT-F. Außerdem wird der entsprechende Button unterstrichen dargestellt.
    Bei SetToolBarBtnText funktioniert das nicht. Geht das überhaupt? Wenn ja, wie?

    Ich habe dann noch etwas anderes gefunden und in PretranslateMessage von meinem Dialog folgendes
    eingebaut:
    bReturn = ::IsDialogMessage(filterDialogHandle, pMsg);
    if (bReturn)
    {
    TranslateMessage(pMsg);
    DispatchMessage(pMsg);
    }
    Erst dachte ich, prima, funktioniert, dann habe ich aber festgestellt, dass dies z.B. nicht für
    Umlaute der Fall ist. Kann man das irgendwie konfigurieren?

    Als Workaround habe ich jetzt einfach unsichtbare CButtons gemacht:
    m_Buttons[i].Create(strTipText.GetBuffer(), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    CRect(0, 0, 0, 0), this, ID_BTN + i);

    Das funktioniert, allerdings auch, wenn man nur den Buchstaben drückt. Ich möchte aber nur bei
    "ALT-Buchstabe" und nicht bei "Buchstabe" eine Reaktion auf den Button. Was mache ich falsch?

    Vielen Dank für jede Hilfe, bin echt verzweifelt, denn es gibt viele Kunden, die rein tastaturbasiertes
    Arbeiten gewohnt sind und die sich jetzt beschweren.

    Viele Grüße
    Christian



  • @Airbaer sagte in Problem mit ALT-Shortcuts und CMFCToolbarbuttons:

    bin echt verzweifelt

    Ja, das wäre ich auch, wenn ich jetzt fast ein Jahr probiert hätte, den Vorschlag umzusetzen ...



  • Na das ist ja ein toller Kommentar, vielen Dank, sehr hilfreich. Natürlich habe ich das nicht getan, sondern andere Sachen gemacht. Das Thema ist jetzt wieder hoch gekommen.


  • Mod

    Verwende eine Accelerator Tabelle mit TranslateAccelerator in PreTRanslateMessage


Log in to reply