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

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

29.11.2021, 06:47. Показов 860. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru