Определение горячих точек карты в C#

Пример Отображение масштабируемой карты с горячими точками в C# использует список горячих точек, определенных следующим кодом.

// Горячие точки.
private List Hotspots = new List();
...
// Подготовьте карту для первого просмотра.
private void Form1_Load(object sender, EventArgs e)
{
    // Инициализация горячих точек.
    Hotspots.Add(new Rectangle(88, 509, 22, 22));
    Hotspots.Add(new Rectangle(140, 577, 20, 20));
    Hotspots.Add(new Rectangle(161, 609, 20, 20));
    ...
    Hotspots.Add(new Rectangle(1234, 1076, 16, 18));
    ...
}

Итак, как вы можете найти определения для горячих точек? Один из способов - тщательно измерить изображение карты и выяснить, где должны быть горячие точки, но эта программа обеспечивает более простой способ.

Программа включает меню данных, которое содержит элемент «Сделать точку доступа». Когда вы запускаете этот элемент, вы можете щелкнуть и перетащить, чтобы определить точку доступа. Затем программа записывает код, необходимый для определения этой точки доступа в окне вывода, как показано на рисунке выше. Затем вы можете скопировать и вставить этот код в программу для создания новых горячих точек.

Чтобы упростить использование программы в «нормальном» режиме, я устанавливаю для свойства Data menus Visible значение False во время разработки, поэтому вы обычно не видите это меню .

Как ни странно, даже если меню «Данные» скрыто, вы все равно можете получить доступ к элементу «Сделать точку доступа», нажав комбинацию клавиш Ctrl + H. Если вы хотите, чтобы элемент меню не использовался, хотя его не видно, вы можете установить его свойство Enabled в False. Или даже лучше, вы могли бы иметь обработчик события Load формы, который устанавливает свойство Enabled элемента меню, равное свойству Visible в меню Data.

Следующий код выполняется, когда вы выбираете команду «Сделать Hotspot» меню «Данные».

// Отображение определения точки доступа в окне вывода.
private void mnuMakeHotspot_Click(object sender, EventArgs e)
{
    picMap.MouseMove -= picMap_MouseMove;
    picMap.MouseClick -= picMap_MouseClick;
    picMap.MouseDown += makeHotspot_MouseDown;
    picMap.Cursor = Cursors.Cross;
}

Этот код готовит программу для создания точки доступа. Сначала он удаляет обработчики событий MouseMove и MouseClick, которые обычно имеют дело с перемещением пользователя и нажатием на горячую точку. Затем он устанавливает новый обработчик событий MouseDown, чтобы начать создание точки доступа. Он также изменяет курсор управления PictureBox на перекрестье.

В следующем коде показан новый обработчик событий, который выполняется, когда пользователь нажимает на мышь.

// Начнем определять точку доступа.
private Point HotspotStart, HotspotEnd;
private Bitmap HotspotBm;
private Graphics HotspotGr;
private void makeHotspot_MouseDown(object sender, MouseEventArgs e)
{
    HotspotStart = e.Location;
    picMap.MouseDown -= makeHotspot_MouseDown;
    picMap.MouseMove += makeHotspot_MouseMove;
    picMap.MouseUp += makeHotspot_MouseUp;

    // Приготовьтесь рисовать прямоугольник выделения.
    HotspotBm = (Bitmap)Map.Clone();
    HotspotGr = Graphics.FromImage(HotspotBm);
    picMap.Image = HotspotBm;
}

Этот код сохраняет начальное местоположение мыши в переменной HotspotStart. Он удаляет обработчик событий MouseDown и устанавливает обработчики событий MouseMove и MouseUp. Он заканчивается созданием временной копии исходного изображения, создавая объект Graphics, связанный с изображением, и отображающий изображение.

Когда пользователь перемещает мышь, выполняется следующий код.

// Нарисуем прямоугольник выделения.
private void makeHotspot_MouseMove(object sender, MouseEventArgs e)
{
    // Сохраним новую точку.
    HotspotEnd = e.Location;

    // Нарисуем прямоугольник выделения.
    HotspotGr.DrawImage(Map, 0, 0);
    float x = Math.Min(HotspotStart.X, HotspotEnd.X) * MapScale;
    float y = Math.Min(HotspotStart.Y, HotspotEnd.Y) * MapScale;
    float wid = Math.Abs(HotspotStart.X - HotspotEnd.X) * MapScale;
    float hgt = Math.Abs(HotspotStart.Y - HotspotEnd.Y) * MapScale;
    using (Pen thin_pen = new Pen(Color.Red, 1 * MapScale))
    {
        thin_pen.DashStyle = DashStyle.Dash;
        HotspotGr.DrawRectangle(thin_pen, x, y, wid, hgt);
    }

    picMap.Refresh();
}

Этот код сохраняет новое местоположение мыши в переменной HotspotEnd. Затем он копирует исходную карту на временное изображение и рисует прямоугольник, чтобы отобразить выбранную область.

Следующий код выполняется, когда пользователь освобождает мышь.

// Закончить определение точки доступа.
private void makeHotspot_MouseUp(object sender, MouseEventArgs e)
{
    // Закончить режим определения точки доступа.
    picMap.MouseMove -= makeHotspot_MouseMove;
    picMap.MouseUp -= makeHotspot_MouseUp;
    picMap.MouseMove += picMap_MouseMove;
    picMap.MouseClick += picMap_MouseClick;
    picMap.Image = Map;
    picMap.Cursor = Cursors.Default;
    picMap.Refresh();

    // Отображение определения точки доступа.
    float x = Math.Min(HotspotStart.X, HotspotEnd.X) * MapScale;
    float y = Math.Min(HotspotStart.Y, HotspotEnd.Y) * MapScale;
    float wid = Math.Abs(HotspotStart.X - HotspotEnd.X) * MapScale;
    float hgt = Math.Abs(HotspotStart.Y - HotspotEnd.Y) * MapScale;
    Console.WriteLine(
        "    Hotspots.Add(new Rectangle({0}, {1}, {2}, {3}));",
        (int)x, (int)y, (int)wid, (int)hgt);
}

Этот код удаляет обработчики событий hotspot MouseMove и MouseUp и переустанавливает исходные обработчики событий MouseMove и MouseClick , Он сбрасывает изображение карты и курсор и повторно отображает карту.

Код заканчивается отображением кода, необходимого для создания этой точки доступа в окне вывода.

Источник: http://csharphelper.com/blog/2016/07/define-map-hotspots-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector