Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для Vlad_IT
1452 / 360 / 61
Регистрация: 03.04.2010
Сообщений: 2,096

Как заставить кнопку двигаться во время работы (MFC)?

17.08.2010, 02:03. Показов 2877. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как программно во время работы моей программы, при нажатии по какой-нибудь кнопке или циклом заставить кнопку или другой компонент переместить в определенных координатах? Короче как заставить кнопку двигаться во время работы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2010, 02:03
Ответы с готовыми решениями:

Как заставить кнопку двигаться самостоятельно
Написал button1_MouseEnter(object sender, EventArgs e)? где кнопка рандомно меняет координаты при наведении на нее мышкой, то есть как бы...

Работа в Paintbox. Заставить фигуру двигаться рандомно после нажатия на кнопку
Заставить фигуру двигаться рандомно после нажатия на кнопку. Фигура- круг. Помогите пожалуйста!

Заставить slider двигаться во время проигрывания видео в mediaElement
Добрый всем вечер. Подскажите пожалуйста, как можно заставить двигаться slider, во время проигрывания видео в mediaElement ?????

8
Рожденная для битвы
 Аватар для marina2
294 / 72 / 15
Регистрация: 08.11.2009
Сообщений: 1,272
17.08.2010, 07:14
Я над похожей темой рассуждаю, нашла код, но он у меня не работает. Может у тебя получится?

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
Листинг 2.3. Функция , заставляющая окно двигаться 
 
void DrawStartButton()
{
 int i;
 HANDLE h;
 int toppos=GetSystemMetrics(SM_CYSCREEN)-23;
 
 //Отображаем окно
 ShowWindow(hWnd, SW_SHOW);
 //Установить верхнюю позицию окна в левый нижний угол экрана.
 SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 50, 20, SWP_SHOWWINDOW);
 UpdateWindow(hWnd);
 //Создаем пустой указатель h, который будем использовать для задержки.
 h=CreateEvent(0, true, false, "et");
 
 // Сейчас будем поднимать кнопку
 // От 1 до 50 выполнять действия для изменения положения окна
 for (i=0; i<50; i++)
 {
        toppos=toppos-4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 50, 20,
         SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
 
 // Опускаем кнопку вниз 
 for (i=50; i>0; i--)
 {
        toppos=toppos+4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 50, 20,
           SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
}
 
Чтобы правильно расположить окно с нашей кнопкой на экране компьютера, мы должны знать его разрешение. Для этого выполняется следующая строка кода: 
 
int toppos = GetSystemMetrics(SM_CYSCREEN)-23; 
 
Здесь вызывается функция GetSystemMetrics, которая возвращает значение определенного системного параметра. В скобках указывается параметр, который нас интересует (в данном случае SM_CYSCREEN, высота экрана). Из результата вычитаем число 23 (высота картинки + еще 3 пиксела) и сохраняем результат в переменной toppos. 
 
Таким образом, мы вычислили верхнюю позицию окна с изображением кнопки, и можем его туда переместить. Еще необходимо, чтобы наше окно всегда было поверх остальных. Обе эти операции можно сделать, вызвав только одну функцию SetWindowPos. У нее 7 параметров: 
 
окно, которое надо переместить, — указываем наше окошко; 
место размещения (после какого окна нужно расположить указанное) — устанавливаем флаг HWND_TOPMOST (поверх всех); 
следующие четыре параметра определяют прямоугольник, в котором должно располагаться окно. Левую позицию задаем равной 4. Верхнюю — равной переменной toppos. Ширина и высота окна должны определяться размерами картинки. Возможно, что после запуска программы вам придется подкорректировать левую верхнюю позицию в зависимости от подготовленной вами картинки; 
последний параметр задает режим отображения окна — устанавливаем флаг SWP_SHOWWINDOW (просто отобразить). 
После этого прорисовываем окно в новой позиции с помощью вызова функции UpdateWindow(hWnd). В скобках указано окно, которое надо отобразить. 
 
Последний штрих — создание пустого события с помощью вызова функции СreateEvent. Это событие мы будем использовать чуть позже, и нас устраивает, что оно пустое. 
 
Теперь наше окно расположено в нужном месте, и можно приступить к его анимации (движению по экрану). Для этого запускаем цикл от 0 до 50, внутри которого выполняются следующие действия: 
 
 for (i=0; i<50; i++)
 {
        toppos=toppos-4;
        SetWindowPos(hWnd, HWND_TOPMOST, 4, toppos, 50, 20,
           SWP_SHOWWINDOW);
        WaitForSingleObject(h,15);//Задержка в 5 миллисекунд
 }
 
Сначала уменьшается значение переменной toppos на четыре пиксела. Таким образом, окно будет ползти вверх по экрану. Потом перемещаем это окно в новую позицию. 
 
Самое интересное здесь — это последняя строчка кода, в которой выполняется функция WaitForSingleObject. Она ожидает наступления события, определенного первым параметром. Второй параметр указывает количество миллисекунд, которые надо ожидать. Так как событие пустое, оно никогда не наступит, и функция прождет его ровно указанное во втором параметре время. Таким образом, мы делаем задержку между движениями окна, которая не загружает систему. Некоторые любят для задержек использовать циклы с математическими операциями, но это нагружает процессор бесполезной работой, что является плохим тоном. По моим наблюдениям, использование WaitForSingleObject в наименьшей степени нагружает компьютер и отлично работает. 
 
Итак, наш цикл двигает кнопку вверх по экрану. После этого мы должны вернуть кнопку на место, для чего запускается еще один цикл, в котором тем же способом кнопка движется в обратном направлении.
Это из книжки Фленова "С++ глазами хакера", правда она старая.
1
 Аватар для Vlad_IT
1452 / 360 / 61
Регистрация: 03.04.2010
Сообщений: 2,096
17.08.2010, 12:12  [ТС]
Спасибо попробую! Просто я раньше в Borland C++ делал просто вот так.
C++
1
Button1->Left = 1;
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.02.2016, 12:28
Актуально. Как программно перемещать компонент по форме?)
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
16.02.2016, 13:03
В MFC:
получаем указатель на окно компонента
CWnd *pCWnd1=GetDlgItem( IDOK );
а дальше у CWnd
есть функции GetWindowRect и SetWindowPos
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.02.2016, 15:20
Цитата Сообщение от SSC Посмотреть сообщение
получаем указатель на окно компонента
CWnd *pCWnd1=GetDlgItem( IDOK );
О спасибо, у меня как раз именно с этим были трудности, не знал как получить CWnd..
Через часик попробую, спасибо))

