2

通常とは異なるアプローチでスキン フォーム (境界線とキャプションのみ) を作成しようとしていますが、フォームのサイズを変更するときにフォームがちらつくという問題があります。

問題を説明する他の方法がわからないので、問題を説明するために作成したビデオを次に示します: http://www.screencast.com/t/AIqK9Szmz

また、フォームの境界線を再描画するコード全体を含む VS2008 テスト ソリューション: http://stuff.nazgulled.net/misc/TestForm.zip

誰かが私がちらつきを取り除くのを手伝ってくれることを願っています...

4

7 に答える 7

3

フォームを不規則な形状にしたい場合は、領域に目を向ける必要があります(CircleやRectangleなどの幾何学的形状を使用してフォームの領域を簡単に定義できる場合)。System.Drawing.Graphics.Regionオブジェクトを作成し、それに図形を追加します。フォームのプロパティはRegionと呼ばれていると思います。作成したリージョンをそれに割り当てます。

他のオプションは、レイヤードウィンドウを使用することです。誰かがあなたのためにすべての仕事をしました。階層化されたウィンドウは、2000より古いバージョンのWindowsでは機能しませんが、半透明であるという追加の利点があります。

最後のオプションは、WPFを使用し、AllowsTransparency = "True" WindowStyle="None"を設定することです。これにより、クロムが削除されます(100万の例のようにGoogleの「クロムレスウィンドウWPF」)。

最後に、勇気があり忍耐強い場合は、いつでもウィンドウの後ろにあるデスクトップをキャプチャして、何よりも先にペイントすることができます。ウィンドウが移動した場合は、派手なハッカーに頼る必要があります。このアプローチはお勧めしませんが、すべてのオプションを知っておく必要があります。

于 2008-11-26T13:34:04.417 に答える
3

それが、基本フォームのコンストラクターで使用するものです。

this.SetStyle( ControlStyles.AllPaintingInWmPaint, true );
this.SetStyle( ControlStyles.UserPaint, true );
this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
this.SetStyle( ControlStyles.ResizeRedraw, true );

「AllPaintingInWmPaint」の使い方がポイントだと思います。

于 2008-11-25T18:56:16.547 に答える
2

(これは Vista 固有のソリューションです。デスクトップ合成が有効になっている場合にのみ機能します。)

Windows は、フォームの元の境界線上のピクセルを新しい領域にコピーすることによって、サイズ変更されたフォームのコンテンツを初期化するようです。あなたの場合、フォームの境界に元々黒いピクセルがあったため、新しい領域は黒く初期化されている可能性があります。

ちらつきをなくすには、フォームの一番右と一番下のピクセル行を常に TransparencyKey に設定しておきます。これにより、再描画する機会が得られるまで、新しい領域が透明に保たれます。つまり、フォームの幅と高さを必要以上に 1 ピクセル増やし、余分なピクセルを透明にします。

例: TransparentForm.zip

于 2009-03-15T16:36:15.380 に答える
1

初期化されていない醜い黒いビデオ オーバーレイのちらつきを避けたい場合は、Form.TransparencyKey プロパティの使用をあきらめる必要があります。サンプル プログラムでは何の役にも立ちません。

于 2008-11-26T12:32:26.850 に答える
0

ちなみに、SLIMcodeのコードを使用しても、すべてのペイントロジックをオーバーライドOnPaint()に入れないと機能しません。これがなじみのないように聞こえる場合は、フォームでInvalidate()を呼び出して、強制的に再描画を要求できることをおそらく知らないでしょう。コードを単一のPaintメソッドにリファクタリングすることが使命ですが、最終的にはよりクリーンなコードになります。

于 2008-11-26T13:38:07.967 に答える
0

win フォームのサイズ変更中にちらつきをなくすには、サイズ変更中にレイアウトを一時停止します。以下のように、フォームの resizebegin/resizeend メソッドをオーバーライドします。

protected override void OnResizeBegin(EventArgs e) {
    SuspendLayout();
    base.OnResizeBegin(e);
}
protected override void OnResizeEnd(EventArgs e) {
    ResumeLayout();
    base.OnResizeEnd(e);
}

これにより、コントロールはそのまま (サイズ変更前の状態) のままになり、サイズ変更操作が完了すると強制的に再描画されます。

于 2011-10-13T20:23:26.497 に答える
0

DoubleBuffering を有効にしてみましたか?

于 2008-11-26T13:00:33.393 に答える