Ответ 1
Попробуйте протестировать хит Control.ClientRectangle
, а не Control.Bounds
:
if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) {
bool aBool = true;//breakpoint
bool two = aBool;
}
У меня есть пользовательский элемент управления
public partial class UserControl1 : UserControl, IMessageFilter
{
public UserControl1()
{
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
var mouseLocation = Cursor.Position;
if (Bounds.Contains(PointToClient(mouseLocation)))
{
bool aBool = true;//breakpoint
bool two = aBool;//just assignment so compiler doesn't optimize my bool out
}
if (m.Msg != 0x20a) // Scrolling Message
{
return false;//ignore message
}
return false;
}
}
Когда я плаваю над пользовательским элементом управления, содержащимся в родительской форме, точка останова не попадает. Точка останова попадает в непосредственной близости, но я могу находиться в фактическом текстовом поле внутри пользовательского элемента управления и не получать удар. Как я могу точно определить, находится ли я в пределах этого пользовательского элемента управления?
FWIW, у меня есть два монитора. Кажется, это не влияет на то, какой монитор я использую.
Попробуйте протестировать хит Control.ClientRectangle
, а не Control.Bounds
:
if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) {
bool aBool = true;//breakpoint
bool two = aBool;
}
просто для быстрого трюка. Вы можете запускать все элементы управления userconrol с одним событием и обрабатывать мышь над событиями. например, если у вас было два текстовых поля в вашем usercontrol
textBox1.MouseMove += new MouseEventHandler(controls_MouseMove);
textBox2.MouseMove += new MouseEventHandler(controls_MouseMove);
...
void controls_MouseMove(object sender, MouseEventArgs e)
{
Control subc=sender as Control;
int mouseX = MousePosition.X;
....
}