2

パネルの境界線を作成しようとしているときに問題が発生しました。まず、プロパティ パネルを"AutoScroll = true;"に設定しました。 次に、パネルイベントに境界線の描画コードを入れます:

    ControlPaint.DrawBorder(e.Graphics, 
        ClientRectangle,  
        Color.Black, 5, 
        ButtonBorderStyle.Solid,
        Color.Black, 5, ButtonBorderStyle.Solid, 
        Color.Black, 5, ButtonBorderStyle.Solid,
        Color.Black, 5, ButtonBorderStyle.Solid);

実際にはまだ 2 つ目の問題があり、ここですべて説明します。気にしないでください。そうですね、パネルのスクロールがアクティブになっていると、パネルの境界線がクラッシュします。写真を見てください: ここに画像の説明を入力

私が入れても

`e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);`

スクロールがアクティブなときにパネル内に長方形を描画するだけなので、ボーダーパネルのようには見えません。それは私が期待したものではありませんが、ボーダーが必要です

きっと、問題はソース コードです。それは、それができないからではありません。System.Windows.Forms.Panelを見てください。単純ですが、完璧なパネルだと思います。この問題を解決するのを手伝ってください。これは私を混乱させました

4

1 に答える 1

5

これはうまくいきません。「ドラッグ中にウィンドウの内容を表示する」という名前の Windows システム オプションと戦っています。最近のすべての Windows バージョンで有効になっており、合理的に無効にすることはできません。このオプションが行うことは、スクロールバーを操作したときに最適化された方法でウィンドウのコンテンツをスクロールすることです。ウィンドウのピクセルをスクロール量だけコピーし、スクロールによって明らかになったウィンドウの部分の再描画を要求します。

問題は、ペイントされた境界線も移動したことです。そのため、下の黒い線も上に移動しているのがわかります。しかし、Windows はスクロールによって表示されたウィンドウの一部の再描画のみを要求したため、消去されません。だからそれは「にじみ」ます。一番上の行が消えてスクロールオフになります。これを修正するには、ウィンドウ全体を再描画する必要があります。パネル コントロールの Scroll イベントを実装することで簡単に実行できます。

    private void panel1_Scroll(object sender, ScrollEventArgs e) {
        panel1.Invalidate();
    }

これで問題は解決しますが、低速のマシンでは依然としてアーティファクトが発生する場合があります。その黒い線はまだ上に移動しているため、Paint イベント ハンドラーによって再びすばやく上塗りされます。「すばやく」が問題です。それほど速くない場合でも、その行が移動することがわかります。アーティファクトは、ええと、興味深いです。行がポゴを実行し、上下にジャンプしているのがわかります。人間の目はそのような動きに非常に敏感であり、背の高いサバンナの草の中でライオンをうまく検出できるのは進化上の利点でした.

スクロールするウィンドウでオブジェクトを静止させようとしてもうまくいきません。パネル コントロールをいじって WM_NCCALCSIZE のメッセージ ハンドラーを実装し、パネルに非クライアント領域を与えることができますが、それはかなり面倒です。

簡単な解決策は、フォームにパネルの周りに長方形を描画させることです:

    protected override void OnPaint(PaintEventArgs e) {
        var rc = panel1.Bounds;
        rc.Inflate(1, 1);
        e.Graphics.DrawRectangle(Pens.Black, rc);
        base.OnPaint(e);
    }

または、さらに簡単に、パネルの BorderStyle を設定します。

于 2013-08-15T11:03:06.860 に答える