Как в процедуру WinApi окна передать пользовательские данные

Подскажите пожалуйста, как возможно в callback созданного окна передать свои данные ? Вроде бы пишут, что при создании окна можно передать указатель на структуру CREATESTRUCT, в которую соответственно можно посетить указатель на мои данные, но что то не работает.

Я делаю так:

void My_Create_Window()
{
//Стандартный код создания WinApi окна...

    std::string my_string = "Hello";
    CREATESTRUCT CREATESTRUCT_;
    CREATESTRUCT_.lpCreateParams = &my_string[0];


    my_global_hWnd = CreateWindowW(
        My_WNDCLASSEX.lpszClassName,
        L"Мой Title",
        WS_OVERLAPPEDWINDOW | WS_BORDER,
        -7,
        0,
        800,
        600,
        NULL,
        NULL,
        My_WNDCLASSEX.hInstance,
        &CREATESTRUCT_ 
    );
}

Теоретически в соответствии с описанием функции CreateWindowW, последний ее параметр - это значение, которое должно быть передано окну через структуру CREATESTRUCT (член lpCreateParams), на которую указывает параметр lParam сообщения WM_CREATE .

Вроде бы я так и сделал. Теперь я ставлю точку остановки внутри WM_PAINT и проверяю wParam и lParam, но они нулевые - то есть никакого указателя на структуру CREATESTRUCT не передалось.

static LRESULT CALLBACK WndProc(HWND   hWnd, UINT   message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;

    if (message == WM_PAINT)
    {
            //.... тут ставлю точку остановки
    }
}

Подскажите пожалуйста, где я ошибся ?


Ответы (1 шт):

Автор решения: Alex F

lParam будет равен CREATESTRUCT::lpCreateParams только при обработке сообщения WM_CREATE. Здесь вы можете запомнить его, например, в локальной переменной, а затем использовать ее в WM_PAINT.

Будьте осторожны здесь:

std::string my_string = "Hello";
CREATESTRUCT CREATESTRUCT_;
CREATESTRUCT_.lpCreateParams = &my_string[0];

my_global_hWnd = CreateWindowW(
    ...
    &CREATESTRUCT_);   // Содержит указатель на локальную переменную my_string!

&my_string_ действителен только в WM_CREATE.

→ Ссылка