Допустим, есть окно с несколькими элементами управления (Группа, Надпись, Флажок, Переключатель, Текст, Вкладки, Ссылка*)
При установки стандартной темы в Windows XP окно преобразится
Для придания более естественного вида контролам пишется знаменитый манифест
- Код: Выделить всё
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' />
</dependentAssembly>
</dependency>
</assembly>
После чего окно преобразится (*и появится элемент управления Ссылка)
Появились так называемые "потёки". Для ликвидации такого на одном из элементов управления (Надпись), в исходный код приложения, в оконную функцию был добавлен следующий код
- Код: Выделить всё
case WM_CTLCOLORSTATIC:
{
TCHAR Class[64] = TEXT("");
GetClassName((HWND)lParam, Class, 64);
if((0 == lstrcmp(Class, TEXT("Static"))))
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
}
}
break;
Вот что получилось
И при классической теме
Не будь хака с WM_CTLCOLORSTATIC , окно выглядело б так же как на первом скрине, но с отображаемым элементом управления Ссылка.
Собственно правильный ли путь выбран? Дело в том, что если добавить прокрутку окну или текстовое поле с прокруткой, то при использования последней (прокрутки) будет наблюдаться интересный эффект: смазывания (захлёста предыдущего “кадра” в новый).
P.S.
Оба примера (с case WM_CTLCOLORSTATIC: и без) компилировались с командной строки.
P.S.S.
Несмотря на то, что темы манифеста обсуждались не раз, вопрос не стоит в том, что б придать контролам современный вид, а в том как побороть последствия такого придания.
Вот по некоторым темам (дабы не подымать их) хотел дать пару комментариев
Стиль windows XP
InitCommonControls из "comctl32" не поможет ибо Under Comctl32.dll version 6.0 and later, InitCommonControls does nothing. >>
Re: Современное оформление приложений на VB6 под XP
Другое дело, что использовать промежуточный контейнер решили ещё тогда, когда визуальных стилей XP не существовало в природе. И с появлением визуальных стилей эти контейнеры дали о себе знать, как минимум своей непрозрачностью...
Любопытно, слово "непрозрачностью" использовано в значении технологии, однако для приведённого в этой теме случая подходит полностью по своему прямому назначению.
Там же, не понятно, с каким параметром werbersoft предлагал запускать InitCommonControlsEx из "comctl32.dll".
Со всей ответственностью говорю, что в Visual С++ было достаточно и манифеста. Но в данном примере есть вызов по запросу ICC_LINK_CLASS.