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

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

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

А возможно ли перемещать форму мышью по рабочему столу, если у нее нет рамки (FormBorderStyle=None)?
 Комментарий модератора 
Одна тема - один вопрос

http://www.cyberforum.ru/windows-forms/thread1217234.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2011, 10:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перемещение формы без границ (C#):

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

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

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

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

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

21
nio
5948 / 3354 / 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
5948 / 3354 / 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
37 / 37 / 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
37 / 37 / 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
938 / 742 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
21.03.2011, 08:55 #10
Я думаю 0xa1 не совсем понятная цифра, её можно заменить 161
как раз таки на оборот
в winuser.h
C
1
#define VK_RSHIFT   0xA1
1
mak326428
37 / 37 / 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
5948 / 3354 / 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
5948 / 3354 / 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
Привет! Вот еще темы с решениями:

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

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

PictureBox вне границ формы или как сделать прозрачный фон
Здраствуйте, подскажите пожалуйста, как можно сделать изображение больше...

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


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

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

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