Программирование >>  Автоматически обновляемые приложения 

1 ... 35 36 37 [ 38 ] 39 40 41 ... 170


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 показано, как это выглядит в коде.



1 ... 35 36 37 [ 38 ] 39 40 41 ... 170

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика