PictureBox — это класс, производный от Control, поэтому можно использовать множество событий, всплывающую подсказку, контекстное меню и прочие возможности элемента управления. Проиллюстрируем применение PictureBox на примере.
Создадим приложение, которое будет захватывать события MouseUp, MouseDown и MouseMove для области, занятой на форме изображением (которое помещено в PictureBox). Добавим код для работы с перетаскиванием (drag-and-drop). Пользователь сможет перетаскивать одно из изображений по всей форме. Кроме того, будем осуществлять проверку того, где оказалось перетаскиваемое изображение после того, как пользователь его отпустит. Если оно попало в область, занимаемую заданным прямоугольником, будет выводиться специальное сообщение. Таким образом, реализуем механизм, называемый «проверкой попадания» — hit testing.
Назначение объекту PictureBox изображения, которое будет в нем содержаться, выглядит следующим образом:
Свойство PictureBox, — SizeMode, для него используются значения из перечисления PictureBoxSizeMode. Это свойство позволяет определить, как именно будет выводиться изображение внутри PictureBox. В нашем случае было использовано значение StretchImage, которое означает, что изображение должно быть сжато или растянуто таким образом, чтобы полностью соответствовать размерам PictureBoх. Другие возможные значения представлены в таблице 5.8.
Таблица 5.8.Значения перечисления PictureBoxSizeMode
Значение | Описание |
AutoSize | Значения PictureBox будут изменены таким образом, чтобы полностью соответствовать размерам изображения |
CenterImage | Если размеры PictureBox будут больше, чем размеры изображения, изображение будет позиционировано точно по центру PictureBox, Если же размеры изображения будут превышать размеры PictureBox, то выступающие края будут обрезаны |
Normal | Изображение будет расположено в верхнем левом углу PictureBox. Если размеры изображения превысят размеры PictureBox, выступающие края будут обрезаны |
Выберите Choose Image для выбора изображения для отображения в PictureBox.
После того как создали PictureBox и настроили его свойства, следующая задача — обеспечить обработчики для событий MouseMove, MouseUp и MouseDown.
// Добавляем обработчики для следующих событий
pictureBox1.MouseDown +=new MouseEventHandler(pictureBox1_MouseDown);
pictureBox1.MouseUp +=new MouseEventHandler(pictureBox1_MouseUp);
pictureBox1.MouseMove +=new MouseEventHandler(pictureBox1_MouseMove);
this.Paint +=new PaintEventHandler(Form1_Paint);
В обработчике события MouseDown, во-первых, устанавливается значение true для переменной isDragging (началась операция перетаскивания), а во-вторых, фиксируются координаты указателя мыши при наступлении этого события:
// Обработчик события MouseDown для объекта PictureBox
private void pictureBox1_MouseDown(Object sender, MouseEventArgs e) {
isDragging = true;
oldX = e.X;
oldY = e.Y;
}
Обработчик события MouseMove обеспечивает перемещение PictureBox по форме (изменяя значения свойств Тор и Left). Для расчета нового положения PictureBox используется смещение указателя мыши относительно исходной позиции:
Если пользователь производит щелчок на изображении и, не отпуская кнопку, перемещает мышь. PictureBox вместе с изображением будет перерисовываться в новой месте
private void pictureBox1_MouseMove(Object sender, MouseEventArgs e) {
if(isDragging) {
// Определяем новые координаты для PictureBox по разности между
// старым и новым положением указателя мыши
pictureBox1.Top =pictureBox1.Top + (e.Y - oldY);
pictureBox1.Left = pictureBox1.Left + (e.X - oldX);
}
}
Далее обработчик события MouseUp должен установить значение переменной isDragging равным false — это признак окончания операции перетаскивания. Кроме того, по условиям задачи должна производиться проверка: если перемещаемый PictureBox отпущен внутри определенной области формы (ограниченной размерами объекта Rectangle), то пользователь добился успеха.
Таким образом, весь оставшийся необходимый код выглядит следующим образом:
private void pictureBox1_MouseUp(Object sender, MouseEventArgs e) {
Rectangle dropRect = new Rectangle(200, 100, 350, 250);
isDragging = false;