3

WinFormsでプログラム的に「偽の」スクロールをトリガーすることは可能ですか?

シナリオ:
System.Drawing (およびスクロールバーなし) を使用して作成された、さまざまな描画を含むフォーム。

私が欲しいもの:

  1. ユーザーが左に 10 ピクセルスクロールしたことをフォームにプログラム的に伝えます。
  2. Form は、既存の描画を 10 ピクセル左に移動します。
  3. フォームは、現在空になっている右側の 10 ピクセルだけを含む ClipRectangle でペイント イベントを生成します。

これは可能ですか、それとも自分で処理する必要がありますか?

4

4 に答える 4

3

フォームより大きいパネルをフォームに追加できます。Panel の VerticalScroll プロパティと Horizo​​ntalScroll プロパティの value プロパティを設定して、スクロール バーをオフのままにし、パネルを手動でスクロールします。

次に、図面をフォームではなくパネルに追加します。

 this.panel1.VerticalScroll.Value = 50;
this.panel1.HorizontalScroll.Value = 100;
于 2009-05-04T19:43:50.647 に答える
1

描画を別のコンテナに入れてから、コンテナの場所をメインフォームから離れた場所に移動してみてください。.location = -10,0 たとえば。これにより、画面から一定数のピクセルが移動したような錯覚が生じます。場所の変更でこれがうまくいかない場合は、いつでも独自の再描画イベントを発生させることもできます。それ以外はいつでも所有者がすべてを描くことができます。

于 2009-05-04T19:29:31.040 に答える
1

System.Drawing を使用しているため、描画メソッド (OnPaint() または描画している場所) に x オフセット -10 ピクセルで描画を開始するように指示する必要があります。描画するものはすべて、その量だけ相殺されます。

描画全体を 10 ピクセル左にシフトすると、画面の右側の 10 ピクセルだけでなく、画面領域全体が無効になります。これを行うには、いくつかの方法があります。

1) オフセットを -= 10 ピクセルに設定します。Invalidate() を呼び出して、画面全体を無効にします。これにより、画面全体が強制的に再描画され、オフセットが正しくコーディングされている限り、10 ピクセル以上すべてが再描画されます。2) 画面に表示されているもののメモリ内ダンプを取得し、そこからイメージを作成します。次に、その画像を画面から 10 ピクセル左に再描画します。その後、単純に右端の 10 ピクセルを無効にします。

実際、方法 2 は方法 1 よりもかなり遅くなります。何百万もの描画する必要がない場合、画面の再描画は非常に高速です。

于 2009-05-04T19:43:48.557 に答える
1

正直なところ、それが機能するかどうかはわかりませんが、フォームにスクロールバーが存在しない場合は機能しないと思います。

ただし、フォームのクライアント領域よりも大きなサイズの PictureBox コントロールがあり、それを移動すると、特定のクリップ領域のみで更新されると思います。

于 2009-05-04T19:24:37.963 に答える