【发布时间】:2012-11-18 17:26:41
【问题描述】:
朋友们,我正在尝试实现 Windows API 的封装,我想从父窗口捕获子窗口事件,所以我做了一个简单的事件处理程序。我使用函数指针来存储回调函数。我用静态函数做到了。请参阅下面的代码。
class Widget;
typedef void (*EventProc)(MSG* EventArgs);
class Widget
{
public:
/// Constructors destructor and methods for Registering and Creating Windows
static LRESULT CALLBACK MainProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
MSG struct_msg;
struct_msg.hWnd=hWnd;
struct_msg.message=msg;
struct_msg.wParam=wParam;
struct_msg.lParam=lParam;
Widget* wid=(Widget*)GetWidgetPointerFromHWND(hWnd);
switch(msg)
{
case WM_CREATE:
if(Created!=NULL)
(*(wid->Created))(&struct_msg);break;
case WM_DESTROY:
if(Destroyed!=NULL)
(*(wid->Destroyed))(&struct_msg);break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}
EventProc Created;
EventProc Destroyed;
};
class CustomControl: public Widget
{
/// Constructor destructor and other methods
};
class Window: public Widget
{
public:
static void ChildCreated(Widget* Sender,Widget* Self,MSG* EventArgs)
{
MessageBox(0,0,0,0);
}
Window()
{
control1=new CustomControl(100,100,200,200); //left,top,width,height
this->AddChild(control1);
control1->Created = ChildCreated;
}
private:
CustomControl control1;
};
这可行,但由于静态函数没有 this 指针,我无法访问 类窗口 中的变量和成员函数。 我想制作一个成员函数作为回调函数(事件处理程序)。 我希望你明白我要解决的问题。请帮帮我。
【问题讨论】:
-
如果你从
GetWidgetPointerFromHWND得到Widget的实例,你可以访问它的变量和成员。那么有什么问题呢? -
@Lol4t0 我想将 Window 的非静态成员函数作为事件处理程序。
-
但是只要你得到
wid,你就可以像wid->handleEvent(msg, wParam, lParam)一样调用它的函数。对吗? -
看看另一个 GUI 框架的实现,看看他们是如何做到的。
-
好的,我的疑问是如何将非静态成员函数作为事件处理程序并通过其指针从基类调用它。不仅仅是这个例子@
标签: c++ winapi function pointers casting