我正在为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上测试它。
答案 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。