Несколько лет назад мы разработали компонент ActiveX под названием CaptionX (Домашняя страница CaptionX). Это позволяет разработчикам размещать настраиваемые интерактивные графические кнопки в строке заголовка окна. Все работает нормально в любой Windows, кроме Vista и Windows 7, когда Aero Glass включен - строка заголовка с нашими настраиваемыми значками отображается так, как если бы мы использовали тему Windows Basic без эффекта прозрачности для границ окна.
Люди хотели бы использовать CaptionX в последних версиях ОС, но мы не можем заставить его работать. Все поиски в Интернете говорят нам, что нам нужно включить Aero Glass, когда мы используем пользовательский рисунок в заголовке окна с помощью вызова API DwmSetWindowAttribute с атрибутом DWMWA_NCRENDERING_POLICY, но нам не удалось заставить его работать.
Наш код, который рисует неклиентскую поверхность окна, выглядит так (извините, это старый VB6 :):
Friend Function WindowProc(ByVal lPrevWndProc As Long, ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case iMsg
Case WM_NCPAINT
DoNCPaint lPrevWndProc, wParam
WindowProc = 0
Exit Function
Case WM_...
' Other message handlers
End Select
WindowProc = CallWindowProc(lPrevWndProc, hwnd, iMsg, wParam, lParam)
End Function
Мы добавили следующий звонок
DwmSetWindowAttribute m_hwnd, DWMWA_NCRENDERING_POLICY, DWMNCRP_ENABLED, 4
во многие места в нашем коде, но это не имеет никакого эффекта. Мы можем отключить эффект Aero Glass, если он используется по умолчанию в окне с помощью DwmSetWindowAttribute, но не может его включить.
Что мы делаем не так? Нужно ли нам добавлять в наш код дополнительные вызовы API, и если да, то где?