Определение горячих точек карты в 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 , Он сбрасывает изображение карты и курсор и повторно отображает карту.
Код заканчивается отображением кода, необходимого для создания этой точки доступа в окне вывода.