Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/97: Рейтинг темы: голосов - 97, средняя оценка - 4.92
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
1

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

20.03.2011, 10:37. Просмотров 18901. Ответов 21
Метки нет (Все метки)

А возможно ли перемещать форму мышью по рабочему столу, если у нее нет рамки (FormBorderStyle=None)?
 Комментарий модератора 
Одна тема - один вопрос
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2011, 10:37
Ответы с готовыми решениями:

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

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

Перемещение формы None, без бордера
Перемещение формы. Код: private void MainForm_MouseDown(object sender,...

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

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

21
nio
5959 / 3365 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.03.2011, 10:56 2
Цитата Сообщение от 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
za5
442 / 346 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
20.03.2011, 10:56 3
должен быть элемент управления,например, Image. По нему шелчок просто описать. а потом следить за курсором и проверять его координаты и в соответствии менять координаты формы
0
nio
5959 / 3365 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.03.2011, 11:01 4
za5, выше показан код перетаскивания за любую точку формы без доп контролов
0
za5
442 / 346 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
20.03.2011, 11:04 5
nio, ок, я знаю. но сначала подумал, что он её хотел сделать произвольной формы, и наложить рисунок с дыркой, например)
1
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
20.03.2011, 11:12  [ТС] 6
да да, форма бедет иметь немного нестандартную форму, и перетаскивание я хотел сделать на элементе panel (в самом верху формы), т.е. при зажатай клавише на этой панели и передвижении курсора форма тоже перемещалась...

Не по теме:

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

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

Решение

Вот:
Создай обработчик 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
5
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
20.03.2011, 13:25  [ТС] 8
может быть и проще (работоспособность не проверял), но этот способ мне непонятен (в отличии от способа, предложенным nio).
Что это за объект base и что за параметры у метода create()? Можеш прокоментировать?
просто хочу что бы не просто работало, но и я понимал логику этого...
0
mak326428
39 / 39 / 3
Регистрация: 04.02.2011
Сообщений: 199
21.03.2011, 08:48 9
Ключевое слово 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 минуты
А так мой способ короче и его легче запомнить.
1
Konctantin
940 / 744 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
21.03.2011, 08:55 10
Я думаю 0xa1 не совсем понятная цифра, её можно заменить 161
как раз таки на оборот
в winuser.h
C
1
#define VK_RSHIFT   0xA1
1
mak326428
39 / 39 / 3
Регистрация: 04.02.2011
Сообщений: 199
21.03.2011, 10:20 11
Konctantin, но если её заменить, программа будет работать правильно, не так ли?
0
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
21.03.2011, 13:05  [ТС] 12
mak326428, спасибо, разобрался, все работает
0
mak326428
21.03.2011, 13:16
  #13

Не по теме:

Пожалуйста

0
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
28.03.2011, 19:28  [ТС] 14
решил дальше развить, теперь хочу чтобы на время перемещения формы она становилась полупрозрачной... Для этого нужно переопределить метод 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
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
05.04.2011, 18:47  [ТС] 15
Вопрос все еще актуален!
0
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 19:22  [ТС] 16

и так, вопрос я так и не решил, но вот что сделал и выяснил
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
5959 / 3365 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.04.2011, 20:06 17
Цитата Сообщение от 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
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 20:37  [ТС] 18
Цитата Сообщение от 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
5959 / 3365 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.04.2011, 22:21 19
Цитата Сообщение от KReedlas Посмотреть сообщение
Обработчик MouseUp не срабатывает на ЛКМ
Это бред какой-то, такого быть не может. Если был MouseDown, то MouseUp будет обязательно.
0
KReedlas
1181 / 803 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 22:34  [ТС] 20
Цитата Сообщение от nio Посмотреть сообщение
такого быть не может
код постом выше, попробуй
0
10.04.2011, 22:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2011, 22:34

Перемещение за элемент label без бордера формы
смысл на картинке: Использую для перемещения за Panel private void...

Задать расположение формы в правом нижнем углу и запретить перемещение формы
Доброе время Подскажите пожалуйста, вот с этим: Необходимо задать...

Как можно растягивать и сжимать форму без границ FormBorderStyle=None
Можно ли сделать возможность растягивать (в том числе и разворачивать на весь...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru