Почему стрелка выпадающего меню не нарисована для CMFCMenuButton? - PullRequest
4 голосов
/ 30 июня 2010

Я столкнулся с этой проблемой при попытке добавить CMFCMenuButton в существующее приложение MFC.Он работал правильно, и даже изменил размер кнопки, чтобы разместить выпадающую стрелку.Но он не нарисовал стрелку выпадающего списка, и когда я наведен на кнопку, я увидел следующий отладочный вывод:

> Can't load bitmap: 42b8.GetLastError() = 716
> CMenuImages. Can't load menu images 3f01

Оказывается, что даже в Visual Studio 2010 RTM при создании брендаВ новом приложении, основанном на диалоге MFC, CMFCMenuButton не рисует стрелку и показывает те же ошибки.Сначала я предполагал, что у меня что-то не было установлено или зарегистрировано правильно.Однако пример NewControls из MFC Feature Pack отлично показал стрелку раскрывающегося списка.

Чего не хватает?

Ответы [ 2 ]

5 голосов
/ 30 июня 2010

Причина, по которой я разместил этот вопрос, заключается в том, что я не смог найти ответы через 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, похоже, решает проблему.


Обновление

Имейте в виду, что вы можете использовать IDE для изменения файла RC:

  • Щелкните правой кнопкой мыши файл RC и выберите Ресурс включает в себя ... :

Right-Click RC File

  • Вставьте новый код в директивы времени компиляции область:

Code Pasted into Window

1 голос
/ 20 июля 2011

Я решаю эту проблему для себя таким образом: я добавляю предложение к CMyApp::InitInstance:

BOOL CMyApp::InitInstance()
{
    CWinAppEx::InitInstance();

    InitCommonControls();

    //This! 
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

    //...
    return TRUE;
}
...