2011-11-17 85 views
1

我知道这应该是非常简单的,尤其是考虑到所有的在线信息和示例代码,但由于某种原因,我无法让这个工作。如何使用MouseMove事件在面板内移动标签?

我在winform上有一个标签和一个面板。我希望标签只在鼠标指针进入并在面板内移动时才遵循。

我知道它的工作原理,但它的位置完全移动了,并且在移动winform时它总是在变化。

这里是的MouseMove和其他事件:

constructor MainForm; 
begin 
    InitializeComponent(); 
    label2.Visible:=false; 
end; 

method MainForm.panel1_MouseMove(sender: System.Object; e: System.Windows.Forms.MouseEventArgs); 
begin 
    //label2.Location := panel1.PointToScreen(e.Location); 
    label2.Location := self.PointToScreen(e.Location); 
    label2.Invalidate; 
end; 

method MainForm.panel1_MouseEnter(sender: System.Object; e: System.EventArgs); 
begin 
    label2.Visible:=true; 
end; 

method MainForm.panel1_MouseLeave(sender: System.Object; e: System.EventArgs); 
begin 
    label2.Visible:=false; 
end; 

更新如所建议的通过larstech,我修改了的代码,但该标签仍然显示框外如下图像被示出。

myimage

感谢,

+0

是标签PANEL1的子控件?这不是很清楚。 – LarsTech

+0

@LarsTech不,它不是。该标签不在面板内的Winform上。 Panel1文本是包含文本“Panel1. – ThN

回答

4

我不知道delphi-prism,但不会是仅仅是:

label2.Location := e.Location; 

因为标签是不是孩子的控制,试试这个:

label2.Location := new Point(panel1.Left + e.Location.X, panel1.Top + e.Location.Y); 

显然,我可能没有正确的语法。

如果你只是试图移动工具提示,这部作品在C#:

private ToolTip _tips = new ToolTip(); 

private void panel1_MouseMove(object sender, MouseEventArgs e) { 
    _tips.Show("test", panel1, e.Location.X + 10, e.Location.Y + 10); 
} 
+0

”的标签,我将该标签作为面板的一个子项,现在它正在工作,但我必须保留mousedown以显示标签 – ThN

+0

@digitalanalog更新的答案。我认为计时器可以工作可能会更好,因为标签会导致面板的MouseLeave事件在鼠标移过标签时触发,您可以禁用该标签,但随后会禁用该标签。 – LarsTech

+0

为什么MouseLeave每次发生MouseEnter触发时都会触发这种情况 – ThN

相关问题