Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/321: Рейтинг темы: голосов - 321, средняя оценка - 4.89
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686

Перемещение формы без границ

20.03.2011, 10:37. Показов 63715. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
А возможно ли перемещать форму мышью по рабочему столу, если у нее нет рамки (FormBorderStyle=None)?
 Комментарий модератора 
Одна тема - один вопрос
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2011, 10:37
Ответы с готовыми решениями:

Нарисовать границы у формы без границ
Народ у меня вопросик можно ли на C# сделать обводку границ формы своим цветом и размером когда у формы отключены границы. Я нарисовал...

Перемещение формы без заголовка
Доброй ночи. Подскажите как можно осуществить перемещение формы без заголовка. Дело в том, что на всю форму tabControl, вверху...

Перемещение формы без бордюров
Здарова! Помогите пожалуйста!!! Срочно нужно: что бы форма none могла перетаскиваться по столу при нажатии на панель. То есть: Зажал...

24
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.03.2011, 10:56
Цитата Сообщение от TRilonX Посмотреть сообщение
А возможно ли перемещать форму мышью по рабочему столу, если у нее нет рамки
Да
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
public partial class Form1 : Form
    {
        private Point mouseOffset;
        private bool isMouseDown = false;
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape) this.Close();
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int xOffset;
            int yOffset;
 
            if (e.Button == MouseButtons.Left)
            {
                xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
                yOffset = -e.Y - SystemInformation.CaptionHeight -
                    SystemInformation.FrameBorderSize.Height;
                mouseOffset = new Point(xOffset, yOffset);
                isMouseDown = true;
            }
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                Point mousePos = Control.MousePosition;
                mousePos.Offset(mouseOffset.X, mouseOffset.Y);
                Location = mousePos;
            }
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            // Changes the isMouseDown field so that the form does
            // not move unless the user is pressing the left mouse button.
            if (e.Button == MouseButtons.Left)
            {
                isMouseDown = false;
            }
        }
    }
6
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
20.03.2011, 10:56
должен быть элемент управления,например, Image. По нему шелчок просто описать. а потом следить за курсором и проверять его координаты и в соответствии менять координаты формы
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.03.2011, 11:01
za5, выше показан код перетаскивания за любую точку формы без доп контролов
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
20.03.2011, 11:04
nio, ок, я знаю. но сначала подумал, что он её хотел сделать произвольной формы, и наложить рисунок с дыркой, например)
1
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
20.03.2011, 11:12  [ТС]
да да, форма бедет иметь немного нестандартную форму, и перетаскивание я хотел сделать на элементе panel (в самом верху формы), т.е. при зажатай клавише на этой панели и передвижении курсора форма тоже перемещалась...

Не по теме:

ps: да просто не хотел захламлять форум ветками с банальными вопросами :)

0
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
20.03.2011, 12:06
Лучший ответ Сообщение было отмечено как решение

Решение

Вот:
Создай обработчик MouseDown и впиши туда это:
C#
1
2
3
base.Capture = false;
        Message m = Message.Create(base.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);
        this.WndProc(ref m);
Проще и меньше надо писать

Добавлено через 1 минуту
Эффект такой же, как в примере nio
10
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
20.03.2011, 13:25  [ТС]
может быть и проще (работоспособность не проверял), но этот способ мне непонятен (в отличии от способа, предложенным nio).
Что это за объект base и что за параметры у метода create()? Можеш прокоментировать?
просто хочу что бы не просто работало, но и я понимал логику этого...
0
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
21.03.2011, 08:48
Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода расширения

Ключевое слово base используется для доступа к членам базового из производного класса.

Таким образом, если класс унаследован от другого класса, то this.Close() вызовет метод реализованный в наследнике, а base.Close() - в родителе.

И ещё, чтобы было понятнее, такой-же эффект, как и в моём предыдущем примере:
C#
1
2
3
base.Capture = false;
        Message m = Message.Create(base.Handle, 161, new IntPtr(2), IntPtr.Zero);
        this.WndProc(ref m);
Посмотри в чём разница:
C#
1
2
3
this.Capture = false;
        Message m = Message.Create(this.Handle, 161, new IntPtr(2), IntPtr.Zero);
        this.WndProc(ref m);
C#
1
2
3
base.Capture = false;
        Message m = Message.Create(base.Handle, 161, new IntPtr(2), IntPtr.Zero);
        this.WndProc(ref m);
Я думаю 0xa1 не совсем понятная цифра, её можно заменить 161

Добавлено через 2 минуты
Про Message.Create почитай на MSDN

