【发布时间】:2016-07-21 14:52:29
【问题描述】:
我有一个 Windows 窗体,我的任务是为窗体添加拖动功能。 “VendorMasterList”是一个标签。我已向该标签添加了鼠标移动、鼠标按下和鼠标向上事件。
如果我尝试拖动,表单会向下移动,然后只能以我想要的方式拖动。我的问题是为什么它会下降?这是我的代码
private Point startPoint = new Point(0, 0);
private bool isDragging = false;
private void lblHeader_MouseDown(object sender, MouseEventArgs e)
{
isDragging = true; // _dragging is your variable flag
startPoint = new Point(e.X, e.Y);
}
private void lblHeader_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
}
private void lblHeader_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging)
{
Point p = PointToScreen(e.Location);
this.Location = new Point(p.X - this.startPoint.X, p.Y - this.startPoint.Y);
}
}
有没有办法解决这个问题?
新添加的图片
【问题讨论】:
-
您是在尝试移动页眉还是表单……因为“this.location”会移动表单……
-
您真的认为像这样使用自定义 chrome 是个好主意吗?保持窗口原样并让用户选择它的外观有什么问题?如果您坚持,请查看非客户区在 Windows 中的工作方式 - 以任何您想要的方式重新绘制非客户区、扩展它甚至只是假装窗口客户区的一部分都非常容易实际上是一个非客户区,对应于表头(并让 Windows 为您进行拖动)。
-
如果鼠标移到标签上并点击。表格的位置发生了变化。
-
您可以尝试计算表单的 ClientSize 与表单的实际大小之间的差异 -
this.Location = new Point(p.X - this.startPoint.X, p.Y - this.startPoint.Y - (this.Height - this.ClientSize.Height)); -
您真的只需要处理WM_NCHITTEST 消息,并在鼠标位置在您的“标题”内时返回
HTCAPTION。转发其他任何内容的默认值。就是这样。这样你的表单就会神奇地移动,就像任何其他没有被混蛋的表单一样。