|
Программирование >> Автоматически обновляемые приложения
case SC RESTORE: strlnfo = Восстанавливаемся ; isStateChanging = true; break; break; case WM NCLBUTTONDBLCLK: if (msg.WParam.ToInt320 == HTCAPTION) { isStateChanging = true; if (WindowState == FormWindowState.Maximized) strlnfo = Восстанавливаемся ; else strlnfo = Разворачиваемся ; break; if (isStateChanging) MessageBox.Show(strlnfo); base.WndProc(ref msg) ; Как запретить пользователю перемещать форму по экрану? Самый простой способ, который приходит в голову для решения этой задачи- установить стиль границы FormBorderstyie В ЗНаченИе None. В ЭТОМ случае у формы не будет заголовка, и пользователь не сможет перемещать форму по экрану. Но внешний вид формы в этом случае оставляет желать лучшего. Есть еще более хитрый вариант. Установите свойства ControiBox, MinimizeBox И MaximizeBox формы В зиачение false. Затем Присвойте свойству Text пустую строку. У формы исчезнет заголовок, но при этом появится граница вокруг формы. Внешне подобное окно выглядит более аккуратным. Ну а что делать, если необходимо, чтобы была неподвижной стандартная форма с обычным заголовком, и пользователь не мог бы перемещать ее по экрану? В этом случае нужно отлавливать некоторые системные сообщения в процедуре wndProc (листинг 5.21). protected override void WndProc(ref Message m) { const int WM NCLBUTTONDOWN = 161; const int WM SYSCOMMAND = 274; const int HTCAPTION = 2; const int SC MOVE = 61456; f((m.Msg == WM SYSCOMMAND) && (m.WParam.ToInt32() == SC MOVE)) return; f((m.Msg == WM NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION) return; base.WndProc (ref m); Примечание Примеры находятся в папке FormDemo на прилагаемом диске. Как перемещать форму, не имеющую заголовка? в предыдущем примере мы запрещали пользователю перемещать форму. А теперь нам надо решить обратную задачу. Пусть у нас имеется форма без заголовка, которую нужно перемещать с помощью мыши. Реализуется эта задача следующим образом. Поместим на форму метку Label, которая возьмет на себя функцию заголовка по перемещению формы. Далее в редакторе кода объявим глобальную переменную типа Boolean, которая отслеживает, осуществляется ли в настоящий момент перетаскивание. Когда пользователь нажмет на кнопку мыши внутри Label, то эта переменная получит значение true, свидетельствующее о попытке пользователя перетащить форму. В этот момент нужно получить координаты мыши и обработать эту информацию Листинг 5.21. Запрет на перемещение формы пользователем Листинг 5.22, Перемещение формы без заголовка Объявляем переменную, которая включает режим перетаскивания private bool bDragStatus; Хранит координаты смещения при щелчке мышью private Point clickPoint; private void labell MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Включаем режим перетаскивания и сохраняем координаты мыши bDragStatus = true; clickPoint = new Point(e.X, e.Y); else { bDragStatus = false; private void labell MouseMove(object sender, MouseEventArgs e) { if (bDragStatus) { Point pointMoveTo; Получим текущие координаты мьшш в экранных координатах pointMoveTo = this.PointToScreen(new Point(е.X, e.Y)); Изменяем позицию на величину clickPoint pointMoveTo.Offset(-clickPoint.X, -clickPoint.Y); (код для события MouseDown). Далее, когда пользователь начинает перемещать мышь над Label, форма движется в том же направлении с таким расчетом, чтобы позиция мыши относительно Label оставалась неизменной (код для события MouseMove). Наконец, когда пользователь отпускает кнопку мыши, режим перетаскивания отключается (код для события Mouseup). В листинге 5.22 показано, как это выглядит в коде.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |