GlassForm(Microsoft.WindowsAPICodePack.Shell;を使用)でWindowsフォームを使用しています。フォームをGlassFormに変更すると、テキストボックスのテキストが表示されないという私の問題
3 に答える
フォームにパネルを配置し、塗りつぶすドックスタイルを設定し、パネルのBackColorを色Xに設定してから、フォームのTransparencyKeyを同じ色Xに設定します。
はい、そのように動作します。エアロ グラス効果を適用すると、黒で描画されたものはすべて透明にレンダリングされます。これには、テキスト ボックス コントロール内のテキストが含まれます。この一般的なテーマは、ここで他の多くの質問の対象となっています。よく書かれていれば、多くの賛成票を集めますが、答えはほとんどありません。
ここにはあまり良い解決策はありません。私が遭遇したそれらはすべて、「醜い」と「ハック」の両方に分類されます。ラベル コントロールのようなものを使用している場合、オーナー描画は合理的なアプローチですが、独自のテキスト ボックスを描画しようとすることはお勧めしません。誰かがここでそれをしようとしました; 私が言ったように、結果は醜くハックです。私自身の使用には満足できませんでしたが、あなたの基準がどれほど高いかによっては、うまくいくかもしれません.
もちろん、オーナー描画の目標は、GDI (すべての組み込みコントロールがデフォルトで使用する) の代わりに GDI+ (透過性をネイティブにサポートする) を使用してすべての描画を行うか、または次のような関数を呼び出すことDrawThemeTextEx
です。ガラス越しに [ある程度] 判読できる影付きのテキストをレンダリングするために特別に設計されています。
同様に、互換性のあるテキスト レンダリングを有効にする (.NET の初期のバージョンで行っていたように、組み込みコントロールが GDI+ ルーチンを使用して描画する) などの通常のトリックは、テキスト ボックスでは機能しません。
正直なところ、ガラスとしてレンダリングされていないフォームの領域にテキストボックスを配置するのが最善の策です。DwmEnableBlurBehindWindow
この関数を使用して、フォーム全体ではなく、フォームの特定の領域の背後にあるガラス効果を選択的に有効にします。ここでの回答で、すぐに使用できる完全な .NET 実装を提供します。
このサンプルをチェックしてください: http://www.danielmoth.com/Blog/Glass-In-C-An-Alternative-Approach.aspx
それ以上は調べていませんでしたが、この Aero グラス領域に TextBox や Button などのコンポーネントを配置するとうまくいきました。レンダリングされたコンポーネントには透過性の問題はありませんでした。ラベルは完璧ではありませんが、GDI+ で簡単に描画できます サンプル プロジェクトへの直接リンクは次のとおりです: http://www.danielmoth.com/Blog/MothGlass.zip
コントロールの後ろにパネルを配置し、パネルの TransparencyKey を設定しているようです。