Почему стрелка выпадающего меню не нарисована для 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;
}
Другие вопросы по тегам