WinApi: SetWindowLongPtr возвращает ошибку, но работает
Подскажите пожалуйста, почему так происходит:
Мне необходимо применить для моего Родительского окна в ходе срабатывания определенного условия в WindProc - стиль WS_VSCROLL, ну чтобы в какой то момент у окна появилась вертикальная полоса прокрутки.
Собственно, я вызываю функцию:
SetLastError(1); //MSDN рекомендует установить код перед вызовом SetWindowLongPtr
LONG_PTR My_LONG_PTR = SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_VSCROLL);
cout << GetLastError() << endl;//Код ошибки 87 - неверный параметр
Как видно при таком вызове - возникает ошибка 87 - неверный параметр.
Только стоит изменить GWL_EXSTYLE на GWL_STYLE, в этом случае, код ошибки установленный SetLastError() - не меняется, то есть SetWindowLongPtr - завершается успешно. Все хорошо и классно.
Но меня интересует другое, а именно, почему в первом случае, функция завершилась с ошибкой 87, но все равно применила указанный WS_VSCROLL стиль, то есть у окна появилась вертикальная полоса прокрутки.
Ответы (3 шт):
Возможно, в расширенном стиле должны присутствовать определённые компоненты. Чтобы не разрушить стиль совсем, а только добавить нужное, делают так:
SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_VSCROLL | GetWindowLongPtr(hWnd, GWL_EXSTYLE));
Как минимум, нужно внимательно сделать точно то, что написано в MSDN, а именно:
by calling SetLastError with 0
Чистить старое состояние ошибки значением 0 (вы задаете 1)
Function failure will be indicated by a return value of zero and a GetLastError result that is nonzero.
Ошибка возникает, когда функция вернула 0 и GetLastError вернула не 0, у сравнения возвращенного функцией значения с 0 нет
SetWindowLong[Ptr] не просто сеттер в некоторую область памяти, даже скорее "просто не сеттер", хоть и константы похоже на смещения. Она обрабатывает входящие значения, особенно GWL_EXSTYLE / GWL_STYLE
Окну приходят WM_STYLECHANGING/WM_STYLECHANGED. В первом из них окно может исправить и установленные стили, и возвращаемое старое значение.