Определение горячих точек карты в C#
Пример использует список горячих точек, определенных следующим кодом.
// Горячие точки. private ListHotspots = 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 , Он сбрасывает изображение карты и курсор и повторно отображает карту.
Код заканчивается отображением кода, необходимого для создания этой точки доступа в окне вывода.
