SharpMap MapBox を使用してオブジェクトを世界地図上のポイントとして表示するフォームに取り組んでいます。現在、カーソルを使用して MapBox (mapBox1) に入り、ポイントで停止すると、希望どおりにツールチップが表示されます。ただし、MapBox 内でマウスを停止し (ポイント上である必要はありません)、MapBox 内でマウスを移動すると、ポイントに移動してもツールチップが (再) 表示されません。ただし、MapBox を離れると (たとえば、カーソルをウィンドウの外に移動したり、メニュー ストリップの 1 つに移動したり、マップ上にオーバーレイされたボタンに移動したりした場合)、ツールチップを表示できますが、一度だけ表示する必要があります。前と同じようにカーソルを移動します。
この動作の原因は何ですか? また、簡単に修正する方法はありますか?
ToolTip.Hide()、ToolTip.Active = false を使用して (表示したいときに再度 true に設定して)、さまざまな時点で MapBox を更新してみました。
関連コード:
ToolTip はグローバルであり、コンストラクターは次のように定義します。
toolTip.InitialDelay = 1000;
toolTip.ReshowDelay = 750;
toolTip.ShowAlways = true;
次に、マウス用の 2 つのイベント ハンドラーを用意し、どちらも MapBox に結び付けます。「obj」は、緯度と経度のポイントを含むカスタム クラスのグローバル オブジェクトです。
private void mapBox1_MouseHover(object sender, EventArgs e)
{
PointF pos = mapBox1.PointToClient(Cursor.Position);
int screenToleranceX = 20, screenToleranceY = 20;
PointF posLow = new PointF(pos.X - screenToleranceX, pos.Y - screenToleranceY);
PointF posHigh = new PointF(pos.X + screenToleranceX, pos.Y + screenToleranceY);
GeoAPI.Geometries.Coordinate objLoc = new GeoAPI.Geometries.Coordinate(obj.longitude, obj.latitude);
PointF objPoint = mapBox1.Map.WorldToImage(objLoc);
if (posLow.X <= objPoint.X && objPoint.X <= posHigh.X && posLow.Y <= objPoint.Y && objPoint.Y <= posHigh.Y)
{
toolTip.Active = true;
toolTip.Show(obj.Name, mapBox1, mapBox1.PointToClient(Cursor.Position));
}
}
private void mapBox1_MouseMove(GeoAPI.Geometries.Coordinate worldPos, MouseEventArgs imagePos)
{
PointF pos = mapBox1.PointToClient(Cursor.Position);
int screenToleranceX = 20, screenToleranceY = 20;
PointF posLow = new PointF(pos.X - screenToleranceX, pos.Y - screenToleranceY);
PointF posHigh = new PointF(pos.X + screenToleranceX, pos.Y + screenToleranceY);
GeoAPI.Geometries.Coordinate objLoc = new GeoAPI.Geometries.Coordinate(obj.longitude, obj.latitude);
PointF objPoint = mapBox1.Map.WorldToImage(objLoc);
if (toolTip.Active && (posLow.X > objPoint.X || objPoint.X > posHigh.X || posLow.Y > objPoint.Y || objPoint.Y > posHigh.Y))
{
toolTip.Active = false;
}
}
** 編集 **
受け入れられた回答によると、必要に応じてさらに改良したいと考えて、解決策として次のコードがあります。ただし、これは今のところ機能します (外部で宣言された bool である toolTipDisp を使用し、デフォルトで false に設定されています)。
private void mapBox1_MouseMove(GeoAPI.Geometries.Coordinate worldPos, MouseEventArgs imagePos)
{
PointF pos = mapBox1.PointToClient(Cursor.Position);
int screenToleranceX = 20, screenToleranceY = 20;
PointF posLow = new PointF(pos.X - screenToleranceX, pos.Y - screenToleranceY);
PointF posHigh = new PointF(pos.X + screenToleranceX, pos.Y + screenToleranceY);
GeoAPI.Geometries.Coordinate objLoc = new GeoAPI.Geometries.Coordinate(obj.longitude, obj.latitude);
PointF objPoint = mapBox1.Map.WorldToImage(objLoc);
if (posLow.X <= objPoint.X && objPoint.X <= posHigh.X && posLow.Y <= objPoint.Y && objPoint.Y <= posHigh.Y)
{
if (!toolTipDisp)
{
toolTip.Show(obj.Name, mapBox1, mapBox1.PointToClient(Cursor.Position));
toolTipDisp = true;
}
}
else
{
toolTip.Hide(mapBox1);
toolTipDisp = false;
}
}