Aero Glassウィンドウ効果の追加

おそらく、Windows Vistaで作業したすべての人(たとえば、Aeroを目に見えない熱心なXPshnikがいる:))、彼らはいわゆるAero Glass効果を見ました-AeroモードのWindows Vistaの顕著な効果の1つです。 デフォルトでは、この効果は最大化されていないウィンドウのタイトルにまで広がり、アクティブウィンドウのタイトルの後ろにある他のウィンドウのコンテンツがぼやけているように見えます。

画像

この効果は、ウィンドウのクライアント領域に拡張できます。これについては後で説明します。 例として、上記のスクリーンショットに表示されているWindows Vista Explorerウィンドウ。 コンダクターの効果は、コントロールが配置されているクライアントエリアに広がります。 当然、これはWindows Vistaでのみ機能します。 したがって、この効果を適用する前に、Windowsのバージョンを確認する必要があります(以下ではC#を使用したコード)。
if (Environment.OSVersion.Version.Major >= 6)
{
// Vista features are supported.
}


また、エフェクトの使用には制限があることも知っておく必要があります。エフェクトゾーンは常にウィンドウの境界から始まります。つまり、ウィンドウの中央に「ガラス」ピースを作成することはできません。 ウィンドウ全体にエフェクトを適用する場合、非透明コントロールを使用してこれを回避できます。

したがって、効果を得るには、DwmApi.dllライブラリにあるWin API DwmExtendFrameIntoClientArea()を使用する必要があります。
[DllImport("DwmApi.dll")]
public static extern int DwmExtendFrameIntoClientArea(
IntPtr hwnd,
ref Margins pMarInset);


Margins構造は、ウィンドウのクライアント領域の奥深くにエフェクトゾーンを拡張するピクセル数を決定します
次に、Margins構造体を宣言します。
[StructLayout(LayoutKind.Sequential)]
public struct Margins
{
public int cxLeftWidth;
public int cxRightWidth;
public int cyTopHeight;
public int cyBottomHeight;
}


メソッドを実際に呼び出すことができます。この場合、エフェクトゾーンをクライアント領域に50ピクセル分拡張します。
private void Form1_Load(object sender, EventArgs e)
{
margins = new Margins();
margins.cxLeftWidth = 0;
margins.cxRightWidth = 0;
margins.cyTopHeight = 50;
margins.cyBottomHeight = 0;

int retValue = DwmExtendFrameIntoClientArea(this.Handle, ref margins);

if (retValue < 0)
throw new NotSupportedException();
}


ウィンドウが表示される前にエフェクトを適用するか、ウィンドウを再作成する必要があります。
this.RecreateHandle();


しかし、それだけではありません。 ここでコードを実行すると、「ガラス」の代わりに黒いバーが表示されます。 これは、GDIがアルファチャネルを認識していないため、エフェクト領域で黒のブラシを使用すると問題が解決するためです。
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Black, 0, 0, this.ClientSize.Width, margins.cyTopHeight);
}


実行すると、大切なウィンドウが表示されます。
画像

原理は明確です。 ウィンドウエリア全体にエフェクトを広げたり、マウスをエフェクトゾーンにドラッグする機能を追加したりするなどの残りの部分は、テクニックの問題です。

Source: https://habr.com/ru/post/J59899/


All Articles