.Net WinForms アプリが Vista Aero Glass をサポートするように支援する
-
01-07-2019 - |
質問
.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 の両方で動作する必要があり、正常に機能を低下させる必要があります。ここでのベストプラクティスはありますか?
解決
これを行うのにこれ以上簡単な方法はありません。これらの API は .NET Framework によって (まだ) 公開されていないため、これを行う唯一の方法は、ある種の相互運用 (または WPF) を使用することです。
両方の Windows バージョンで作業する場合、実際に関数が呼び出されるまでランタイムは DLL へのエントリ ポイントを検索しないため、作成したコードは問題ないはずです。
他のヒント
ダニー・スマーフが言ってました。.NET フレームワークを介してこれらの API に直接「管理された」アクセスを行うことはできません (私は数週間前に自分でこれを試しました)。
結局ひどいことをしてしまいました。GDI+を使用して独自のUIを作成しました。(ボタン、丸いラベルなど)。Windowsのバージョンに関係なく見た目は同じです。Win.Forms は本当に醜いですが、XP < 側で得られるのはこれだけです。
ガラスにしたい部分のTransparencyKeyの設定を忘れているようです。記事より、
Windowsフォームアプリケーションでは、アプリケーションの他の場所では使用しない色に透明性のあるプロパティを設定する必要があります(後で明らかになる理由でGainsboroを使用します)。次に、フォームのマージンにドッキングされた1つ以上のパネルを作成し、パネルの背景色を透明性キーに設定できます。これで、DWMEXTENDFRAMEINTOCLIENTAREAを呼び出すと、適切な透明性キーを設定しても、ガラスがマージン内に表示されます。
アンマネージ呼び出しは気にしません。これは、アルファの動作を模倣するためにブラック ボックスを使用するハックであり、その上にあるいくつかのコンポーネントの黒い要素にそれが及ぼす影響が問題です。
簡単に使用できるハックは、フォーム上に透明なパネル コントロールを配置し、その上にコントロールを配置することです。黒は黒になります。