4

.NetフォームのGlassサポートを取得するための秘訣がいくつかあります。

このメソッドの元のソースはここにあると思います: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の両方で動作する必要があります-正常に機能を低下させる必要があります。ここにベストプラクティスはありますか?

4

5 に答える 5

3

これを行う簡単な方法は本当にありません。これらのAPIは(まだ).NET Frameworkによって公開されていないため、それを行う唯一の方法は、ある種の相互運用機能(またはWPF)を使用することです。

両方のWindowsバージョンでの作業に関しては、ランタイムは実際に関数を呼び出すまでDLLへのエントリポイントを検索しないため、使用しているコードは問題ないはずです。

于 2008-09-17T18:30:30.857 に答える
1

DannySmurfはそれを言った。.NET Frameworkを介してこれらのAPIに直接「管理」アクセスすることはできません(数週間前に自分で試しました)。

私はやっかいなことをしてしまいました。GDI+を使用して独自のUIを作成しました。(ボタン、丸みを帯びたラベルなど)。Windowsのバージョンに関係なく同じように見えます。Win.Formsは本当に醜いですが、XP<側で得たのはそれだけです。

于 2008-09-17T18:33:23.580 に答える
1

ガラスにしたい領域のTransparencyKeyを設定するのを忘れていたと思います。記事より、

Windows フォーム アプリケーションでは、TransparencyKey プロパティを、アプリケーションの他の場所では使用しない色に設定するだけで済みます (後で明らかになる理由から、Gainsboro を使用しています)。次に、フォームの余白にドッキングされる 1 つ以上のパネルを作成し、パネルの背景色を透過キーに設定できます。DwmExtendFrameIntoClientArea を呼び出すと、適切な透明度キーを設定した場所にガラスが表示されます。

于 2008-09-17T18:49:01.500 に答える
0

使用できる安価なハックは、フォーム上に透明な Panel コントロールを配置し、その上にコントロールを配置することです。黒は黒になります。

于 2009-07-09T16:32:21.810 に答える
0

管理されていない呼び出しは気にしません。これは、ブラック ボックスを使用してアルファの動作を模倣するハックであり、その上にあるコンポーネントの黒い要素に与える影響が問題です。

于 2008-09-17T18:36:09.080 に答える