Пусть пользователь перетаскивает изображение с прозрачными пикселями поверх фонового изображения в C#
В этом примере показано, как вы можете позволить пользователю перетащить изображение на PictureBox. Свойству PictureBox Изображение задано фоновое изображение. Пользователь может нажать на мышь на любом из непрозрачных пикселей изображения, чтобы перетащить изображение.
При запуске программа использует следующий код, чтобы подготовиться к перетаскиванию изображения.
// Изображение смайлика. private Bitmap Smiley; // Местоположение изображения смайликов. private Rectangle SmileyLocation; private void Form1_Load(object sender, EventArgs e) { // Сделайте белые пиксели в смайлике прозрачными. Smiley = new Bitmap(Properties.Resources.smile); Smiley.MakeTransparent(Color.White); // Установите начальное местоположение смайлика. SmileyLocation = new Rectangle(10, 10, Smiley.Width, Smiley.Height); }
Программа сначала получает изображение из ресурса smile и использует его для создания Bitmap. Он использует Bitmap 'MakeTransparent, чтобы сделать белые пиксели изображения прозрачными.
Программа сохраняет местоположение изображения в Rectangle с именем SmileyLocation. После загрузки изображения смайлирования программа инициализирует SmileyLocation в позицию (10, 10).
В следующем коде показан обработчик событий PictureBox Paint.
// Нарисуем изображение над фоном. private void picBackground_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(Smiley, SmileyLocation); }
Этот код просто рисует изображение над фоном.
Когда пользователь нажимает кнопку мыши на PictureBox, следующий код начинает перетаскивать смайлик.
// Истина при перетаскивании. private bool Dragging = false; // Смещение от нижнего положения мыши // и верхний левый угол изображения. private int OffsetX, OffsetY; // Начните перетаскивание изображения. private void picBackground_MouseDown( object sender, MouseEventArgs e) { // Смотрите, если мы закончили картину. if (PointIsOverPicture(e.X, e.Y)) { // Запустите перетаскивание. Dragging = true; // Сохранение смещения от мыши до начала изображения. OffsetX = SmileyLocation.X - e.X; OffsetY = SmileyLocation.Y - e.Y; } }
Переменная Перетаскивание записывает, переносит ли программа в настоящее время смайлик. Переменные OffsetX и OffsetY записывают расстояние между верхним левым углом изображения смайликов и местоположением мыши.
Обработчик события MouseDown вызывает метод PointIsOverPicture, описанный ниже, чтобы увидеть, находится ли мышь над непрозрачным пикселем в изображении смайликов. Если это над пикселем, программа устанавливает Dragging = true и сохраняет разницу между местоположением изображения смайликов и положением мыши.
При перемещении мыши следующий обработчик события MouseMove продолжает перетаскивание.
// Продолжайте перетаскивать изображение. private void picBackground_MouseMove( object sender, MouseEventArgs e) { // Посмотрим, перетаскиваем ли мы. if (Dragging) { // Мы перетаскиваем изображение. Подвинь это. SmileyLocation.X = e.X + OffsetX; SmileyLocation.Y = e.Y + OffsetY; // Перерисовать. picBackground.Invalidate(); } else { // Мы не перетаскиваем изображение. Смотрите, если мы закончим. Cursor new_cursor = Cursors.Default; if (PointIsOverPicture(e.X, e.Y)) { new_cursor = Cursors.Hand; } if (picBackground.Cursor != new_cursor) picBackground.Cursor = new_cursor; } }
// Продолжайте перетаскивать изображение. private void picBackground_MouseMove ( объект отправителя, MouseEventArgs e) { // Посмотрим, перетаскиваем ли мы. if (Перетаскивание) { // Мы перетаскиваем изображение. Подвинь это. SmileyLocation.X = e.X + OffsetX; SmileyLocation.Y = e.Y + OffsetY; // Перерисовать. picBackground.Invalidate (); } еще { // Мы не перетаскиваем изображение. Смотрите, если мы закончим. Курсор new_cursor = Cursors.Default; if (PointIsOverPicture (e.X, e.Y)) { new_cursor = Cursors.Hand; } if (picBackground.Cursor! = new_cursor) picBackground.Cursor = new_cursor; } }
...
Если Перетаскивание является ложным, код вызывает метод PointIsOverPicture, чтобы увидеть, находится ли мышь над непрозрачным пикселом. Если это так, программа отображает курсор Hand. В противном случае он отображает курсор по умолчанию.
Когда пользователь отпускает мышь, следующий код заканчивает перетаскивание.
// Остановить перетаскивание изображения. private void picBackground_MouseUp( object sender, MouseEventArgs e) { Dragging = false; }
Следующий код показывает метод PointIsOverPicture, который возвращает true, если указанная позиция находится над непрозрачным пикселем на изображении смайликов.
// Возвращает true, если точка находится над текущим местоположением изображения. private bool PointIsOverPicture(int x, int y) { // Посмотрим, находится ли он над ограничивающим прямоугольником изображения. if ((x < SmileyLocation.Left) || (x >= SmileyLocation.Right) || (y < SmileyLocation.Top) || (y >= SmileyLocation.Bottom)) return false; // Посмотрим, находится ли точка над непрозрачным пикселем. int i = x - SmileyLocation.X; int j = y - SmileyLocation.Y; return (Smiley.GetPixel(i, j).A > 0); }
Сначала код определяет, находится ли точка над ограничивающим прямоугольником изображения смайлика. Если это не так, метод возвращает false.