C# 获取MDI客户端水平滚动值
图片: 将MDI子窗体拖出边框时,如何获取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客户端的滚动部分?仅找到此解决方案:
[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变量中