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

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

20.03.2011, 10:37. Показов 63833. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru