Изменение размера пользовательских форм (с эффектом падающей тени) и элементов управления событием перетаскивания мышью в диез - PullRequest
8 голосов
/ 04 октября 2010

В моем приложении мне нужно изменить размеры форм и все их элементы управления для эффекта перетаскивания мышью и формы должны иметь эффект тени, проблема в том, что все мои формы являются пользовательскими (без границ).

Спасибо взаранее

Ответы [ 4 ]

2 голосов
/ 14 октября 2010

Я думаю, вам нужно реализовать самостоятельно

  1. при нажатии мыши, начать, привязать при перетаскивании мышью + изменить курсор, чтобы изменить размер значка
  2. при перетаскивании мыши, просто уменьшите размер формы.
  3. при наведении мыши отменить привязку мыши при перетаскивании

причина, по которой я предлагаю динамическое связывание событий, чтобы вы могли указать, какой элемент управления или область должна иметь мышь вниз

1 голос
/ 19 октября 2010

Я не уверен насчет эффекта тени, но вы сможете изменить размер формы, поместив кнопку в правом нижнем углу с соответствующим значком. Когда пользователь нажимает и перетаскивает эту кнопку, он изменяет размеры формы. Вот пример кода:

public partial class Form1 : Form
{
    private int bottomBorder;
    private int rightBorder;
    private Point mouseStart;
    private bool isResizing = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isResizing)
        {
            var newLocation = button1.Location;
            newLocation.Offset(
                e.X - mouseStart.X,
                e.Y - mouseStart.Y);
            button1.Location = newLocation;
            this.Height = button1.Bottom + bottomBorder;
            this.Width = button1.Right + rightBorder;
            button1.Refresh();
        }

    }

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        isResizing = true;
        mouseStart = e.Location;
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isResizing = false;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        bottomBorder = this.Height - button1.Bottom;
        rightBorder = this.Width - button1.Right;
    }
}
0 голосов
/ 17 сентября 2014

Я использовал решения Дона Киркби и Мэтью Феррейры и создал свое собственное решение, объединяющее оба. Я добавил StatusStrip с именем «resizeHandle», сделал его размером 20x20 пикселей и прослушал его события.

public class CustomForm : Form
{
private const int WmNcLButtonDown = 0xA1;
private const int HtBottomRight = 17;
private const int wmNcLButtonUp = 0xA2;
private bool isResizing = false;

[DllImport("user32.dll")]
private static extern int ReleaseCapture();

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

private void resizeHandle_MouseDown(object sender, MouseEventArgs e)
{
    isResizing = true;
}

private void resizeHandle_MouseMove(object sender, MouseEventArgs e)
{
    if (isResizing)
    {
        // Check if we have released the Left mouse button
        isResizing = (e.Button == MouseButtons.Left);
        ReleaseCapture();
        if (isResizing)
        {
            SendMessage(Handle, wmNcLButtonDown, HtBottomRight, 0);
        }
        else
        {
            // Left Mouse button was released, end resizing.
            SendMessage(Handle, wmNcLButtonUp, HtBottomRight, 0);
        }
    }
}
0 голосов
/ 04 октября 2010

Без границы (или какого-либо контроля), как вы собираетесь изменить размер? Выясните эту часть, затем попробуйте этот код в вашей форме:

public class CustomForm : Form
{
    private const int WmNcLButtonDown = 0xA1;
    private const int HtBottomRight = 17;

    [DllImport("user32.dll")]
    private static extern int ReleaseCapture();

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

    // elsewhere
    void ResizeForm()
    {
        ReleaseCapture();
        SendMessage(this.Handle, WmNcLButtonDown, HtBottomRight, 0);
    }
}

Этот код изменит размер вашей формы, как если бы использовался нижний правый угол. Посмотрите HT_BOTTOMRIGHT и другие константы HT_ для разных мест для изменения размера.

...