今天在模塊中為了避免重復代碼,以及方便以后的擴展,我決定用函數指針來管理所有相同功能的函數,由于底層函數的接口寫死了,也只能這么做了。大概如下:
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一起去歡樂谷玩,特留貼紀念這個不是光棍的光棍節!