Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
 Аватар для vladvsalat
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 14

Перемещение изображения в PictureBox

15.04.2015, 10:19. Показов 4430. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

- Имеется джостик подключенный к ПК через COMPort;
- В программе форма с PictureBox с нарисованными осями Ох и Оу;
- В центре (0 ; 0) изображение красного квадратика;
- Что бы джостик начал передавать сигнал, необходимо нажать на нем кнопку, а затем двигать. Сигнал передается в 8-ой системе.
- Код нажатия - 61, отжатия - 361. При направлении джостика по оси Ох он передает сигналы: от 0 до 15 - 200-215, от -1 до -15 - 221-235. По оси Оу: от 0 до 15 - 240-255, от -1 до -15 - 261-275.

Как сделать, что бы при нажатии кнопки на джостике и движении его в произвольные стороны, квадратик в PictureBox повторял его движения?


C#
1
2
3
4
5
6
7
8
9
10
11
// метод конвертирующий массив byte в строку
        public string ByteToOct(byte[] comByte)
        {
            //создаем новый объект StringBuilder
            StringBuilder builder = new StringBuilder(comByte.Length * 3);
            foreach (byte data in comByte)
                //конвертируем byte в string и добавляем stringbuilder
                builder.Append(Convert.ToString(data, 8));
            //возвращаем конвертируемое значение
            return builder.ToString().ToUpper();
        }
Когда данные поступают с джостика, принимаем мы их здесь:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //получить количество данных в буфере
            int bytes = comPort.BytesToRead;
            //создаем массив byte для хранения входящих данных
            byte[] comBuffer = new byte[bytes];
            //считываем данные и храним их
            comPort.Read(comBuffer, 0, bytes);
            switch (ByteToOct(comBuffer))
            {
                case "200":                                        //попытки нарисовать кружок
                    gr.DrawEllipse(p, 370, 210, 20, 20);   //при поступлении сигнала
                    gr.FillEllipse(s, 370, 210, 20, 20);     //
                    pictureBox1.Image = bit;                 //             
                    Thread.Sleep(100);
                break;
            }
        }
Хотя бы просто примерно, как написать код, чтобы нарисованный кружок или квадратик или не важно что, двигалось по осям 0х и 0у синхронно с джостиком!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2015, 10:19
Ответы с готовыми решениями:

Как задать плавное перемещение картинки в PictureBox (или перемещение самого PictureBox) из точки А в точку Б по прямой?
Необходимо задать плавное перемещение по прямой линии из "А" в "Б" по нажатию "Button"

Склеивание изображения нескольких picturebox в один picturebox
Здравствуй, такой вопрос возник на счет picturebox. Можно ли из 3-ех к примеру picturebox(в каждом одинаковая картинка) Склеить все...

Как добиться качественного рисования изображения поверх изображения picturebox?
есть код: PictureBox p = (PictureBox)sender; p.SizeMode = PictureBoxSizeMode.Normal; ...

1
 Аватар для vladvsalat
0 / 0 / 1
Регистрация: 01.04.2014
Сообщений: 14
24.04.2015, 11:05  [ТС]
В общем то сам и разобрался. Но вдруг кому понадобиться, вот что у меня получилось (на истину в первой инстанции не претендую, потому что с программированием у меня все довольно таки коряво, но то что я написал меня устраивает).

Итак:
Объявляем переменные
C#
1
2
3
4
5
Bitmap bit;
        Graphics gr;
        Pen p;
        SolidBrush s;
        int x, y, posx, posy
Рисуем кружок и оси
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void DrawEllipse(Graphics gr, Pen p)
        {
            gr.DrawEllipse(p, x, y, 20, 20);
            gr.FillEllipse(s, x, y, 20, 20);
        }
        //рисуем ось 0х
        private void DrawOx(Graphics gr, Pen p)
        {
            Point point1 = new Point(0, 310);
            Point point2 = new Point(620, 310);
            gr.DrawLine(p, point1, point2);
        }
        //рисуем ось 0у
        private void DrawOy(Graphics gr, Pen p)
        {
            Point point1 = new Point(310, 0);
            Point point2 = new Point(310, 620);
            gr.DrawLine(p, point1, point2);
        }
инициализируем
C#
1
2
3
4
5
6
7
8
9
public mup()
        {
            InitializeComponent();
 
            bit = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            gr = Graphics.FromImage(bit);
            p = new Pen(Color.Black, 1);
            s = new SolidBrush(Color.Red);
        }
Когда форма открылась
C#
1
2
3
4
5
6
7
8
private void mup_Load(object sender, EventArgs e)
        {
            OpenPort();               //открываем порт
            DrawOx(gr, p);
            DrawOy(gr, p);
            pictureBox1.Image = bit;
            comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
        }
Когда получили данные из COM-порта
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //получить количество данных в буфере
            int bytes = comPort.BytesToRead;
            //создаем массив byte для хранения входящих данных
            byte[] comBuffer = new byte[bytes];
            //считываем данные и храним их
            comPort.Read(comBuffer, 0, bytes);
            string s = ByteToOct(comBuffer);
            int coord = Convert.ToInt32(s);
 
            if (coord == 61)
            {
                posx = 300;
                posy = 300;
            }
 
            if (coord == 361)
            {
                posx = 300;
                posy = 300;
            }
 
            if ((coord >= 200) && (coord <= 217))
            {
                posy = (340 - (coord - 200) * 20);
            }
            if ((coord >= 221) && (coord <= 237))
            {
                posy = (280 + (coord - 221) * 20);
            }
 
            if ((coord >= 240) && (coord <= 257))
            {
                posx = (260 + (coord - 240) * 20);
            }
            if ((coord >= 261) && (coord <= 277))
            {
                posx = (320 - (coord - 261) * 20);
            }
 
            y = posy;
            x = posx;
            gr.Clear(Color.Transparent);
            DrawOx(gr, p);
            DrawOy(gr, p);
            DrawEllipse(gr, p);
            pictureBox1.Image = bit;
        }
В итоге получилось то что нужно, при нажатии на кнопку и движении джойстика, нарисованные кружочек двигается по осям в PictureBox.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2015, 11:05
Помогаю со студенческими работами здесь

Перемещение PictureBox ов
Привет. Я в интернете нашел функцию, которая передвигает PictureBox'ы по форме, не выходя за ее границы. В чем собственно вся проблема? В...

Перемещение фигур в PictureBox
Помогите, пожалуйста. Никак не могу сделать выделение фигур с последующим их перемещением по PicterBox

Перемещение объектов по picturebox
Привет, подскажите пожалуйста как можно это сделать. У меня есть поле picturebox и есть массив точек с координатами. Я создаю точки...

Перемещение мышкой PictureBox'а по форме
Подскажите как мне сделать,чтобы в процессе компиляции я мог при нажатии на Pickturebox перемещать ее по форме?

Перемещение PictureBox внутри TableLayoutPanel
Есть TableLayoutPanel разбитая на шесть равных строк и столбцов. В случайной позиции должен появляться PictureBox, которым можно управлять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru