C# 获取MDI客户端水平滚动值

C# 获取MDI客户端水平滚动值,c#,winforms,C#,Winforms,图片: 将MDI子窗体拖出边框时,如何获取MDI客户端水平滚动值和其他参数 或者如何获取MDI子窗体绝对坐标,包括MDI客户端的滚动部分?仅找到此解决方案: [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetScrollPos(IntPtr hWnd, int nBar); public int hpos = 0;

图片:

将MDI子窗体拖出边框时,如何获取MDI客户端水平滚动值和其他参数


或者如何获取MDI子窗体绝对坐标,包括MDI客户端的滚动部分?

仅找到此解决方案:

    [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetScrollPos(IntPtr hWnd, int nBar);
    public int hpos = 0;
    void MdiClient_Scroll(object sender, ScrollEventArgs e)
    {
        hpos += e.NewValue; 
        Console.WriteLine(hpos);
    }
    private MdiClientWrapper wrapper;
    protected override void OnHandleCreated(EventArgs e)
    {
        // Find the MdiClient and sub-class it so we can get the Scroll event
        base.OnHandleCreated(e);
        if (wrapper != null) wrapper.Scroll -= MdiClient_Scroll;
        var client = this.Controls.OfType<MdiClient>().First();
        wrapper = new MdiClientWrapper();
        wrapper.AssignHandle(client.Handle);
        wrapper.Scroll += MdiClient_Scroll;
    }

    private class MdiClientWrapper : NativeWindow
    {
        public event ScrollEventHandler Scroll;
        private int oldPos;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x114)
            {   // Trap WM_HSCROLL
                var type = (ScrollEventType)(m.WParam.ToInt32() & 0xffff);
                var pos = GetScrollPos(this.Handle, SBS_HORZ);//m.WParam.ToInt32() >> 16;
                Scroll(this, new ScrollEventArgs(type, oldPos, pos));
                oldPos = pos;
            }
            base.WndProc(ref m);
        }
    }
[DllImport(“User32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
公共静态外部int GetScrollPos(IntPtr hWnd,int nBar);
公共int hpos=0;
无效MdiClient\u滚动(对象发送方,ScrollEventArgs e)
{
hpos+=e.NewValue;
控制台写入线(hpos);
}
私有MdiClientWrapper;
已创建受保护的重写无效OnHandleCreated(EventArgs e)
{
//找到MdiClient并将其子类化,以便获得滚动事件
碱基。根据HandleCreated(e);
if(wrapper!=null)wrapper.Scroll-=MdiClient\u Scroll;
var client=this.Controls.OfType().First();
包装器=新的MdiClientWrapper();
wrapper.AssignHandle(client.Handle);
wrapper.Scroll+=MdiClient\u Scroll;
}
私有类MdiClientWrapper:NativeWindow
{
公共事件滚动事件处理程序滚动;
私家车;
受保护的覆盖无效WndProc(参考消息m)
{
如果(m.Msg==0x114)
{//Trap wmhscroll
变量类型=(ScrollEventType)(m.WParam.ToInt32()&0xffff);
var pos=GetScrollPos(this.Handle,SBS_HORZ);/m.WParam.ToInt32()>>16;
滚动(此、新滚动事件参数(类型、旧位置、位置));
oldPos=pos;
}
基准WndProc(参考m);
}
}
现在水平滚动位置总是在hpos变量中