当前位置: 代码迷 >> VC/MFC >> 回调函数 访问 类的私有成员(类中声了然友元)
  详细解决方案

回调函数 访问 类的私有成员(类中声了然友元)

热度:458   发布时间:2016-05-02 03:42:45.0
回调函数 访问 类的私有成员(类中声明了友元)
上次问了,类中静态回调函数的问题,可出现不能访问私有成员。
所以改用友元,但还是有问题

LRESULT CALLBACK EditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

class EditControl
{
private:
int Edit1;
HWND hEdit;
HINSTANCE hInstance;
WNDPROC OldEditProc;

public:
int hhh;
EditControl();
~EditControl();
void CreateEdit(HWND hwnd, HINSTANCE hInst, int top, int left, int right, int bottom);
friend LRESULT CALLBACK EditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};


EditControl::EditControl()
{
Edit1 = 1;
OldEditProc = NULL;
}
EditControl::~EditControl()
{
}

void EditControl::CreateEdit(HWND hwnd, HINSTANCE hInst, int top, int left, int right, int bottom)
{

hEdit = CreateWindow(L"Edit", NULL, WS_CHILD|WS_VISIBLE|ES_LEFT|ES_MULTILINE, top, left, right, bottom,hwnd, (HMENU)Edit1, hInst, NULL);
OldEditProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)EditProc);
}

LRESULT CALLBACK EditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
break;
}
return CallWindowProc(EditControl::OldEditProc, hwnd, uMsg, wParam, lParam);// 这里错误
}


错误提示:error C2597: 对非静态成员“EditControl::OldEditProc”的非法引用
------解决思路----------------------
最简单的方法, 把EditProc设置为EditControl的静态方法, 不嫌蛋疼还可以用匿名函数.
------解决思路----------------------
EditControl::OldEditProc,
这个函数必须是静态函数,但一旦使用了静态函数,你又得传对象指针
------解决思路----------------------
友元函数不可靠
------解决思路----------------------
这和 friend 没有任何关系。
实例变量和类变量是不一样的。
实例变量需要 this 指针的。
------解决思路----------------------
引用:
EditControl::OldEditProc,
这个函数必须是静态函数,但一旦使用了静态函数,你又得传对象指针

说的对,必须是静态的,封装起来,就必须是类的静态成员函数,跟该类对象没有关系,所以必须要在该处理窗口处理过程的WM_CREATE消息处理中把当前对象指针和当前窗口句柄绑定起来,单前提是必须在Create窗口的时候把this指针射进去,自己去搜索::CreateWindow的最后一个参数含义和WM_CREATE消息的LPARAM
  相关解决方案