1

WinFormsのユーザーコントロールを作成していますが、コントロールウィンドウのセクションをスクロールする必要があります。

不可解なことに、WinFormsではScrollWindow()メソッドを使用できないようです。そのため、InteropServicesを使用して、次のバリエーションを使用してWin32 API ScrollWindow()関数を使用しようとしています。

[StructLayout(LayoutKind.Sequential)] 
public struct RECT
{
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 

    public RECT(Rectangle rect)
    {
        this.bottom = rect.Bottom;
        this.left = rect.Left;
        this.right = rect.Right;
        this.top = rect.Top;
    }
}

[DllImport("user32")]
public static extern int ScrollWindow(IntPtr hWnd, int nXAmount, int nYAmount,
    ref RECT rectScrollRegion, ref RECT rectClip);

void MyScrollFunc(int yAmount)
{
    RECT r = new RECT(ClientRectangle);
    ScrollWindow(Handle, 0, yAmount, ref r, ref r);
}

その結果、このコードはまったく何もしません。スクロール後にUpdate()を呼び出すなど、このコードのさまざまなバリエーションを試しました(これは必要ありません)。

ScrollWindow()は1を返します。これは成功を意味しますが、何を試してもコントロールウィンドウのコンテンツには影響しません。

このように表示を変更することを妨げるユーザーコントロールについて何かがあるかどうか誰かが知っていますか?これは、Windows XPのC#ExpressEdition2008でテストしています。

4

2 に答える 2

3

Willコメントで指摘されているように、プロパティを設定することで、ユーザーコントロールを簡単にスクロール可能にすることができます。AutoScrollこの機能を実現するためにWin32APIをタップする必要はありません。

本当にAPIを使用したい場合は、少なくともScrollWindowExの代わりに使用してScrollWindowください。

更新: 私はこれをランダムに推測したので、答えは次のとおりです。

Null2つのRECTパラメーターを渡します。

于 2011-02-07T19:05:50.720 に答える
-1

したがって、問題なくScrollWindow()機能することがわかります。RECT構造体のメンバーの順序が狂っているコードをWebからコピーしました。正しい場所を探すためのヒントをくれたMusiGenesisに感謝します(コピーしたコードが正しいと思っていました-私の間違いです)。

はい、私は時々効率的なコードを書くのが好きです、そしてそれは通常私が棚にあるものは何でも使うべきだと思う人々によってSOのような場所で頭を突き合わせることを意味します。さまざまな人々がさまざまな方法でソフトウェア開発に取り組むことを好みますが、それは問題ないと思います。

興味があれば、私は複数行のステータスコントロールを書いていました。私のアプリは短時間でコントロールに多くのメッセージを送信できるので、高速にしたかったのです。コントロールに関する記事と最終的なソースコードがhttp://www.blackbeltcoder.com/Articles/controls/a-scrolling-status-controlに投稿されています。

于 2011-02-09T02:17:23.007 に答える