2014-09-04 5 views
1

How do I rename the MFC ribbon panel? У меня есть связанная с этим проблема. Оригинальные подписи к ленте в ресурсе находятся в языке A. Я переводил все на языке B, включая имена панелей (используя метод, аналогичный предложенному в упомянутой теме). Но когда я сжимаю окно, чтобы некоторые из (или всех) панелей рухнули, их имена возвращаются к языку A. Когда я расширяю окно, имена панелей снова переводятся на язык B. Все еще не нашли решения. У кого-то появилась идея? :/EDIT: мы используем класс транслятора, который работает с флагами, поэтому в соответствии с флагом языка он преобразует строки, которые затем применяются к категориям, кнопкам и т. Д. Я создал свой собственный класс панели, который происходит из CMFCRibbonPanel. Я добавил этот метод:MFC Ribbon Panel name issue

void CRibbonPanel::setName(CString name) 
{ 
    m_strName = name; 
} 

Затем я делаю петлю, чтобы найти и изменить имя каждой панели в:

(CRibbonPanel*)thePanel->setName(theNewName); 

Он отлично работает, но когда панели свернуты, их подписи вернуться на язык по умолчанию ,

+0

Какой tranlsation вы используете ? Спутниковые DLL-файлы? – xMRi

+0

Можете ли вы опубликовать код, который вы используете, чтобы переименовать панель? – thomiel

+0

Нет, мы не используем спутниковые DLL, мы используем класс транслятора, который работает с флагами, поэтому в соответствии с флагом языка он преобразует строки, которые затем применяются к категориям, кнопкам и т. Д. Я создал свой собственный класс панели, который происходит от CMFCRibbonPanel. Я добавил этот метод: 'недействительные CRibbonPanel :: SetName (имя CString)' ' {' ​​' m_strName = имя,' ' }' Он отлично работает, но когда панели свернуты, их подписи вернуться к значениям по умолчанию язык. – Stoyanov

ответ

2

Название срубленной панели хранится в «панели кнопок по умолчанию». Расширить класс аксессора так:

class CRibbonPanel : public CMFCRibbonPanel 
{ 
public: 
    void SetName(CString& name) 
    { m_strName = name; }; 

    CMFCRibbonDefaultPanelButton & GetDefBtn() 
    { return m_btnDefault; } 
}; 

Затем используйте так:

void ChangeText(CMFCRibbonPanel * pPanel, CString & newText) 
{ 
    auto pMyPanel = (CRibbonPanel *)(pPanel); 
    auto & defBtn = pMyPanel->GetDefBtn(); 
    defBtn.SetText(newText); 
} 

Интерфейс ленты MFC не является идеальной абстракции. К счастью, Microsoft распространяет исходный код для реализации ленты. На моей машине, код панели находится в:

C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ atlmfc \ SRC \ тк \ afxribbonpanel.cpp

+0

Спасибо! Я больше не работаю, но я только что отправил им ссылку. Кажется, они уже исправили проблему так или иначе :) – Stoyanov