Я создаю статический элемент управления с кодом ниже:
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()
стиль моего статического контроля не меняется.
Что я делаю не так или чего мне не хватает?
Даже если SS_SUNKEN
действительно влияет на фрейм статического элемента управления, это не один из «стилей фрейма», на который ссылается примечание.
Это примечание относится к общим стилям рамки, которые влияют на все окна, например WS_BORDER
или же WS_EX_CLIENTEDGE
— стили, которые требуют пересчета не-клиентской области окна при изменении.
Многие системные элементы управления кешируют свои стили при создании и не обновляют кеш, даже если вы изменили стили с помощью SetWindowLong
, Я думаю, это то, что здесь происходит — если вы не создадите статический элемент управления с SS_SUNKEN
Вы не можете добавить это позже. Лучшим вариантом будет просто уничтожить и воссоздать элемент управления в новом стиле.
SS_SUNKEN
эффективно устанавливает WS_EX_STATICEDGE
в расширенных стилях (GWL_EXSTYLE
) окно длинное, поэтому можно обновить GWL_EXSTYLE
и измените положение, как вы сейчас делаете.