Създадох персонализиран UserControl, който се показва в ToolStripDropDown, за да емулира функционалността на ToolTip. Най-вече работи добре за всеки контрол, когато се абонирам за техните събития MouseEnter и MouseLeave.
Искам да го използвам и за персонализирани обекти (не контроли). Създадох интерфейс, който дефинира събитията MouseEnter и MouseLeave, така че да мога да абонирам всеки обект (като персонализирани примитиви) към тази подсказка. Тези класове вършат собствена работа, за да определят кога да задействат MouseEnter и MouseLeave.
Проблемът ми е, че когато се показва подсказката, моите UserControls, които съдържат персонализираните обекти, не получават събития MouseMove, въпреки че подсказката се показва отстрани, а не под мишката. Генерирам свое собствено събитие MouseLeave въз основа на проверка в MouseMove дали мишката вече не е над въпросния обект. Но очевидно без MouseMove събития, MouseLeave никога не се задейства.
Когато покажа подсказката на контрола, се случва същото (няма събития MouseMove), с изключение на това, че MouseLeave все още се задейства.
1) Как мога да емулирам тази функционалност MouseLeave? Трябва ли да използвам p/invoke за SetCapture движение на мишката или някой знае ли по-лесен начин?
2) Когато подсказката се покаже, въпреки че нито ToolStripDropDown, нито моят UserControl вътре в него задействат събитие „GotFocus“, аз все още губя фокуса на клавиатурата, докато се показва подсказката, което също не е желано поведение на подсказката. Мога ли да избегна това?
По принцип искам да е напълно нефокусираща, непречеща подсказка. Разгледах примерен проект, наречен SuperTooltip, но имаше същата дефектна функционалност. Опитах да задам ControlStyles.Selectable на false и не забелязах никаква промяна.
Ето кода, в който създавам моята подсказка UserControl:
public CustomTooltip()
{
this.SetStyle(ControlStyles.Selectable, false);
dropDown = new ToolStripDropDown();
dropDown.AutoSize = false;
dropDown.Margin = Padding.Empty;
dropDown.Padding = Padding.Empty;
host = new ToolStripControlHost(this);
host.AutoSize = false;
host.Margin = Padding.Empty;
host.Padding = Padding.Empty;
this.Location = new Point(0, 0);
dropDown.Items.Add(host);
}
И го показвам с:
dropDown.Show(
new Point(Cursor.Position.X, Cursor.Position.Y + Cursor.Current.Size.Height),
ToolStripDropDownDirection.BelowRight
);