2015-04-10 1 views
0

Мне нужно создать приложение формы Windows C# с одним изображением в фоновом режиме. Нажатие на 10 различных частей изображения приведет к различным событиям/действиям. Как вы можете сделать разные части изображения кликабельными?Создайте различные элементы для кликов на одном изображении фона в C#

Спасибо!

+0

Вы можете добавить 10 пустых элементов ** PictureBox **, изменить размер и поместить их туда, где хотите, установить курсор на ** Ручной **, а затем назначить события каждый из элементов управления. –

+0

Я не думаю, что добавление 10 элементов управления в форму - хорошая идея. Взгляните на это, чтобы понять, куда идти. http://stackoverflow.com/questions/21286617/creating-clickable-c-sharp-image-map-in-winforms – Yatrix

+0

_Clicking на 10 различных частях .._ Какие «части» вы хотите? прямоугольники или фигуры или цветные области .. ?? Есть много способов сделать это, но найти лучший, который нам нужно знать больше! – TaW

ответ

0

Для этого вам необходимо иметь на картинке холсты. сделать фиксированные размеры холстов, присоедините события на нем

+0

OP нуждается в приложении WinForms, а не в WPF. –

+0

, или она может использовать прямоугольник или как пользовательский фотоаппарат ...во всяком случае какой-то контроль должен быть там – Apoorv

1

В простейшем случае все, что вам урожденная нужно сделать, это создать

List<Rectangle> rects = new List<Rectangle>(); 

Заполните их с координатами:

rects.Add(new Rectangle(11,22,55,55)); 
    rects.Add(new Rectangle(66,22,55,55)); 
    //.. 

И проверить в MouseClick event:

private void Form1_MouseClick(object sender, MouseEventArgs e) 
{ 
    foreach (Rectangle r in rects) 
     if (r.Contains(e.Location)) 
     { 
      // do things here 
      Console.WriteLine("You have hit Rectangle no.: " + rects.IndexOf(r)); 
     } 
} 

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

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

Обновление : Для изображения размещено самое простое решение - создать Список и проверить его:

List<Color> colors = new List<Color>(); 

Добавьте цвета:

colors.Add(Color.Brown); 
//.. 


private void Form1_MouseClick(object sender, MouseEventArgs e) 
{ 

    Color cHit = ((Bitmap)this.BackgroundImage).GetPixel(e.X, e.Y); 
    foreach (Color c in colors) 
     if (cHit .ToArgb() == c.ToArgb()) 
     { 
      // do things here 
      Console.WriteLine("You have hit Rectangle no.: " + colors .IndexOf(c) + " with Color " + cHit.ToString()); 
     } 

Очевидно, что это будет работать, только если список цветов имеет же цвета как изображения! Легко, если вы сами создаете изображение; иначе вам нужно будет позаботиться о создании списка правильно!

Примечание: Если вы используете Form.BackgroundImage убедитесь, чтобы установить BackgroundImageLayout в None или иначе координаты мыши не совпадают пикселей в изображении! Если вы хотите Center, вам нужно рассчитать смещения! Использование Panel или PictureBox гораздо более гибкое.

+0

Что делать, если вы не знаете координаты ящиков? Есть ли способ захватить щелчок мышью «MouseEventArgs e», чтобы определить строку и столбец каждого из прямоугольников в фоновом изображении? –

+0

Вы имеете в виду, что они __in__ изображение? если у них действительно четкие цвета, вы можете использовать aproach для чтения своих цветов с помощью цвета c = ((Bitmap) PictureBox.Image) .GetPixel (e.X, .Y); – TaW

+0

Да, цветные поля находятся на изображении. Итак, если вы использовали подход для чтения цвета, читаете ли вы цвет в событие щелчка мыши для формы? –