2

Aeroガラス効果を使用するアプリケーションがあるため、各ピクセルには、赤、緑、青の値に加えてアルファ値があります。背景が白一色(アルファ= 255)のカスタム描画コントロールが1つあります。GDIテキスト関数を使用してコントロールにソリッドテキストを描画したいと思います。ただし、これらの関数はアルファ値を任意の値に設定するため、アプリケーションの下にあるウィンドウがテキストに半透明で表示されます。

テキストのレンダリングを呼び出した後、コントロール内のすべてのピクセルを調べて、それらのアルファ値を255に戻したいと思います。これを行うための最良の方法は何ですか?

BitBlt、、、GetPixelおよびSetPixel関数については運がありませんでした。彼らはアルファ値に気づいていないように見えます。

これが私が検討して拒否した他の解決策です:

  • ビットマップに描画してから、ビットマップをデバイスにコピーします。このアプローチでは、テキストレンダリングはモニターの特性(ClearTextなど)を利用しません。GDIでテキストをビットマップにレンダリングする方法を知っている場合は、画面にレンダリングするのとまったく同じように、それで問題が解決します。
  • テキストレンダリングにGDI+を使用する:このアプリケーションは、元々テキストレンダリングにGDI +を使用していました(Aeroサポートの作業を開始する前)。GDI +で文字列を正確に測定しようとして問題が発生したため、GDIに切り替えました。切り替えたくない。
  • 問題のコントロールを回避するようにAeroリージョンを設定します。私のアプリケーションのウィンドウは、実際には別のプロセスで実行されている別のアプリケーションの子ウィンドウです。トップレベルウィンドウのAero設定を直接制御することはできません。

アプリケーションはWindowsフォームを使用してC#で記述されていますが、私はInteropを使用してWin32API関数を呼び出すことはできません。

4

2 に答える 2

1

以下は私が最終的に思いついた解決策です。それはちょっと醜く、おそらく単純化することができますが、それは機能します。アイデアは、元のGraphicsオブジェクト(つまり、画面)に基づいてBufferedGraphicsオブジェクトを作成することです。BufferedGraphicsオブジェクトでは、TextRenderer.DrawText()は、画面に描画している場合とまったく同じようにテキストをレンダリングします。次に、通常のグラフィックスオブジェクトを作成し、Buffered Graphicsオブジェクトを通常のグラフィックスオブジェクトにコピーして、最後に通常のグラフィックスオブジェクトを画面に描画します。

Rectangle inner = new Rectangle(Point.Empty, ContentRectangle.Size);
using (BufferedGraphics bg = BufferedGraphicsManager.Current.Allocate(e.Graphics, inner)) {
    using (Bitmap bmp = new Bitmap(inner.Width, inner.Height, bg.Graphics)) {
        using (Graphics bmpg = Graphics.FromImage(bmp)) {
            bg.Graphics.Clear(BackColor);
            do_my_drawing(bg.Graphics);
            bg.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
            e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
            bmpg.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

            bg.Render(bmpg);
            e.Graphics.DrawImageUnscaledAndClipped(bmp, ContentRectangle);
        }
    }
}

すべてのCompositingMode属性を設定する必要はおそらくありませんが、一度機能させると、すべての順列をテストして、必要なものがあるかどうかを判断する必要はありませんでした。

于 2010-04-28T16:58:06.933 に答える
0

別のビットマップでGDI+を使用して、それを画面にコピーしてみてください。利点は、GDI +で描画されたテキストのアルファが、ビットマップを透明にする代わりに、ビットマップの色(白く塗ったはずです)を表示することです。

しかし実際、GDI +には非常にバグのある、または単に不正確なテキスト測定機能があります。しかし、多分あなたはそのためにGDI関数を使うことができます。最終的に、GDI +テキストレンダリングは現在のGDIテキストレンダリングとまったく同じように見えるはずなので、試してみる価値があるかもしれません。

于 2010-04-22T14:38:44.583 に答える