문제

.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를 호출하면 유리가 적절한 투명성 키를 설정 한 곳마다 여백 내에 표시됩니다.

관리되지 않는 호출은 신경 쓰지 않습니다. 블랙 박스를 사용하여 알파 동작을 모방하는 해킹이며, 그 결과 일부 구성 요소의 검정색 요소에 미치는 영향이 문제입니다.

사용할 수 있는 저렴한 방법은 양식 위에 투명한 패널 컨트롤을 배치하고 그 위에 컨트롤을 배치하는 것입니다. 그러면 검정색이 검정색이 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top