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# Express Edition 2008 上对此进行测试。

4

2 回答 2

3

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

如果你真的想使用 API,至少使用ScrollWindowEx而不是ScrollWindow.

更新: 因为我随机猜到了这个,所以答案是:

传递Null两个RECT参数。

于 2011-02-07T19:05:50.720 回答
-1

所以,事实证明ScrollWindow()工作得很好。我从 Web 上复制了一些代码,这些代码使RECT结构的成员无序。感谢 MusiGenesis 的提示,让我找到了正确的位置(我只是假设我复制的代码是正确的——我的错误。)

是的,我有时确实喜欢编写高效的代码,这通常意味着我会在一些人认为我应该只使用架子上的任何东西的地方碰头。不同的人喜欢以不同的方式进行软件开发,我认为这没关系。

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

于 2011-02-09T02:17:23.007 回答