分析
- 目标:最小的改动现有代码,使得cell组件适配BCG颜色样式
- 启发点:
一款软件中有100个对话框,是怎么做到每个对话框都用同一个图标的?每个对话框添加一个icon资源?
cell组件设置颜色的接口需要指定了固定的RGB值索引,存量代码调用了这些接口; 怎么做到这些RGB值索引根据系统风格动态变换?
继承回答了第一个问题。如:派生类CMyBaseDialog继承CDialog并添加图片资源,所有继承CMyBaseDialog的子类可使用同一张图片。
多态回答了第二个问题。为cell组件用到的每一种颜色根据BCG风格,定义映射的RGB值;
采用适配器模式,定义颜色样式类适配不同BCG风格,构建一张key - value的表存储cell已经使用的颜色与BCG风格映射
样式类
.h
/*
* 样式基类
*/
class CStyle
{
public:
virtual ~CStyle(void) {};
};
/*
* 颜色样式类
*/
class CColorStyle :public CStyle
{
public:
virtual ~CColorStyle(void){};
virtual long Color(long para){ return para;};
protected:
void AddColor(COLORREF key, COLORREF value) { m_mapColor.insert(std::make_pair(key,value));};
long GetColor(long para){
std::map<COLORREF,COLORREF>::iterator it = m_mapColor.find(para);
return it != m_mapColor.end() ? it->second : para;
};
private:
std::map<COLORREF,COLORREF> m_mapColor;
};
/*
* BCG黑色风格
*/
class BsBCGBlackColorStyle : public CColorStyle
{
public:
BsBCGBlackColorStyle();
virtual ~BsBCGBlackColorStyle(){};
virtual long Color(long para){ return GetColor(para);};
};
/*
* BCG白色风格
*/
class BsBCGWhiteColorStyle : public CColorStyle
{
public:
BsBCGWhiteColorStyle();
virtual ~BsBCGWhiteColorStyle(){};
virtual long Color(long para){ return GetColor(para);};
};
.cpp
CBCGBlackColorStyle::CBCGBlackColorStyle()
{
AddColor(RGB(0,0,0),RGB(255,255,255));
AddColor(RGB(255, 0, 0),RGB(0, 255, 255));
}
CBCGWhiteColorStyle::CBCGWhiteColorStyle()
{
AddColor(RGB(0,0,0),RGB(0,0,0));
AddColor(RGB(255, 0, 0),RGB(255, 0, 0));
}
cell组件类
.h
class CMyCell:public CUfSoftCell2000
{
public:
CMyCell ();
~CMyCell ();
/*
* 查询cell的颜色索引,重载自CUfSoftCell2000的FindColorIndex函数
* @param color RGB值
* @param add 当add=1时如果颜色数组中没有该颜色就将该颜色加入到颜色数组中
*/
long FindColorIndex(long color, long add);
private:
void SetSystemStyle(int nStyle);
private:
//颜色样式指针,利用多态特性切换颜色
CColorStyle* m_pColorStyle;
};
.cpp
CMyCell::CMyCell ():m_pColorStyle(NULL)
{
int nSysStyle = CBCGPVisualManager2016::GetStyle();
SetSystemStyle(nSysStyle);
}
CMyCell::~CMyCell ()
{
if (m_pColorStyle != NULL)
{
delete m_pColorStyle;
m_pColorStyle = NULL;
}
}
long CMyCell::FindColorIndex(long color, long add)
{
return __super::FindColorIndex(m_pColorStyle->Color(color),add);
}
拓展
- 跨平台。 __super不跨平台修改成基类
- 样式类定义的颜色多一种,就必须添加一个类,是不是很麻烦? 怎么修改呢?
可以去掉所有样式类,改成从配置文件读取固定样式,这样只需要增减配置文件中的主题样式,修改配置文件可达到修改主题样式的效果。