Функция 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 действительно влияет на фрейм статического элемента управления, это не один из «стилей фрейма», на который ссылается примечание.

Это примечание относится к общим стилям рамки, которые влияют на все окна, например WS_BORDER или же WS_EX_CLIENTEDGE — стили, которые требуют пересчета не-клиентской области окна при изменении.

Многие системные элементы управления кешируют свои стили при создании и не обновляют кеш, даже если вы изменили стили с помощью SetWindowLong, Я думаю, это то, что здесь происходит — если вы не создадите статический элемент управления с SS_SUNKENВы не можете добавить это позже. Лучшим вариантом будет просто уничтожить и воссоздать элемент управления в новом стиле.

0

Другие решения

SS_SUNKEN эффективно устанавливает WS_EX_STATICEDGE в расширенных стилях (GWL_EXSTYLE) окно длинное, поэтому можно обновить GWL_EXSTYLE и измените положение, как вы сейчас делаете.

0

По вопросам рекламы [email protected]