Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Как правильно реализовать перетаскивание графического объекта?

29.11.2021, 06:47. Показов 832. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На данный момент делаю так:

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
int mouseX = 0;
int mouseY = 0;
 
struct GLObject
{
    int x;
    int y;
 
    int width;
    int height;
 
    bool dragging;
};
 
GLObject test{ 20, 20, 240, 400, false };
 
 
// в хуке WH_GETMESSAGE
MSG* pMSG = reinterpret_cast<MSG*>(lParam);
 
switch (pMSG->message)
{
    case WM_LBUTTONDOWN:
    {
        if (mouseX >= test.x and mouseX <= test.x + test.width and
            mouseY >= test.y and mouseY <= test.y + test.height)
        {
            test.dragging = true;
        }
    }
 
    break;
 
    case WM_LBUTTONUP:
    {
        test.dragging = false;
    }
 
    break;
 
    case WM_MOUSEMOVE:
    {
        POINT position = pMSG->pt;
 
        if (ScreenToClient(pMSG->hwnd, &position))
        {
            mouseX = position.x;
            mouseY = position.y;
 
            if (test.dragging)
            {
                test.x = mouseX;
                test.y = mouseY;
            }
        }
    }
 
    break;
}
Это работает, однако мне хотелось бы чтобы таскалось от места где я зажал мышь. Сейчас же оно как только я начинаю перемещать мышь "примагничивает" левый верхний угол объекта (точку откуда начинает отрисовываться собственно объект) к позиции курсора. Как это правильно реализовать?

Добавлено через 19 минут
Добавил две переменные в которые при клике по объекту записывается разница между позицией курсора и позицией объекта, а в функции перемещения отнимаю от mouseX и от mouseY эту разницу. Таскается вроде бы как хотел, но я не уверен что это правильное решение. Жду ответов.

Добавлено через 14 минут
Без записи разницы при клике по объекту вроде-бы тот же эффект. Как правильнее? С записью разницы при клике, или же вот так?

C++
1
2
3
// в WM_MOUSEMOVE
test.x = mouseX - (mouseX - test.x);
test.y = mouseY - (mouseY - test.y);
(Здесь разница высчитывается при каждом движении мышью)

Добавлено через 5 минут
Похоже что все таки лучше записывать разницу при клике по объекту, а то эта фигня через раз работает..
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.11.2021, 06:47
Ответы с готовыми решениями:

Реализовать линейное перемещение и вращение вокруг какой-либо точки графического объекта
Здравствуйте, пожалуйста помогите с задачкой. Вот её содержание: Реализовать линейное перемещение и вращение вокруг какой-либо точки...

Как реализовать перетаскивание текста?
Технология &quot;Хватай и беги&quot; типа Drag and Drop Как реализовать перетаскивание части текста из одного текстбокса в другой?

Как реализовать перетаскивание файла в окно ?
Программа типа &quot;блокнот&quot; Как можно реализовать перетаскивание текстового файла и открытые его в блокноте ?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2021, 06:47
Помогаю со студенческими работами здесь

Как реализовать перетаскивание между формами?
При перетаскивании между элементами одной формы события работают..можно ли перетащить элемент из одной формы в другую?

Как сослаться на графический фрагмент графического объекта?
Мне нужно по ключевому полю искать в графике определенные фрагменты. Один из вариантов - формат jpg или html. Интуиция подсказывает нужно...

Как убрать мерцание для графического объекта?
Использую этот цикл. Мерцает. repeat Window.Clear(clblack); LockDrawing; X := System.Windows.Forms.Cursor.Position.X; ...

Создать проект, с использованием объекта Timer, перемещение графического объекта по заданной траектории, (прямоугольник,
Создать проект, с использованием объекта Timer, перемещение графического объекта по заданной траектории, (прямоугольник, квадрат или...

Как использовать данные VBO после удаления графического объекта?
Скажите, что можно сделать с данными VBO, которые уже не используются - т.е. если графический объект удален. Я знаю, можно их просто...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru