Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292

Изображение мигает

04.02.2013, 14:05. Показов 2821. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Выкладываю код своей программы. С её помощью предполагается строить блок схемы. Я сделала вывод изображения (блока) по нажатию кнопки мыши. Для добавления изображения используется флаг a. Кроме этого я попыталась сделать возможность "перетаскивания" этих самых блоков. И вот по поводу этого хотела спросить, можно ли реализовать это более аккуратно и правильно. И при перетаскивании объектов моим способом изображение мигает очень сильно, как сделать чтобы этого мигания не было? Сомнения возникают и по поводу перерисовки. Посмотрите пожалуйста, посоветуйте
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace card
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Paint += new PaintEventHandler(pictureBox1_Paint);
        }
        System.Drawing.Graphics drawG;
        int a = 0;
        List<Vertex> maps_mas = new List<Vertex>();
        Vertex select_vertex = new Vertex();
        int sel_vert = -1;
        private void Form1_Load(object sender, EventArgs e)
        {
           
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (a == 1)
            {
                Vertex A = new Vertex();
                Name n = new Name();
                Point first = new Point();
                first.X = e.X;
                first.Y = e.Y;
                n.ShowDialog();
                A.Name = n.res;//нужно в диалоговом окне сделать проверку на уже существующее такое имя
                A.Text = "";
                if (A.Name != "")
                {
                    add_koncept(first, A.Name);
                    A.point1 = first;
                    maps_mas.Add(A);
                }
            }
            else if (a == 0)//если ничего не выбрано, значит можно таскать объекты
            {
                //находим выбрана ли какая-то вершина
                //для этого нужно найти диапазон координат, которым принадлежит вершина
               sel_vert = find_vertex(e.X, e.Y);
            }
        }
 
        void add_koncept(Point a,String name)
        {
            drawG = pictureBox1.CreateGraphics();
            Image konc = Image.FromFile("koncept.png");
            RectangleF rect = new RectangleF(a.X, a.Y, 150, 100);
            drawG.DrawImage(konc, rect);
            add_text(a, name);
        }
 
        int find_vertex(int x, int y)//ищем относятся ли выбранные координаты к какой-нибудь вершине
        {
            for (int i = 0; i < maps_mas.Count; i++)
            {
                if ((maps_mas[i].point1.X < x) && (maps_mas[i].point1.Y < y)
                    && (maps_mas[i].point1.Y + 100 > y ) && (maps_mas[i].point1.X + 150 > x ))
                    return i;
            }
            return -1;
        }
 
        void add_text(Point a, string name)
        {
            Point x_y_text = new Point(a.X + 15, a.Y + 18);
            string[] text_name = new string[12];
            for (int i = 0, j = 0; i < name.Length; i++)
            {
                text_name[j] += name[i];
                if (text_name[j].Length > 16) { j++;}
            }
            for (int i = 0; i < 12; i++)
            {
                drawG.DrawString(text_name[i], new Font("Monofur", 10), Brushes.White, x_y_text);
                x_y_text.Y += 10;
            }
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            for (int i = 0; i < maps_mas.Count; i++)
            {
                add_koncept(maps_mas[i].point1, maps_mas[i].Name);
            }
        }
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (sel_vert != -1)
            {
                Point a = new Point();
                a.X = e.X;
                a.Y = e.Y;
                maps_mas[sel_vert].point1 = a;
                pictureBox1.Invalidate();
            }
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            sel_vert = -1;
            for (int i = 0; i < maps_mas.Count; i++)
            {
                add_koncept(maps_mas[i].point1, maps_mas[i].Name);
            }
        }
 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2013, 14:05
Ответы с готовыми решениями:

Можно ли задать какое-нибудь дефолтное изображение, если не найдено изображение по ключу?
Проблема: listView1.Items.ImageKey = NameKey; Если нет картинки с соответствующим ключем, то элемент остаётся без картинки. ...

Почему изображение с альфа каналом не наслаивается на изображение?
Собственно в моей программе взрыв должен происходить над машиной. Но вот незадача: почему взрыв не &quot;наслаивается&quot; на картинку,...

Мигает курсор в TextBox-ах
Помогите решить проблему! При нажатии на TextBox-ы курсор начинает мигать. Даже если проект совершенно новый. Свойства в этот момент не...

9
 Аватар для MrGladus
178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
04.02.2013, 14:59
Может дело в двойной буферизации? Посмотрите включена ли она.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.02.2013, 15:30
считаю что всё дело в событии PictureBox1.MouseMove.
На мой взгляд событие наикривейше обработано в самом контроле, т.к. проведя мышой от одного края pictureBox'a, размером 70х70, к другому, событие будет вызвано около 400 раз. Если обратить внимание на то, что по времени сие действие займёт меньше секунды, а в обработчике события есть функция перерисовки (Invalidate), то становится понятно откуда мерцание.
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
04.02.2013, 15:46  [ТС]
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
считаю что всё дело в событии PictureBox1.MouseMove.
На мой взгляд событие наикривейше обработано в самом контроле, т.к. проведя мышой от одного края pictureBox'a, размером 70х70, к другому, событие будет вызвано около 400 раз. Если обратить внимание на то, что по времени сие действие займёт меньше секунды, а в обработчике события есть функция перерисовки (Invalidate), то становится понятно откуда мерцание.
получается проблема в многократном вызове этой функции? но как же тогда мне отображать плавное перемещение объекта?
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.02.2013, 16:17
хм... счас попробую придумать что-либо...

