`SetWindowLong()` функция не изменяет стиль окна, даже после вызова `SetWindowPos()`
Я создаю статический элемент управления с кодом ниже:
hWnd = CreateWindowExW(0,
L"STATIC",
Content.c_str(),
SS_LEFT | WS_VISIBLE | WS_CHILD /*| SS_SUNKEN*/,
200,
120,
120,
40,
hWndParent,
NULL,
hInstance,
NULL);
Если я включить SS_SUNKEN
в коде создания, созданный статический элемент управления успешно завершен.
Но я пытаюсь изменить стиль управления после его создания.
Я попытался это:
void BaseWindowClass::AddStyle(DWORD NewStyle)
{
// NewStyle = 0x00001000 = SS_SUNKEN
LONG oldstyle, changedstyle;
oldstyle=SetWindowLongW(hWnd, GWL_STYLE, changedstyle=GetWindowLongW(hWnd, GWL_STYLE) | NewStyle);
UpdateWindowStyles();
// oldstyle = 0x50000000
// changedstyle = 0x50001000 (everything looks normal)
}
void BaseWindowClass::UpdateWindowStyles()
{
BOOL success;
success=SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
// success = 0x00000001 (non-zero: SetWindowPos sucseeded)
}
Документация:
SetWindowLong()
SetWindowPos()
Я называю SetWindowPos()
после вызова SetWindowLongW()
, потому что в документации SetWindowLong, он говорит:
Некоторые данные окна кэшируется, поэтому изменения, внесенные вами с помощью SetWindowLong, не будут пока вы не вызовете функцию SetWindowPos. В частности, если вы меняете любой из стилей фрейма, вы должны вызвать SetWindowPos с флагом SWP_FRAMECHANGED для правильного обновления кеша.
И, в документации SetWindowPos, он говорит:
Если вы изменили некоторые данные окна с помощью SetWindowLong, вы должны вызвать SetWindowPos для того, чтобы изменения вступили в силу. Используйте следующую комбинацию для uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
Даже после изменения SetWindowLongW()
и SetWindowPos()
стиль моего статического контроля не изменяется.
Что я делаю неправильно или что мне не хватает?
+1. 'SS_SUNKEN' консультируется только при создании. Изменение его динамически не влияет. Если вы хотите динамически изменять эффект, тогда не используйте 'SS_SUNKEN'.Вместо этого используйте 'WS_EX_STATICEDGE'. –