5

私のアプリケーションでは、フォーム クライアント領域の一部が Aero フレームに描画されるように、DWM API のメソッド DwmExtendFrameIntoClientArea を使用して Aero グラス タイトル バーの高さを拡張することで調整するフォームがあります。この効果を実現するために、多くのオンライン記事が示唆しているように、ガラス フレームの「上」にあるクライアント領域の部分に黒い長方形を描画して、透明に見えるようにします。これは Windows Vista/Windows 7 ではうまく機能しましたが、VS 2010 をダウンロードし、アプリケーションをビルドするためのターゲット フレームワークとして .NET Framework 4.0 を使用したため、このアプローチは機能しなくなりました。問題は、黒い四角形が表示されることです。つまり、Aero ガラスに描画すると、黒い色が透明と見なされなくなります。何が問題なのか、それをどのように克服できるのか、誰かが考えていますか?

4

2 に答える 2

1

この質問に対する答えは、http: //msdn.microsoft.com/en-us/magazine/cc163435.aspx#S6で C# のソリューションと共に説明されています。

リンクされたページからの抜粋 (リンクがダウンしている場合):

ウィンドウの背景にガラスを使用するのは少し難しいです。自然に不透明なもの (GDI 関数など) をレンダリングすると、アイテムがガラス上にレンダリングされますが、予期しない結果になることもあります。実際にレンダリングをガラス面にブレンドしたい場合は、GDI+、Windows Presentation Foundation、Windows XP Theme API など、色のアルファ チャネルを利用する機能を利用する必要があります。

特定の問題の 1 つは、GDI アイテムを黒でレンダリングするとビット パターン 0x00000000 が使用されることです。これは、アルファ チャネルを使用している場合は完全に透明な黒になります。これは、黒の GDI ブラシまたはペンで描画すると、黒ではなく透明な色になることを意味します。これがもたらす最大の問題は、ガラス領域にあるテキスト ラベルのコントロールでデフォルトのテキスト カラーを使用しようとする場合です。通常、デフォルトのテキストの色は黒であるため、DWM はこれを透明であると見なし、テキストがグラスに正しく書き込まれません。

そして、WinForms のソリューション:

幸いなことに、この問題を回避する方法はいくつかあります。オーナー描画コントロールの使用はその 1 つです。アルファチャンネルを持つビットマップへのレンダリングは別です。さいわい、コントロール上のテキストを取得する最も簡単な方法は、.NET Framework 2.0 で GDI+ を使用することです。これは、コントロールに UseCompatibleTextRendering プロパティを設定することで簡単に実現できます。既定では、このプロパティは false に設定されているため、以前のバージョンの .NET Framework 用に記述されたコントロールは同じものをレンダリングします。ただし、true に設定すると、テキストは正しく表示されます。Application.SetUseCompatibleTextRenderingDefault メソッドを使用して、プロパティをグローバルに設定できます。Visual Studio® 2005 を使用している場合、テンプレート コードには、フォームが作成される前にメイン ルーチンで互換性のあるテキスト レンダリングを false に設定するための呼び出しが含まれます。

static void Main()
{
    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue

    Application.Run(new GlassForm());
}
于 2011-01-24T23:11:46.393 に答える
0

これが役に立たない場合は申し訳ありませんが、単にカラー パレットを変更した可能性はありますか? 多くの場合、これらの Windows 相互運用タイプの API は、デフォルト パレットに加えて PBGRA パレットを使用できるようであり、フレームワーク バージョンによってデフォルト カラー パレットが変更されている可能性があります。これが真であるかどうかをテストするのに十分なほど単純でなければなりません。

(特定の状況下で透明と黒が混同されるハードウェアカーソルのレンダリングで同様の問題を発見しました。最終的には、BGRの1つがAよりも大きくなるようにPBGRAを誤って計算していたことが判明しました。背景は透過色を意味します。)

DWM API メソッドの使用には、他にも複雑な問題があります。完全にはわかりませんが、メモリから、新しいマージンの設定には複雑なことがあります-正しく思い出せば、それらはすべて同じ符号 (+ / -) またはアーティファクト (突然現れる黒い背景など) を持つ必要がありました。時々登場。

于 2011-01-11T09:41:48.920 に答える