Добавлено через 11 минут
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
 
namespace WinFormTest
{
    public struct IconInfo
    {
        public bool fIcon;
        public int xHotspot;
        public int yHotspot;
        public IntPtr hbmMask;
        public IntPtr hbmColor;
    }
 
    public partial class CursorAPI : Form
    {
        public CursorAPI()
        {
            InitializeComponent();
            this.Text = "Cursor Test";    
        }
 
        [DllImport("user32.dll")]
        public static extern IntPtr CreateIconIndirect(ref IconInfo icon);
 
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
 
        public static System.Windows.Forms.Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
        {
            IconInfo tmp = new IconInfo();
            GetIconInfo(bmp.GetHicon(), ref tmp);
            tmp.xHotspot = xHotSpot;
            tmp.yHotspot = yHotSpot;
            tmp.fIcon = false;
            return new System.Windows.Forms.Cursor(CreateIconIndirect(ref tmp));
        }
 
        bool StartDragged = false;
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                StartDragged = true;
 
                Bitmap bitmap = new Bitmap(pictureBox1.Image);
                System.Windows.Forms.Cursor a = CreateCursor(bitmap, 3, 3);
                this.Cursor = a;
 
                bitmap.Dispose();
            }
        }
 
        private void CursorAPI_MouseClick(object sender, MouseEventArgs e)
        {
            if (StartDragged)
            {
                pictureBox1.Location = new Point(e.X, e.Y);
                this.Cursor = Cursors.Default;
                StartDragged = false;
            }
        }
    }
}
CursorAPI - название класса формы.
правый клик по изображению - выставляется флаг начала перетаскивания, курсор принимает вид картинки.
левый клик по форме - если выставлен флаг, сменяются координаты картинки, курсор принимает стандартный вид.

Добавлено через 53 секунды
а вообще наверняка можно стандартные события Drag&Drop обработать, вот только с ними у меня опыта нет)
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
04.02.2013, 16:27  [ТС]
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
хм... счас попробую придумать что-либо...
CursorAPI - название класса формы.
правый клик по изображению - выставляется флаг начала перетаскивания, курсор принимает вид картинки.
левый клик по форме - если выставлен флаг, сменяются координаты картинки, курсор принимает стандартный вид.

а вообще наверняка можно стандартные события Drag&Drop обработать, вот только с ними у меня опыта нет)
спасибо большое за идею, но необходимо реализовать перетаскивание именно с зажатой кнопкой мыши. И изменение курсоров у меня уже используется для обозначения режима добавления вершины, удаления и добавления ребра.

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

Добавлено через 3 минуты
кажется собака зарыта в методе OnPaint http://msdn.microsoft.com/ru-r... s.90).aspx
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.02.2013, 16:49
хм... если так необходима зажатость мыши - то тоже всё просто, меняются Click на Down/Up, и практически готово.
Другое дело, если при этом необходимо чтобы курсор тоже был видимый, с этим тож пока не разбирался.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        bool StartDragged = false;
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            StartDragged = true;
 
            Bitmap bitmap = new Bitmap(pictureBox1.Image);
            System.Windows.Forms.Cursor a = CreateCursor(bitmap, 3, 3);
            pictureBox1.Visible = false;
            this.Cursor = a;
 
            bitmap.Dispose();
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (StartDragged)
            {
                pictureBox1.Location = new Point(e.X + pictureBox1.Location.X, e.Y + pictureBox1.Location.Y);
                pictureBox1.Visible = true;
                this.Cursor = Cursors.Default;
                StartDragged = false;
            }
        }
Добавлено через 3 минуты
хм... или в примере на мсдн чуть не то, или я совсем не понял поставленной задачи. В последнем случае вынужден извинится). Предполагал что необходимо перетаскивать уже готовые "картинки".
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
04.02.2013, 17:53  [ТС]
разобралась)
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
04.02.2013, 18:04
на все 100 не уверен, но вроде это из-за того, что вы считываете и отображаете изображение - эта операция более ресурсоемкая чем просто прорисовка графических примитивов
0
9 / 9 / 5
Регистрация: 10.05.2012
Сообщений: 292
04.02.2013, 18:26  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
на все 100 не уверен, но вроде это из-за того, что вы считываете и отображаете изображение - эта операция более ресурсоемкая чем просто прорисовка графических примитивов
нет, ошибка была здесь
Code
1
drawG = pictureBox1.CreateGraphics();
как я и предполагала, я просто не до конца поняла принципы работы с рисованием
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2013, 18:26
Помогаю со студенческими работами здесь

Мигает форма когда запускается приложение
Посмотрите пожалуйста, что я наделал, не могу исправить, мигает форма когда запускается рпиложение

2D графика. Все очень медленно мигает.
Вопрос по 2Д графике. Собственно, приходится рисовать прямо на канве панели. Линии, прямоугольники... все мигает, очень медленно :( В яве...

Мигает текст в панели. Как задействовать DoubleBuffered
День добрый. я работаю с биржевыми данными. подключаюсь к серверу. сервер выдает цену акции в заданном диапазоне, от и до. для этого я...

Наложить изображение на изображение
Добрый день:) В C# вообще не силен, но тут понадобилось именно на нем решить одну простую задачу. Подскажите код наложения одного...

Мигает картинка, поставленная как BackGroundImage при изменении размера формы
Поставила на 1 страницу TabControl картинку как BackGroundImage. Своиство BackgroundImageLayout выбрала strech. При запуске (при запуске ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru