1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
1

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

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

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

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

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

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

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

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

Не по теме:

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

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

Не по теме:

Пожалуйста

0
1183 / 805 / 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
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
05.04.2011, 18:47  [ТС] 15
Вопрос все еще актуален!
0
1183 / 805 / 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
6043 / 3452 / 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
1183 / 805 / 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
6043 / 3452 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.04.2011, 22:21 19
Цитата Сообщение от KReedlas Посмотреть сообщение
Обработчик MouseUp не срабатывает на ЛКМ
Это бред какой-то, такого быть не может. Если был MouseDown, то MouseUp будет обязательно.
0
1183 / 805 / 10
Регистрация: 30.08.2010
Сообщений: 2,686
10.04.2011, 22:34  [ТС] 20
Цитата Сообщение от nio Посмотреть сообщение
такого быть не может
код постом выше, попробуй
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2011, 22:34
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru