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

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

17.08.2010, 02:03. Показов 2823. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru