0

コントロールのOnPaint()メソッドでe.Graphics.CopyFromScreen()を使用して、コントロールのコンテンツを描画できる背景を準備しようとしています(これはすでに問題になっている可能性があります)。目標は、角が丸いツールチップと、デフォルトのWindowsツールチップを置き換えるその他の特定の機能です。

理想的には、ツールチップをアンチエイリアシングして背景にブレンドすることができますが、ピンチでエイリアシングされた境界を許容できます。コントロールがOpenGLオーバーレイでコントロールをカバーすることが多く、ブレンド手順全体が悪夢になる可能性があるため、これも必要になる場合があります。

カスタムユーザーコントロールを作成しました。この永続的なインスタンスは、アプリケーションのメインフォームに属し、OnPaintメソッドとOnPaintBackgroundメソッドをオーバーライドします。ただし、透明性の適用は困難です。私が理解しているように、paintメソッドに渡されるグラフィックスオブジェクトは、現在のVisibleClipBoundsのコピーから始まります。通常、最初の動きは、コントロールを単色でクリアして、主要なフィーチャの描画を開始することです。私の最初の考えは、塗りつぶしをバイパスして、キャプチャされた背景に描画を開始することでした。最初の再描画ではこれは正常に機能しますが、その後の再描画では、背景を再キャプチャするのではなく、前のコンテンツが保持されます。CopyFromScreenが、現在描画しているコントロールをキャプチャから明確に削除して、クリーンなベースから開始することを望んでいましたが、そうではありません。

他のソリューションとその順列など

SetStyle(ControlStyles.SupportsTransparentBackColor, True)

Me.BackColor = Color.Transparent

e.Graphics.Clear(Color.FromArgb(0,0,0,0))

これまでのところ、適切な結果は得られていません。

透明なキーカラーを使った透明なフォルムから始めました。これはエイリアシングで機能しましたが、ツールチップとしてフォームを使用すると、タスクバーボタンの一時的な存在、基になるフォームのフォーカスの喪失、その後のホストフォームのタイトルでの視覚的なフィードバックなど、厄介なアーティファクト(一部は克服できる可能性があります)が発生しました。バーの色。コントロールははるかに軽量ですが、私はそれをフォームと同様に機能させるのに苦労しています。

この時点で、目的の結果を達成する方法と、CopyFromScreenがそのソリューションの一部であるかどうかを尋ねるだけです。

4

2 に答える 2

2

これは読むべきテキストがたくさんありますが、カスタム形状のフォーム/コントロールを実現するために透明性に対処しています... Control.Regionは同じことを行うことができます:

[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
    int nLeftRect, // x-coordinate of upper-left corner
    int nTopRect, // y-coordinate of upper-left corner
    int nRightRect, // x-coordinate of lower-right corner
    int nBottomRect, // y-coordinate of lower-right corner
    int nWidthEllipse, // height of ellipse
    int nHeightEllipse // width of ellipse
    );

private void CreateRegion()
{
    this.Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 40, 40));
}
于 2012-06-26T20:03:27.730 に答える
0

コントロールがトップレベルウィンドウとして設定されていて、Windows 7または8で実行している場合は、DwmEnableBlurBehindWindowにチェックインします。パラメータ構造で、enableをtrueに設定し、ぼかし用に1x1ピクセルの領域を作成します。BackColorとTransparencyKeyをBlackに設定すると、完全に透明なウィンドウ(マウスパススルーを完備)が得られ、32ビット画像を完全なアルファ透明度でペイントできます(Graphics.FromHwndを使用)。この方法の利点は、ウィンドウが移動したり背景が変更されたりした場合に、WindowsDWMがすべての作業を実行することです。更新する必要はありません。

于 2013-01-31T03:36:30.907 に答える