Как в процедуру 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 шт):
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.