发送lparam作为指向类的指针,并在WndProc()中使用它

时间:2011-09-12 07:55:49

标签: c++ winapi wndproc

我有这个抽象代码: 我想在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.

}

}

5 个答案:

答案 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放在那里。

在我的测试中,它可以正常工作,只要您针对某些已知句柄列表测试窗口句柄,就可以防止程序拾取某些错误消息,并防止不当使用其他用户数据。