Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Липкая форма


Автор: dizpers 20.6.2011, 12:48
Всем привет! Мне необходимо сделать такое окно, которое бы при приближении к краям экрана прилепало к этим краям. После прилипания к левой или правой части - окно имеет фиксированную ширину и максимальную высоту, при прилепании к верху или низу - должно иметь фиксированную высоту и максимальную ширину. При этом, если пользователь захочет отлепить это окно, то оно должнопоменять размер, скажем на (200,200) и отодвинуться от зоны прилипания.

Само прилипания я реализовал. Возникли проблемы при реализации отлипания.

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WordLearn
{
    public partial class FormWord : Form
    {
        
        private const int stickDist = 100;
        
        private Screen scn = null;
        private int maxW = 0;
        private int maxH = 0;

        private int fixedW = 300;
        private int fixedH = 300;

        public FormWord()
        {
            InitializeComponent();
        }

        private void FormWord_Load(object sender, EventArgs e)
        {
            this.scn = Screen.FromPoint(this.Location);
            maxW = scn.WorkingArea.Width;
            maxH = scn.WorkingArea.Height;
            Point p = new Point(0, 0);
            this.Size = new Size(fixedW, maxH);
            this.Location = p;
        }

        private void FormWord_Move(object sender, EventArgs e)
        {
            if (maxH != 0 && maxW != 0 && this.Location.X != 0 && this.Location.Y != 0 && this.Location.X != maxW-fixedW && this.Location.Y != maxH - fixedH)
            {
                label1.Text = this.Location.X.ToString() + ":" + this.Location.Y.ToString();
                if (this.Location.Y < stickDist)
                {
                    Point p = new Point(0, 0);
                    this.Size = new Size(maxW, fixedH);
                    this.Location = p;
                }
                else if ((this.Location.Y + this.Height) > (maxH - stickDist))
                {
                    Point p = new Point(0, (maxH - fixedH));
                    this.Size = new Size(maxW, fixedH);
                    this.Location = p;
                }else if (this.Location.X < stickDist)
                {
                    Point p = new Point(0, 0);
                    this.Size = new Size(fixedW, maxH);
                    this.Location = p;
                }
                else if ((this.Location.X + this.Width) > (maxW - stickDist))
                {
                    Point p = new Point((maxW - fixedW), 0);
                    this.Size = new Size(fixedW, maxH);
                    this.Location = p;
                }
            }     
        }

        private void FormWord_ResizeBegin(object sender, EventArgs e)
        {
            this.Size = new Size(200,200);
            int x = 0;
            int y = 0;
            if (this.Location.Y == 0)
            {
                y = stickDist * 2;
            }
            else
            {
                y = this.Location.Y - stickDist * 2;
            }
            if (this.Location.X == 0)
            {
                x = stickDist * 2;
            }
            else
            {
                x = this.Location.X - stickDist * 2;
            }

            this.Location = new Point(x, y);
            Cursor.Position = new Point(x + 2, y + 2);

        }

        
    }
}


Отлипание я как раз начал реализовывать в методе FormWord_ResizeBegin - но эффекта от такого отлипания ноль. Помогите пожалуйста реализовать отлипание, такое как я описал выше. Заранее спасибо.

Автор: Keanor 20.6.2011, 19:51
введи булеву  переменную в которая будет true только если произошло прилипание. И в моменте прилипания устанавливай в true. Прилипание реализуй только если переменная это = false иначе отлипание.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)