ScrollWindow绝对没有效果

时间:2011-02-07 18:39:55

标签: c# winforms user-controls winforms-interop

我正在为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#Express Edition 2008上测试它。

2 个答案:

答案 0 :(得分:3)

正如Will在评论中指出的那样,您可以通过设置其AutoScroll属性轻松地使用户控件可滚动 - 无需点击Win32 API即可实现此功能。

如果您真的想使用API​​,请至少使用ScrollWindowEx代替ScrollWindow

更新:由于我随机猜到了这一点,答案是:

传递Null两个RECT参数。

答案 1 :(得分:-1)

所以,事实证明ScrollWindow()工作正常。我已经从Web上复制了一些代码,这些代码的RECT结构成员不按顺序。感谢MusiGenesis的提示让我看到了正确的位置(我只是假设我复制的代码是正确的 - 我的错误。)

是的,我喜欢有时编写有效的代码,这通常意味着我会认为我应该只使用货架上的任何东西,而不是像SO那样的人。不同的人喜欢以不同的方式进行软件开发,我认为没关系。

如果有人好奇,我正在写一个多线状态控件。我希望它很快,因为我的应用程序可以在很短的时间内向控件发送许多消息。有关该控件的文章以及最终源代码已发布在http://www.blackbeltcoder.com/Articles/controls/a-scrolling-status-control