Добавлено через 34 минуты
Что-то компонент не перемещается. Пытаюсь изменить позицию у Static Text.
C++
1
2
CWnd *pCWnd1 = GetDlgItem(IDC_STATIC10);
SetWindowPos(pCWnd1, 1, 1, 1, 1, true);
Добавлено через 5 минут
И так тоже не выходит: (уже вариант с кнопкой)
C++
1
GetDlgItem(IDC_BUTTON4)->SetWindowPos(GetDlgItem(IDC_BUTTON4), 111, 111,111,111,SWP_SHOWWINDOW);
Добавлено через 3 минуты
И так тоже ничего:
C++
1
pCWnd1->SetWindowPos(this, 2, 3, 4, 5, SWP_SHOWWINDOW);
Добавлено через 2 минуты
А всё перемещается, нужно было 2 параметром подавать дескриптор порядка размещения
C++
1
pCWnd1->SetWindowPos(pCWnd1,0, 2, 3, 4, 5);
http://www.firststeps.ru/mfc/winapi/win/r.php?96

Добавлено через 47 минут
Цитата Сообщение от SSC Посмотреть сообщение
есть функции GetWindowRect и SetWindowPos
Можете помочь с этим?
Пытаюсь сделать чтобы при нажатии на кнопку форма осталась в тех же координатах и тех же размеров, а она вместо этого исчезает.
C++
1
2
3
4
5
RECT rect;
        this->GetWindowRect(&rect);
 
        this->SetWindowPos(this, 0, rect.left, rect.top, (rect.right- rect.left), (rect.bottom- rect.top));
        this->GetWindowRect(&rect);
А вот тут я пытаюсь увеличить размеры формы на +50 с обоих сторон, но так же ничего не выходит, форма так же исчезает.
C++
1
2
3
4
5
RECT rect;
        this->GetWindowRect(&rect);
 
        this->SetWindowPos(this, 0, rect.left, rect.top, (rect.right- rect.left)+50, (rect.bottom- rect.top)+50); //Изменить позицию
        this->GetWindowRect(&rect);
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.02.2016, 15:30
Заметил что у меня в MFC другая структура SetWindowPos нежели говорится в msdn и на сайте "первые шаги".
Прикладываю скрин.
Миниатюры
Как заставить кнопку двигаться во время работы (MFC)?  
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.02.2016, 15:46
При указании цифры 4 в конце, всё работает. Почему не работает с 0x0020 не знаю..
C++
1
this->SetWindowPos(this, rect.left, rect.top, (rect.right - rect.left)+50, (rect.bottom - rect.top)+50, 4); //Изменить позицию
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
16.02.2016, 22:18
Цитата Сообщение от Nalik Посмотреть сообщение
Заметил что у меня в MFC другая структура SetWindowPos нежели говорится в msdn
Не нужно путать WINAPI функцию SetWindowPos и метод MFC класса CWnd::SetWindowPos
Цитата Сообщение от Nalik Посмотреть сообщение
Почему не работает с 0x0020 не знаю..
Что конкретно не работает? Какие получаются результаты и каковы ожидания?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2016, 22:18
Помогаю со студенческими работами здесь

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

Как заставить картинки двигаться??????
Solid Works позволяет сделать анимацию спроектированной детали

Как заставить двигаться обьект
Всем привет, у меня задача стоит такая: сделать так что бы при нажатии на фигурку она двигался в другом (Picturebox) и при ударе об...

Как заставить двигаться Scroll?
Господа форумчане и иже выше от них стоящие !:pardon: Кто подскажет, как заставить двигаться этот ослячий элемент типа скролл.Жму на...

Как заставить двигаться шарик?
Я создаю на форме шарики, и мне нужно заставить их двигаться, как это сделать??


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru