任何人都知道如何从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);
...
};
答案 0 :(得分:0)
这在很多层面都是错误的。你真的想要实现什么?仅从这段代码中,就没有足够的信息。
首先,使用C和托管C ++的混合声明此方法。它要么
protected virtual void WndProc(Message m) // Managed C++
如你所见,不是静态方法,LRESULT,HWND等,或
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
如您所见,没有System名称空间。
第二,你的定义在哪里定义?我怀疑您应该使用托管C ++覆盖您的方法,请参阅MSDN。
答案 1 :(得分:0)
你没有那么远,因为你已经处理了WM_CREATE消息。
诀窍是在创建时传递一个对象指针,并在WM_CREATE或WM_NCCREATE消息中使用SetWindowLongPtr
将其存储在Window本身中。您可以使用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;
}