Добавлено через 2 минуты
А так мой способ короче и его легче запомнить.
2
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
21.03.2011, 08:55
Я думаю 0xa1 не совсем понятная цифра, её можно заменить 161
как раз таки на оборот
в winuser.h
C
1
#define VK_RSHIFT   0xA1
1
46 / 46 / 3
Регистрация: 04.02.2011
Сообщений: 199
21.03.2011, 10:20
Konctantin, но если её заменить, программа будет работать правильно, не так ли?
0
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
21.03.2011, 13:05  [ТС]
mak326428, спасибо, разобрался, все работает
0
21.03.2011, 13:16

Не по теме:

Пожалуйста

0
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
28.03.2011, 19:28  [ТС]
решил дальше развить, теперь хочу чтобы на время перемещения формы она становилась полупрозрачной... Для этого нужно переопределить метод WndProc()?
C#
1
2
3
4
5
6
7
8
9
10
11
12
protected override void WndProc(ref Message m) 
{ 
            if (m.Msg == 0x00A1) 
            { 
                this.Opacity = 0.5; 
            }
            if (m.Msg == 0x00A0) 
            { 
                this.Opacity = 1.0; 
            } 
            base.WndProc(ref m); 
}
проблема в том, что после отпускания мыши форма не возвращается в исходное состояние (причем обратный эффект работает).
Прошу помощи...
0
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
05.04.2011, 18:47  [ТС]
Вопрос все еще актуален!
0
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 19:22  [ТС]

и так, вопрос я так и не решил, но вот что сделал и выяснил
1)добавил в обработчик MouseDown для формы:
C#
1
2
3
4
       base.Capture = false;
       this.Opacity = 0.6; //добавил
       Message m = Message.Create(base.Handle, 161, new IntPtr(2), IntPtr.Zero);
       this.WndProc(ref m);
2)Создал обработчик MouseUp для формы:
C#
1
       this.Opacity = 1;
Второй обработчик срабатывает только при нажатии-отпускании ПКМ, но мне нужно тоже самое ,но для ЛКМ. Как решить? Программно "нажать" ПКМ?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.04.2011, 20:06
Цитата Сообщение от KReedlas Посмотреть сообщение
Как решить? Программно "нажать" ПКМ?
Не пойму, в чем проблема
C#
1
2
3
4
5
6
7
8
9
10
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if(e.Button== MouseButtons.Right)
                this.Opacity = 0.5;
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            this.Opacity = 1;
        }
0
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 20:37  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
Не пойму, в чем проблема
проблема в том, что не работает. Суть в следующем: при зажатой ЛКМ на форме (не заголовке - его нет) была возможность ее перемещать по экрану (это работает), при этом на это время она становилась полупрозрачной. Приведу весь код:
C#
1
2
3
4
5
6
7
 private void FormMain_MouseDown(object sender, MouseEventArgs e)
        {
            base.Capture = false;
            this.Opacity = 0.6;
            Message m = Message.Create(base.Handle, 161, new IntPtr(2), IntPtr.Zero);
            this.WndProc(ref m);
        }
C#
1
2
3
4
private void FormMain_MouseUp(object sender, MouseEventArgs e)
        {
            this.Opacity = 1;
        }
Обработчик MouseUp не срабатывает на ЛКМ! Но срабатывает на ПКМ..

Добавлено через 9 минут
все, разобрался!
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.04.2011, 22:21
Цитата Сообщение от KReedlas Посмотреть сообщение
Обработчик MouseUp не срабатывает на ЛКМ
Это бред какой-то, такого быть не может. Если был MouseDown, то MouseUp будет обязательно.
0
 Аватар для KReedlas
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 22:34  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
такого быть не может
код постом выше, попробуй
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2011, 22:34
Помогаю со студенческими работами здесь

Перемещение формы без рамки
Можно ли перемещать форму без рамки удерживая мышью свободное от компонентов место на форме?Если да то как

Перемещение формы без рамки
Ребят, всем привет. Помогите пожалуйста, буду безмерно благодарен вам. В общем, нужен код, благодаря которому можно будет перемещать...

Перемещение формы None, без бордера
Перемещение формы. Код: private void MainForm_MouseDown(object sender, MouseEventArgs e) { Capture = false; var m =...

Перемещение формы без FormBorderStyle = null;
Здравствуйте! Помогите пожалуйста, вот к примеру у меня есть форма на ней нет ничего кроме 1 панели и самой формы, как сделать так чтобы...

Перемещение за элемент label без бордера формы
смысл на картинке: Использую для перемещения за Panel private void Panelka_MouseDown(object sender, MouseEventArgs e) { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru