Форум программистов, компьютерный форум CyberForum.ru

Перемещение элемента - C++

Восстановить пароль Регистрация
 
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
28.10.2013, 14:05     Перемещение элемента #1
Подскажите, пожалуйста, с помощью каких функций можно задать перемещение (по кругу например) нарисованного элемента в picturebox?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
28.10.2013, 14:18     Перемещение элемента #2
Я так полагаю, что в элементе есть таки параметры, как его координаты (х,y). Меняя их - сможете двигать объект. По кругу - нужна математическая формула круга. Желательно в параметрическом виде. Тогда запросто сможете вычислять новые координаты.
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
28.10.2013, 15:13  [ТС]     Перемещение элемента #3
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Я так полагаю, что в элементе есть таки параметры, как его координаты (х,y). Меняя их - сможете двигать объект. По кругу - нужна математическая формула круга. Желательно в параметрическом виде. Тогда запросто сможете вычислять новые координаты.
Я тоже так думаю, просто не знаю эффективен ли будет алгоритм: в цикле рисовать и стирать эллипс, может есть какой-то более красивый метод?

Добавлено через 19 минут
и можно ли ещё как-нибудь затормозить движение объекта, если делать в цикле?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
28.10.2013, 15:14     Перемещение элемента #4
если picturebox - это окно,
то перемещать его можно функцией MoveWindow(...)
А моменты перемещения отлавливать с помощью сообщения WM_TIMER.
Так делается в Win32 API.
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
28.10.2013, 16:11  [ТС]     Перемещение элемента #5
Цитата Сообщение от zss Посмотреть сообщение
если picturebox - это окно,
то перемещать его можно функцией MoveWindow(...)
А моменты перемещения отлавливать с помощью сообщения WM_TIMER.
Так делается в Win32 API.
надо перемещать не picturebox, а объект в нём, например круг

Добавлено через 10 минут
В принципе, разобралась. Сделала с помощью рисования и стирания в цикле + Sleep(). Пришлось сделать отдельную кнопку для рисования, потому что если делать на кнопку с расчетами, то расчеты выводятся только после окончания рисования.
Может кто скажет ещё что-нибудь дельное по этому поводу?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
28.10.2013, 16:20     Перемещение элемента #6
Цитата Сообщение от TyLinka Посмотреть сообщение
надо перемещать не picturebox, а объект в нём, например круг
Тогда, то WM_TIMER пересчитываем новое положение объекта и подаем команду на перерисовку
InvalidateRect(..).
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
int x=0; // координата, где рисовать
int WINAPI fn(HWND hwnd,int cmd,WPARAM wp,LPARAM lp)
{
    switch(cmd)
    {
 
    case WM_INITDIALOG:
        x=0;
        SetTimer(hwnd,1,100,NULL); // запуск таймера при открытии диалогового окна 
        return 1;
    case WM_TIMER:
        x++;                      // пересчет координаты, где рисовать
        InvalidateRect(hwnd,NULL,TRUE); // команда на перерисовку
        return 1;
    case WM_CLOSE:
        EndDialog(hwnd,3); // закрытие диалога
        return 1;
    case WM_SIZE:
        InvalidateRect(hwnd,NULL,TRUE); // перерисовка при изменении окна
        return 1;
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        RECT rt;
        GetClientRect(hwnd, &rt);
        int w=rt.right;int h=rt.bottom;// длина и высота рабочей области
                
                
        HBRUSH b1,b2,b0;
        b1=CreateSolidBrush(RGB(255,255,255)); // белая кисть 1 круга
        b2=CreateSolidBrush(RGB(255,0,0)); // красная кисть 2 круга
                
        b0=(HBRUSH)SelectObject(hdc,b1);
        const int R=50;
        Ellipse(hdc,w/2-R,h/2-R,w/2+R,h/2+R);
 
        SelectObject(hdc,b2);
        Ellipse(hdcscr,x,h/2-R,x+2*R,h/2+R); 
        SelectObject(hdc,b0);
        DeleteDC(hdcscr);
        DeleteObject(b1);
        DeleteObject(b2);
                
        EndPaint(hwnd, &ps);
        return 1;
    }
    return 0;
        }
}
int WINAPI WinMain(HINSTANCE hi,HINSTANCE,LPSTR,int) 
{
    return DialogBox(hi,"SIMPLE",NULL,(DLGPROC)fn);
}
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
28.10.2013, 17:12  [ТС]     Перемещение элемента #7
вообще я делала всё в windows forms c++
этот код подойдет для неё?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
28.10.2013, 17:28     Перемещение элемента #8
Там что-то похожее, но я windows form никогда не пользовался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 17:58     Перемещение элемента
Еще ссылки по теме:

C++ Получить новую матрицу путем вычитания из каждого элемента данной матрицы ее наименьшего элемента
Формирования массивов Y и Z, определения максимального по модулю элемента, удаления элемента C++
Сделать добавление элемента в массив и удаление элемента из массива используя STL C++

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

Или воспользуйтесь поиском по форуму:
TyLinka
32 / 32 / 11
Регистрация: 02.02.2012
Сообщений: 177
28.10.2013, 17:58  [ТС]     Перемещение элемента #9
ясно, спасибо
Yandex
Объявления
28.10.2013, 17:58     Перемещение элемента
Ответ Создать тему
Опции темы

Текущее время: 16:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru