今天在模块中为了避免重复代码,以及方便以后的扩展,我决定用函数指针来管理所有相同功能的函数,由于底层函数的接口写死了,也只能这么做了。大概如下:
class CWndEquipDye : public CEquipRebuilderWnd
{
typedef void(*SLIDEFUN)(DWORD);
friend CEquipRebMgrListener;
public:
CWndEquipDye ();
virtual ~CWndEquipDye() {};
public:
virtual BOOL Create(IResObject *pResCript);
virtual void OnPaint(ICanvas* pCanvas);
public:
//////////////////////////////////////////////////////////////////////////
// @Description: 更新当前角色形象
// @Input Para: NONE
// @Return Value: NONE
//////////////////////////////////////////////////////////////////////////
void RefreshPreview();
//////////////////////////////////////////////////////////////////////////
// @Description: 拖动颜色滚动条的回调函数,红 绿 蓝
// @Input Para: dwParam->控件传递的值
// @Return Value:NONE
//////////////////////////////////////////////////////////////////////////
void OnSlideRedPosChange(DWORD dwParam);
void OnSlideGreenPosChange(DWORD dwParam);
void OnSlideBluePosChange(DWORD dwParam);
private:
enum SLIDE
{
SLIDE_RED = 0,
SLIDE_GREEN,
SLIDE_BLUE,
SLIDE_MAX,
};
DWORD m_dwSlideValue[SLIDE_MAX];
XSlideBar* m_pSlideBar[SLIDE_MAX];
SLIDEFUN m_arrSlideFun[SLIDE_MAX];
};
m_arrSlideFun[0] = OnSlideRedPosChange;
m_arrSlideFun[1] = OnSlideRedPosChange;
m_arrSlideFun[2] = OnSlideRedPosChange;
但是在这儿初始化的时候,报错:error C2440: '=' : cannot convert from 'void (__thiscall CWndEquipDye::*)(unsigned long)' to 'void (__cdecl *)(unsigned long)'
There is no context in which this conversion is possible
立马google,后来才明白是:在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数。
原文如下:http://www.vckbase.com/document/viewdoc/?id=1818
这篇文章写的很好,还初步介绍了Delegate委托的概念,又让自己长了不少见识。还有一篇比较好的文章,先贴在这里http://www.codeproject.com/KB/cpp/FastDelegate.aspx有时间好好看看。
BTW:晚上准备和MM一起去欢乐谷玩,特留贴纪念这个不是光棍的光棍节!