1

非常に幅の広い横棒を含む棒グラフを想像してください。これらのバーを表示し、スクロールしてズームしたいフォームにパネルがあります。フォーム、つまりパネルはサイズ変更できます。バーはデータベースから動的に作成されます。ユーザーがズームインまたはズームアウトするたびに、すべてのバーを新たに作成して、パネル上のサイズを調整する必要があります。

Label コントロールを使用してこれらのバーを作成しましたが、問題は他のすべてのコントロールにも当てはまります。ズームインすると、最終的にバーがコントロール サイズの魔法の 16 ビット境界 (>65536 ピクセル) を超えてしまいます。これにより、開始時にパネル上にすべてのコントロールを単純に作成し、パネルにスクロールを処理させることができなくなります。

私の考え: スクロール バーの現在の位置とズーム レベルに従って、すべてのバー コントロールの Panel をクリアし、現在のビュー ウィンドウに表示されているものだけを作成します。可視ビューから遠く離れたバーは、パネルのすぐ外側で短くカットされるため、最大サイズはパネル サイズによって制限されます。

私の質問:

  • このクリア/作成プロセスはどのパネル イベントで行うのが最適ですか? 何千ものコントロールが存在する可能性があるため、できるだけ少なくする必要があります。
  • これを処理するより良い方法はありますか?たぶん、最初からすべて間違っていたのでしょう。

この問題は、巨大なコントロールだけでなく、パネル上で小さなコントロールが非常に離れている (>65536 ピクセル) 場合にも発生するため、多くのプロジェクトで適切な解決策が役立つと思います。

4

3 に答える 3

2

クリックイベントのためだけに、コントロールを作成/破棄したり、コントロールを非表示/サイズ変更したりする必要はありません。バーを描画するメソッドを作成しUserControlてオーバーライドし、またはイベントをオーバーライドするのは非常に簡単です。OnPaintOnClickOnMouseXxx

「仮想空間」内のバーの位置は既にわかっているので、マウス カーソルの位置をバー (またはバーの外側をクリック) にマッピングするのは簡単です。

于 2012-05-30T12:00:48.707 に答える
0

メタファイル (ベクター グラフィックス) を作成し、それをイメージ コントロールに表示して、どの論理要素がクリックされたかを手動で判断できます。

于 2012-05-30T12:30:06.083 に答える
0

winforms が必須であると言ったのは知っていますが、wpf ビューボックスを調べる必要があると本当に思います。winforms で wpf 要素をホストできます。したがって、他のすべてはフォームに関連する可能性があり、コントロールをホストして表示するパネルがあります。これを示す簡単な例を書くこともできますが、この方法を使用するつもりがない場合は、時間を無駄にしたくありません。

于 2012-05-30T11:59:10.610 に答える