cell组件适配BCG风格--适配器模式和查表法

分析

  1. 目标:最小的改动现有代码,使得cell组件适配BCG颜色样式
  2. 启发点:

一款软件中有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);
}

拓展

  1. 跨平台。 __super不跨平台修改成基类
  2. 样式类定义的颜色多一种,就必须添加一个类,是不是很麻烦? 怎么修改呢?
    可以去掉所有样式类,改成从配置文件读取固定样式,这样只需要增减配置文件中的主题样式,修改配置文件可达到修改主题样式的效果。
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页