Как я могу добиться того же эффекта альфа-рамки, который можно увидеть в новом главном окне Visual Studio 2012, используя формы Windows? Кажется, что его окно светится.
Как Visual Studio 2012 рисует границу окна?
Ответы (4)
Насколько я знаю, вы можете сделать это с помощью WPF, используя сочетание этот хром и пользовательскую границу WPF . Не уверен, что на WinForms вы можете, учитывая ограниченные возможности стиля (по сравнению с WPF). В любом случае они используют WPF.
Поэтому я не уверен, что это лучший метод, но если вы используете Spy++ (32-разрядную версию) и посмотрите в окна, вы увидите, что под главным окном Visual Studio вы можете увидеть 4 объекта «VisualStudioGlowWindow».
Я подключил сообщения в Spy++, и, как вы могли себе представить, 4 окна представляют собой 4 светящиеся рамки вокруг формы. Дальнейшая проверка показывает, что эти 4 «светящихся окна» реализуют стиль расширенного окна WS_EX_LAYERED, поэтому само свечение не выполняется в WPF (насколько я могу судить)!
Надеюсь, это прояснит некоторые вещи.
Если вы не хотите рисовать всю форму самостоятельно, вы не можете. Поскольку Visual Studio 2010 и Visual Studio 2012 написаны поверх WPF и используют Windows, а не Forms.
Visual Studio 2012 рисует границу окна с помощью собственных функций Win32. Это не связано с WPF или WindowsForms — вы можете делать это с обоими.
Свечение отображается в прозрачном окне поверх главного окна. Главное окно вызывает DWM API, чтобы установить область стекла на 0. Таким образом, вы можете рисовать поверх исходной границы и системных кнопок. Это правильный способ сделать это.
Вы можете посмотреть код оболочки WPF (http://archive.msdn.microsoft.com/WPFShell), чтобы увидеть, как выполняются вызовы DWM для удаления стекла. Тот факт, что он написан для совместимости с WPF, не имеет значения, потому что все, что вам нужно, это дескриптор (IntPtr) окна.
Если у вас есть кодовая база WindowsForms, не переходите на WPF. WPF не был улучшен в последнем выпуске платформы .NET, и нет планов по улучшению или новым функциям, поскольку его команда была интегрирована в команду Windows 8.