4

こんにちは、.net でフォームを使用しています。実行時にリンクされたラベルを動的に追加しています。これらのリンクラベルをパネルに追加し、そのパネルを winform に追加しています。リンクラベルの数が増えると、フォームは自動スクロールバー (垂直) を出します... 今、その自動スクロールを使用して下にスクロールすると、スクロールしてもフォームのビューが更新されず、スクロールを停止したときにのみフォームが更新されます...また、リフレッシュすると見栄えが悪くなります..ゆっくりと描く方法がわかります....

誰もこれを前に扱ったことがありますか??

スクロールイベントハンドラーで form.refresh() を試しましたが、役に立たないようです..

手がかりはありますか?

4

4 に答える 4

6

これをクラス(UserControl、Panelなど)にポップすると、サムドラッグで機能します。

private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;

protected override void WndProc (ref Message m)
{
    if ((m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
    && (((int)m.WParam & 0xFFFF) == 5))
    {
        // Change SB_THUMBTRACK to SB_THUMBPOSITION
        m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
    }
base.WndProc (ref m);
}
于 2012-03-21T19:13:33.070 に答える
5

WinAPI 呼び出しを使用したくない場合は、次のようにすることができます。

// Add event handler to an existing panel
MyPanel.Scroll += new EventHandler(MyPanelScroll_Handler);

// Enables immediate scrolling of contents
private void MyPanelScroll_Handler(System.Object sender, System.Windows.Forms.ScrollEventArgs e)
{
    Panel p = sender As Panel;
    if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) {
        p.HorizontalScroll.Value = e.NewValue;
    } else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) {
        p.VerticalScroll.Value = e.NewValue;
    }
}
于 2013-06-28T22:10:21.200 に答える
2

フォームの DoubleBuffered プロパティを True に設定してみてください。

更新:実際には、コントロールがフォームのパネルにあるため、おそらく何もしません。組み込みの Panel コントロールには公開された DoubleBuffered プロパティがないため、これを行うには、DBPanel という名前の UserControl をプロジェクトに追加し、UserControl ではなく Panel から継承するようにコードを変更します (これは変更できます)。追加した後、CS ファイルに手動で挿入します)。UserControl を追加すると、コードは次のようになります。

public partial class DBPanel : UserControl
{
    public DBPanel()
    {
        InitializeComponent();
    }
}

次のように編集します (UserControl を Panel に変更し、「this.DoubleBuffered = true;」行をコンストラクターに追加します)。

public partial class DBPanel : Panel
{
    public DBPanel()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
    }
}

プロジェクトをビルドすると、コンパイラは "this.AutoScaleMode ..." で始まる行で barf を実行します。この行を削除して再構築します。

通常の Panel の代わりに DBPanel コントロールをフォームで使用できるようになりました。これにより、ちらつきの問題が解決されます。

更新 2 : 申し訳ありませんが、あなたの質問を十分に読んでいませんでした。そうです、スクロールバーのつまみを放すまで、Panel はそれ自体を再描画しません。この効果を実現するには、独自の UserControl を作成するだけでよいと思います。

基本的には、VScrollBar が右側にドッキングされた UserControl と、左側にドッキングされた AutoScroll = false の Panel が残りのスペースを占めるだけです。VScrollBar の Scroll イベントと ValueChanged イベントは、親指を上下に動かすと発生するため、LinkLabels の束を内側の Panel に追加した後、これらのイベントを使用して Panel の Top 位置を変更し、動的スクロール効果を実現できます。あなたが探しています。

パネルがデフォルトでこのように機能しないこと、またはそれを有効にする設定さえないことは、ちょっとイライラします。

于 2009-09-15T00:09:52.273 に答える