Vista Aero Glass를 지원하도록 .Net WinForms 앱을 얻는 데 도움
-
01-07-2019 - |
문제
.Net 양식에 대한 유리 지원을 얻는 데는 몇 가지 요령이 있습니다.
이 방법의 원본 소스는 다음과 같습니다. http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx
원래:
//reference Desktop Windows Manager (DWM API)
[DllImport( "dwmapi.dll" )]
static extern void DwmIsCompositionEnabled( ref bool pfEnabled );
[DllImport( "dwmapi.dll" )]
static extern int DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset );
//then on form load
//check for Vista
if ( Environment.OSVersion.Version.Major >= 6 )
{
//check for support
bool isGlassSupported = false;
DwmIsCompositionEnabled( ref isGlassSupported );
if ( isGlassSupported )
DwmExtendFrameIntoClientArea( this.Handle, ref margins );
...
//finally on print draw a black box over the alpha-ed area
//Before SP1 you could also use a black form background
마지막 단계가 문제입니다. 해당 영역 위에 그려진 하위 컨트롤도 검정색을 알파 투명 마스크로 처리하는 것 같습니다.
예를 들어 수업 영역 위의 탭 표시줄에는 투명한 텍스트가 있습니다.
이 문제를 해결할 방법이 있나요?
이 작업을 수행하는 더 쉬운 방법이 있나요?
제가 작업 중인 응용 프로그램은 XP와 Vista 모두에서 작동해야 합니다. 이 응용 프로그램의 성능이 정상적으로 저하되어야 합니다.여기에 모범 사례가 있습니까?
해결책
실제로 이보다 더 쉬운 방법은 없습니다.이러한 API는 아직 .NET Framework에서 공개되지 않으므로 이를 수행하는 유일한 방법은 일종의 상호 운용성(또는 WPF)을 이용하는 것입니다.
두 Windows 버전 모두에서 작업하는 경우 런타임은 실제로 함수를 호출할 때까지 DLL에 대한 진입점을 찾지 않으므로 가지고 있는 코드는 문제가 없습니다.
다른 팁
대니스머프가 말했습니다..NET 프레임워크를 통해 이러한 API에 대한 직접적인 "관리" 액세스 권한이 없습니다(저는 몇 주 전에 직접 시도했습니다).
나는 결국 불쾌한 일을 하고 말았습니다.GDI+를 사용하여 나만의 UI를 만들었습니다.(버튼, 둥근 라벨 등).Windows 버전에 관계없이 동일하게 보입니다.Win.Forms는 정말 보기 흉하지만 XP < 측면에서는 그게 전부입니다.
유리로 만들려는 영역의 TransparencyKey를 설정하는 것을 잊어버린 것 같습니다.기사에서,
Windows Forms Application에서는 Transparency Key 속성을 응용 프로그램의 다른 곳에서 사용하지 않는 색상으로 설정하면됩니다 (나중에 명백한 이유로 Gainsboro를 사용합니다).그런 다음 양식의 여백에 도킹 된 하나 이상의 패널을 만들고 패널의 배경색을 투명성 키로 설정할 수 있습니다.이제 dwmextendframeintoclientarea를 호출하면 유리가 적절한 투명성 키를 설정 한 곳마다 여백 내에 표시됩니다.
관리되지 않는 호출은 신경 쓰지 않습니다. 블랙 박스를 사용하여 알파 동작을 모방하는 해킹이며, 그 결과 일부 구성 요소의 검정색 요소에 미치는 영향이 문제입니다.
사용할 수 있는 저렴한 방법은 양식 위에 투명한 패널 컨트롤을 배치하고 그 위에 컨트롤을 배치하는 것입니다. 그러면 검정색이 검정색이 됩니다.