Ленточный интерфейс MFC выдает ошибку подтверждения при локализации приложения

У меня есть приложение на основе MFC, которое использует интерфейс ленты Office 2007. MFC статически связан.

Я пытаюсь добавить японскую локализацию. У меня есть локализованные ресурсы в отдельной DLL. Я загружаю библиотеку ресурсов в начале InitInstance:

VERIFY(hRes = LoadLibrary(_T("JapaneseLang.dll")));
if(hRes)
AfxSetResourceHandle(hRes);

Это вызывает ошибку подтверждения CMFCVisualManagerOffice2007::OnUpdateSystemColors

#if !defined _AFXDLL
TRACE(_T("\r\nImportant: to enable the Office 2007 look in static link,\r\n"));
TRACE(_T("include afxribbon.rc from the RC file in your project.\r\n\r\n"));
ASSERT(FALSE);
#endif

Но у меня есть afxribbon.rc включены в файлы rc как DLL, так и EXE.


Я также нашел Подобный вопрос задан на tech-archive.net и возможное решение там обозначено

Теперь я нахожу место ошибки. это shoule будет ошибкой нового MFC
версия.

В CMFCVisualManagerOffice2007, когда стиль меняется,
Функция SetStyle CMFCVisualManagerOffice2007 автоматический вызов FreeLibrary
освободить dll, поэтому ошибка произошла.

Теперь я извлек класс из CMFCVisualManagerOffice2007 и добавил
статическая функция для установки переменной-члена m_bAutoFreeRes, выполнив
это приложение может работать правильно; смотрите ниже.

Класс CMFCVisualExtManagerOffice2007: public
CMFCVisualManagerOffice2007 {
DECLARE_DYNCREATE (CMFCVisualExtManagerOffice2007) public:
CMFCVisualExtManagerOffice2007 (); виртуальный
~ CMFCVisualExtManagerOffice2007 ();

статическая пустота SetAutoFreeRes (BOOL bAutoFree = FALSE) {m_bAutoFreeRes =
bAutoFree; }};


Но у меня проблемы с пониманием того, что именно вызывает проблему, и как это решение работает. Также я не уверен, что это правильное решение. Кто-нибудь знает, что именно вызывает эту проблему, и как работает решение?

0

Решение

Я понял, как работает решение. Мне нужно установить m_bAutoFreeRes ложь после каждого звонка CMFCVisualManagerOffice2007::SetStyle,

class CMFCVisualExtManagerOffice2007 : public CMFCVisualManagerOffice2007
{
DECLARE_DYNCREATE(CMFCVisualExtManagerOffice2007)
public:
CMFCVisualExtManagerOffice2007();
virtual ~CMFCVisualExtManagerOffice2007();

static void SetAutoFreeRes(BOOL bAutoFree = FALSE)
{
m_bAutoFreeRes = bAutoFree;
}
};

а потом при переключении между темами

    switch (m_nAppLook)
{
case ID_VIEW_APPLOOK_OFF_2007_BLUE:
CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_LunaBlue);
CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
break;

case ID_VIEW_APPLOOK_OFF_2007_BLACK:
CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
break;

case ID_VIEW_APPLOOK_OFF_2007_SILVER:
CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_Silver);
CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
break;

case ID_VIEW_APPLOOK_OFF_2007_AQUA:
CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_Aqua);
CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
break;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]