Как создать C # Winforms управления, который парит

голоса
8

Как вы можете создать элемент управления C # Winforms, которая выходит из пределов своего региона? Такие, как выпадающий список. Вроде как, если у вас в выпадающем DropDownBox'е малогабаритной панели.

Задан 09/12/2008 в 18:21
источник пользователем
На других языках...                            


3 ответов

голоса
8

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

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

public class MyListBox : ListBox {
  private Control mParent;
  private Point mPos;
  private bool mInitialized;

  public MyListBox(Control parent) {
    mParent = parent;
    mInitialized = true;
    this.SetTopLevel(true);
    parent.LocationChanged += new EventHandler(parent_LocationChanged);
    mPos = mParent.Location;
  }

  public new Point Location {
    get { return mParent.PointToClient(this.Location); }
    set { 
      Point zero = mParent.PointToScreen(Point.Empty);
      base.Location = new Point(zero.X + value.X, zero.Y + value.Y);
    }
  }

  protected override Size DefaultSize {
    get {
      return mInitialized ? base.DefaultSize : Size.Empty;
    }
  }

  protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) {
    if (this.mInitialized)
      base.SetBoundsCore(x, y, width, height, specified);
  }

  void parent_LocationChanged(object sender, EventArgs e) {
    base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y);
    mPos = mParent.Location;
  }

  protected override CreateParams CreateParams {
    get {
      CreateParams cp = base.CreateParams;
      if (mParent != null && !DesignMode) {
        cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000);
        cp.Parent = mParent.Handle;
        Point pos = mParent.PointToScreen(Point.Empty);
        cp.X = pos.X;
        cp.Y = pos.Y;
        cp.Width = base.DefaultSize.Width;
        cp.Height = base.DefaultSize.Height;
      }
      return cp;
    }
  }
}
Ответил 09/12/2008 в 22:41
источник пользователем

голоса
2

Я сделал что-то похоже на что в последнее время, и я использовал ListBox. Прохладный думать о ListBox, является то, что вы можете отобразить его в любом месте вы хотите, даже вне пределов вашего контроля. Таким образом, при обнаружении с помощью кнопки мыши или любой другой, что вам нужно, чтобы отобразить DropDown, что вы хотите, просто заполнить ListBox и отобразить его в любом месте вы хотите. У меня есть идея здесь:

http://msdn.microsoft.com/en-us/library/aa480727.aspx

Они показывают, как построить пользовательский DataGridView с фильтрацией, и для отображения значений фильтра, они помещают в ListBox под ячейкой заголовка.

Ответил 09/12/2008 в 20:08
источник пользователем

голоса
0

Существует хорошая статья здесь:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

Это класс, который обрабатывает некоторые из сложных аспектов получения этого правильно работать, например, хранение окна приложения заголовок окна активным, обработки Alt-Tab и отмены с помощью мыши.

Ответил 06/07/2012 в 02:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more