Изменение размера управления во время выполнения - PullRequest
2 голосов
/ 18 января 2012

У меня есть собственный контроль, и мне нужно изменить размер среды выполнения путем перетаскивания.Чтобы изменить размеры нижней и правой границ, я использую это:

protected override void OnMouseDown(MouseEventArgs e)
{
  SL = new System.Drawing.Point(Location.X + e.Location.X, Location.Y + e.Location.Y);
  SP = new System.Drawing.Point(Location.X, Location.Y);

  if (e.X <= m)
    _OnLeft = true;

  if (e.X >= Width - m)
    _OnRight = true;

  if (e.Y <= m)
    _OnTop = true;

  if (e.Y >= Height - m)
    _OnBottom = true;
}

protected override void OnMouseMove(MouseEventArgs e)
{
  // Change Width - right
  if (_OnRight && (!_OnTop && !_OnBottom))
  {
    if (e.X <= 1)
      return;
    Width = e.X;
    return;
  }

  // Change Height - bottom
  if (_OnBottom && (!_OnLeft && !_OnRight))
  {
    if (e.Y <= 1)
      return;
    Height = e.Y;
    return;
  }
}

Все работает нормально.Но у меня проблемы с изменением размера сверху и слева:

// Change Width - left
if (_OnLeft && (!_OnTop && !_OnBottom))
{
  // Problem part - I don't know condition to return
  if (Width + Left - e.X <= 1)
    return;
  Left += e.X - SL.X + SP.X;
  // How to get right width
  Width += Left - e.X;
  return;
}

// Change Height - top
if (_OnTop && (!_OnLeft && !_OnRight))
{
  // Problem part - I don't know condition to return
  if (Height + Top - e.Y <= 1)
    return;
  Top += e.Y - SL.Y + SP.Y;
  // How to get right height 
  Height += Top - e.Y;
  return;
}

Что-то в этом роде.Есть идеи?

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Практически единственный способ чисто разрешить изменение размера элемента управления .NET - использовать P / Invoke.Этот точный код не тестировался, но я использовал этот метод изменения размера много раз, поэтому он должен работать:

Во-первых, внешние объявления P / Invoke:

private static class UnsafeNativeMethods
{
    [DllImport("user32.dll")]
    public static extern bool ReleaseCapture();
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}

Далее, вызываем P/ Вызывает функции, чтобы операционная система обрабатывала изменение размера:

protected override void OnMouseDown(MouseEventArgs e)
{
    int msg = -1; //if (msg == -1) at the end of this, then the mousedown is not a drag.

    if (e.Y < 8)
    {
        msg = 12; //Top
        if (e.X < 25) msg = 13; //Top Left
        if (e.X > Width - 25) msg = 14; //Top Right
    }
    else if (e.X < 8)
    {
        msg = 10; //Left
        if (e.Y < 17) msg = 13;
        if (e.Y > Height - 17) msg = 16;
    }
    else if (e.Y > Height - 9)
    {
        msg = 15; //Bottom
        if (e.X < 25) msg = 16;
        if (e.X > Width - 25) msg = 17;
    }
    else if (e.X > Width - 9)
    {
        msg = 11; //Right
        if (e.Y < 17) msg = 14;
        if (e.Y > Height - 17) msg = 17;
    }

    if (msg != -1)
    {
        UnsafeNativeMethods.ReleaseCapture(); //Release current mouse capture
        UnsafeNativeMethods.SendMessage(Handle, 0xA1, new IntPtr(msg), IntPtr.Zero);
        //Tell the OS that you want to drag the window.
    }
}

Наконец, переопределите OnMouseMove, чтобы изменить курсор в зависимости от того, где он находится в элементе управления.Я оставлю эту часть вам, потому что это почти тот же код, что и в предыдущем фрагменте.

2 голосов
/ 18 января 2012

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

    public Form1() {
        InitializeComponent();
        var ctl = new Form2();
        ctl.ControlBox = false;
        ctl.Text = "";
        ctl.Location = new Point(10, 10);
        ctl.MinimumSize = new Size(10, 10);
        ctl.TopLevel = false;
        ctl.Visible = true;
        this.Controls.Add(ctl);
        ctl.Size = new Size(100, 100);
    }
1 голос
/ 18 января 2012

Попробуйте изменить свой код на это:

Слева:

int oldLeft = Left;
Left += e.X - SL.X + SP.X;
// How to get right width
// Width += Left - e.X;
Width += oldLeft - Left;

Для верха:

int oldTop = Top;
Top += e.Y - SL.Y + SP.Y;
// How to get right height 
// Height += Top - e.Y;
Height += oldTop - Top;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...