2013-07-27 1 views
1

normal static controlsunken static control`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() стиль моего статического контроля не изменяется.

Что я делаю неправильно или что мне не хватает?

ответ

0

Несмотря на то, что SS_SUNKEN влияет на кадр статического контроля, это не один из «стилей фреймов», на которые ссылается примечание.

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

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

+0

+1. 'SS_SUNKEN' консультируется только при создании. Изменение его динамически не влияет. Если вы хотите динамически изменять эффект, тогда не используйте 'SS_SUNKEN'.Вместо этого используйте 'WS_EX_STATICEDGE'. –

0

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