在项目中遇到要修改ribbon panel的标题为别的语言,可是在MSDN上查找发现CMFCRibbonPanel这个类下没有修改caption的函数,而且ribbon panel没有自带ID,困扰许久,看到一篇帖子说用修改自带变量的方法可行。具体看了一下,因为CMFCRibbonPanel有个GetName()函数,则得到的字符串一定在某个变量存储,寻找源头发现标题caption在m_strName这个变量中保存,遂定义一个CMFCRibbonPanel的子类,来通过对子类中m_strName的修改达到改变Panel标题的目的。代码如下,先声明一个子类
class MyRibbonPanel:public CMFCRibbonPanel
{
public:
MyRibbonPanel();
~MyRibbonPanel();
// MyRibbonPanel(LPCTSTR lpszName = NULL, HICON hIcon = NULL ) : CMFCRibbonPanel(lpszName, hIcon) {};
void SetPanelName(CString name);
};
再对这个子类的setpanelname函数进行定义,这里的定义一定不要放在头文件里,因为我刚刚开始编程没有经验,经常把定义放在头文件,这样头文件被多个cpp调用时就会出现多次定义等问题。
void MyRibbonPanel::SetPanelName(CString name)
{
m_strName=name;
}
然后就可以调用了
CMFCRibbonPanel* pPanel;
MyRibbonPanel* pMyPanel = (MyRibbonPanel*)pPanel;//这里把父类的对象强制转换成子类对象,没有报错,说明可以转换
pMyPanel->SetPanelName(“it can work ”);
还有一个发现如下
static TCHAR gRibbonString[RIBBON_SIZE];
CString SName=gRibbonString;//CString和CHar大概可以相互转换?
这里做一下总结:
1.函数或者变量的定义不要放在头文件中
2.基类的对象可以强制转化为子类的对象(搜索后发现父类向子类转换需要加上这个dynamic_cast,不过我没加也并没有报错)
3.通过这个实例发现,通过子类改变基类中定义的变量时,变化的就是基类中本身的而不是子类继承来的(可能加了Virture情况就不一样)