我有这个抽象代码: 我想在CreateWindowEx()中使用lParam(最后一个参数)来保存指向在main-SaveArr开头声明的类的指针。那么,我想在函数WndProc中使用它。 在开始我做了一个全局数组,然后我可以在任何地方使用它,但它不是那么“聪明”的c ++关注,所以我试图升级它一点。
class Samples
{
int arr[ITERATIONS+1];
int index;
...
}
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
Samples * SaveArr;
...
hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
ClsName,
WindowCaption,
WS_OVERLAPPEDWINDOW,
INITIAL_WIN_LOCAT_X,
INITIAL_WIN_LOCAT_Y,
WIN_WIDTH,
WIN_HIGHT,
NULL,
NULL,
hInstance,
NULL); //here i want to pass SaveArr, so that i can use it in the WndProc(...) function
...
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
... //here i would like to use lParam as the class pointer, meaning using the
SaveArr declared in the main function.
}
}
答案 0 :(得分:2)
最佳方式是
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
Samples *savearr = (Samples*)GetWindowLong(hWnd,GWL_USERDATA)
switch(Msg)
{
case WM_CREATE:
SetWindowLong(hWnd, GWL_USERDATA, (LONG)lParam);
break;
}
}
下次调用WndProc时,该值将在savearr中,并且可以使用。
答案 1 :(得分:1)
来自reference:
lpParam [in,optional]
Type: LPVOID Pointer to a value to be passed to the window through the
CREATESTRUCT结构(lpCreateParams成员)指向的 WM_CREATE消息的lParam参数。此消息将发送给 在返回之前通过此函数创建窗口。
If an application calls CreateWindow to create a MDI client
窗口,lpParam应该指向CLIENTCREATESTRUCT结构。如果 MDI客户端窗口调用CreateWindow来创建MDI子窗口, lpParam应指向MDICREATESTRUCT结构。 lpParam可能是 如果不需要其他数据,则为NULL。
您希望lParam始终传递给WndProc,但它只与WM_CREATE一起传递。
注意,即使这样,它也不会直接传递,而是通过一个结构,即WM_CREATE的实际lParam。
答案 2 :(得分:1)
答案 3 :(得分:0)
你唯一有机会阅读lParam是在WM_CREATE期间。如果您想在以后继续使用该值,则必须将其存储在某处。也许作为WndProc的静态或以其他方式将其分配给将成为范围的其他东西。
答案 4 :(得分:0)
为什么所有坚持使用最后一个,lpParam值设置为X,然后在WM_CREATE上捕获它(通过所有间接结构的东西,不能少!)然后设置GWL_USERDATA?!
为什么不切入追逐并执行此操作: HWND H = CreateWindow(.....) SetWindowLong函数(H,GWL_USERDATA,X) 换句话说,只需在窗口创建语句之后直接将X放在那里。
在我的测试中,它可以正常工作,只要您针对某些已知句柄列表测试窗口句柄,就可以防止程序拾取某些错误消息,并防止不当使用其他用户数据。