Почему стрелка выпадающего меню не нарисована для CMFCMenuButton?
Я столкнулся с этой проблемой при попытке добавить CMFCMenuButton в существующее приложение MFC. Он работал правильно, и даже изменил размер кнопки, чтобы разместить выпадающую стрелку. Но он не рисовал стрелку выпадающего меню, и когда я завис над кнопкой, я увидел следующий результат отладки:
> Can't load bitmap: 42b8.GetLastError() = 716
> CMenuImages. Can't load menu images 3f01
Оказывается, что даже в Visual Studio 2010 RTM при создании совершенно нового приложения на основе MFC Dialog CMFCMenuButton не рисует стрелку и показывает те же ошибки. Сначала я предполагал, что у меня что-то не было установлено или зарегистрировано правильно. Однако пример NewControls из MFC Feature Pack отлично показал стрелку раскрывающегося списка.
Чего не хватает?
2 ответа
Я написал этот вопрос по той причине, что не смог найти ответы через Google. Самое близкое, что я нашел, когда исследовал это, было парой хаков, которые не казались реальным решением. Пролистав пример NewControls, я наконец нашел виновника.
Внизу файла.rc по умолчанию для проекта находится следующий код:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\YOUR_PROJECT_NAME.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#endif
Файл.rc примера NewControls выглядит следующим образом:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\NewControls.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#ifndef _AFXDLL
#include "afxribbon.rc" // Ribbon and control bars
#endif
#endif
Добавление afxribbon.rc включает ресурсы растрового изображения, необходимые для элементов управления в обновлении пакета компонентов MFC. Теперь вы не можете просто добавить отсутствующий код в конец файла.rc. Если вы сделаете это, каждый раз, когда вы редактируете файл ресурса с помощью визуального дизайнера, ваш добавленный код будет удален. Решение проблемы - добавить это в конец файла YOUR_PROJECT_NAME.rc2:
#ifndef _AFXDLL
#include "afxribbon.rc" // Ribbon and control bars
#endif
Убедитесь, что у вас есть пустая строка внизу файла, иначе компилятор ресурса будет жаловаться. Я не уверен, какую настройку нужно изменить, чтобы визуальный дизайнер автоматически включил afxribbon.rc, как это делается в примере проекта NewControls. Но добавление его в.rc2, похоже, решает проблему.
Я решаю эту проблему для себя таким образом: я добавляю предложение в CMyApp::InitInstance:
BOOL CMyApp::InitInstance()
{
CWinAppEx::InitInstance();
InitCommonControls();
//This!
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
//...
return TRUE;
}