Um das UI optisch ein wenig aufzupeppen, verwende ich in dem Projekt schon seit geraumer Zeit ein erweitertes Menü (abgeleitet von der MFC-Klasse CMenu). Diese Erweiterung zeigt links von den eigentlichen Menütexten auch das korrespondierende Toolbar-Icon an, vorausgesetzt, es existiert zu dem Menüeintrag auch eine Toolbar-Schaltfläche gleicher Funktion. Das funktioniert auch nach wie vor hervorragend, so lange es sich um das Menü handelte, welches sich oben im Hauptfenster (CMainFrame) der Anwendung befindet.
Anders sieht das hingegen bei den Kontext-Menüs aus! Einige der im Hauptmenü bzw. über die Toolbar verfügbaren Kommandos sind nämlich auch kontextbezogen abrufbar (rechte Maustaste). Im Kontext-Menü erscheinen zwar die korrekten Toolbar-Icons, aber es wird kein Text angezeigt!
Nach einigem Debuggen fand ich den Übeltäter: die Methode CMenu::GetMenuString gab bei den Kontextmenüs einen leeren String zurück.
Einen ersten Hinweis fand ich dann in der TortoiseSVN Dev Mailingliste. Dort berichtet ein User über ein vergleichbares Problem:
"(...) One step of our code tries to retrieve the text of the menu item by calling a function called 'CMenu::GetMenuString'. For all TortoiseSVN items but the one for the popup menu, the strings returned by this function are empty. (...)"
Hier ein Zitat aus einer Antwort (Hervorhebung von mir):
"(...) And don't use CMenu::GetMenuString(), since it's undefined what you get there if the menu is ownerdrawn (it's not necessarily an empty string, you could get any garbage there!). (...)"
Na, das ist ja mal interessant! Dieses kleine Detail wird - sofern es denn stimmt - nicht in der MSDN bei CMenu::GetMenuString erwähnt. Nun greift aber nahezu jede Methode einer MFC-Klasse intern auf die Win32 API zu, und so ist es auch in diesem Fall. Bei der GetMenuString API-Funktion findet man nämlich in der MSDN dann folgenden Hinweis:
Note The GetMenuString function has been superseded. Use the GetMenuItemInfo function to retrieve the menu item text.
Gut zu wissen. Ich benutze hier Microsoft Visual-Studio 2005 mit Service-Pack 1, und bei dieser Version greift die MFC (Version 8.0) in ihrer Methode CMenu::GetMenuString nach wie vor auf diese "überholte" API-Funktion zu! Also habe ich folgendes implementiert:
Seitdem werden die Menütexte wieder sicher angezeigt.




