我已经在Stack和互联网上阅读了很多关于如何在.net中移动无边框表单的评论
我遇到的解决方案是两个。 1)使用winapi功能 2)处理mousedown / move / up事件。
我已经使用winapi调用实现了移动表单,但是在我的项目中,在主表单下面还有第二个,(日志表单,记录有关用户和程序本身的事件)。 此日志表单实现为滑动菜单,如果用户单击特定按钮,日志表单将向下滑动并显示在主窗体的底部中间。
我已尝试过两种方式,但我无法实现例程,如果日志表单打开,每当我拖动主表单时,日志表单必须跟随附加。
我尝试了什么: (为了简单起见,我省略了一些关于检查日志表单是否显示的标志等等。我只想了解为什么我不能移动日志表单)。 dlls import和const声明都是正确的。
private void headerPanel_MouseDown(object sender, MouseEventArgs e)
{
//this is the event in the mainForm.cs, which handles the mainForm drag, header panel is a little panel on top of the borderless mainForm
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
//using the logger form handle, and issue the same command doesn't work
SendMessage(Log.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
我还尝试了mouseDown / Up / Move事件,mouseDown / Up设置了一个标志,鼠标移动了
private void headerPanel_MouseMove(object sender, MouseEventArgs e)
{
if(isDown)
{
log.Position = new Point(//X, Y values here)
}
}
使用这个解决方案,只有当我释放鼠标按钮时,logPanel才会更新它的位置,我尝试放置log.Refresh()/ Invalidate(),因为我认为没有足够的时间重绘所有表单,但它没有'工作,并使用可怕的thread.sleep(10),以允许它重绘不起作用。
有什么线索我该怎么办?或者我在这里做错了什么?