从WndProc调用非静态成员
Call non-static member from WndProc
有人知道如何从WndProc调用非静态成员吗?
这是我的WndProc原型:
LRESULT CALLBACK System::Windows::Forms::Control::WndProc(HWND hWnd,
UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
this->OnCreate(new EventArgs(hWnd, message, wParam, lParam));
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
定义:
class LIBMANAGED_API Control
{
protected:
HWND hWnd;
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
...
};
这在很多层面上都是错误的。你真正想要实现什么?仅仅从这段代码中,没有足够的信息。
首先,您使用C和托管C++的混合物来声明此方法。它要么
protected virtual void WndProc(Message m) // Managed C++
如您所见,NOT静态方法、LRESULT、HWND等,或
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
正如您所看到的,没有System命名空间。
第二,你的类在哪里定义?我怀疑您应该使用托管C++覆盖您的方法,请参阅MSDN。
您还没有处理完WM_CREATE消息。
诀窍是在创建时传递对象指针,并将其与WM_CREATE或WM_NCCREATE消息中的SetWindowLongPtr
一起存储在窗口中。您可以使用GetWindowLongPtr
提取它,并从窗口过程中访问您的对象。
窗口创建(假设MyWnd myWnd
是表示窗口的C++对象):
HWND hWnd = CreateWindow( m_pszClassName, "Name", WS_VISIBLE | WS_OVERLAPPED,
x, y, w, h, NULL, NULL, hInst, &myWnd);
窗口程序:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
MyWnd *myWnd;
myWnd = (MyWnd *) GetWindowLongPtr(hWnd, GWLP_USERDATA); /* to use it outside WM_CREATE */
switch (message)
{
case WM_CREATE:
CREATESTRUCT * pcs = (CREATESTRUCT*)lParam;
MyWnd* myWnd= (MyWnd*) pcs->lpCreateParams;
SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR) myWnd);
myWnd->OnCreate(new EventArgs(hWnd, message, wParam, lParam));
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
相关文章:
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 非静态成员失败的线程调用函数
- 处理类内的回调时,必须调用对非静态成员函数的引用
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 简化静态成员函数调用的方法
- C++类静态成员函数调用错误
- 通过指针调用静态成员函数
- 错误:必须调用对非静态成员函数的引用 (2)
- 为什么 C++ 中的函数重载解析会考虑静态调用的非静态成员函数
- C :在没有对象实例的情况下调用非静态成员函数
- 必须调用对非静态成员函数的引用(向量)
- 必须调用函子 ->对非静态成员函数的引用
- Visual 2015 C++编译器:使用对象调用静态成员不会导致编译器错误
- 在不存在的对象上调用静态成员函数
- 如何从静态成员函数调用非静态成员函数
- StringComp:必须调用对非静态成员函数的引用
- 带有类 - 非静态成员调用的 typedef 函数声明
- 需要从静态成员调用函数(由静态指针引用)