Wie ein C # WinForms-Steuerelement, das schwebt erstellen

stimmen
8

Wie können Sie ein C # WinForms-Steuerelement erstellen, die aus den Grenzen ihrer Region geht? Wie zum Beispiel eines Dropdown-Feld. Ein bisschen wie wenn Sie hatte eine Dropdownbox in einen kleindimensionierten Gremium.

Veröffentlicht am 09/12/2008 um 18:21
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
2

Ich habe etwas ähnlich zu, dass vor kurzem, und ich verwenden, um eine List-Box. Die kühle denken über eine Listbox, ist, dass man es überall anzeigen können Sie wollen, auch außerhalb der Grenzen Ihrer Kontrolle. Auf diese Weise, wenn Sie über einen Button-Klick erkennen oder was auch immer, dass Sie die Dropdown-Liste angezeigt werden müssen, die Sie möchten, füllen Sie einfach die List-Box und zeigt es wo immer Sie wollen. Ich habe die Idee von hier:

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

Sie zeigen, wie eine benutzerdefinierte Datagridview mit Filtern zu bauen, und die Filterwerte angezeigt werden, sie eine List-Box unter der Header-Zelle platzieren.

Beantwortet am 09/12/2008 um 20:08
quelle vom benutzer

stimmen
8

Windows Forms unterstützt keine Fenster so gut, ist es ziemlich grundsätzlich unvereinbar mit dem Designer. Hier einige Code, den Sie, um loszulegen. Sie können diese Kontrolle im Designer verwenden, muss es zur Laufzeit erstellt werden. Sie müssen auch die Methode Dispose () selbst nennen.

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;
    }
  }
}
Beantwortet am 09/12/2008 um 22:41
quelle vom benutzer

stimmen
0

Es ist ein guter Artikel hier:

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

Dies hat eine Klasse, die einige der kniffligen Aspekte behandelt dies immer richtig funktionieren, wie das Anwendungsfenster titlebar aktiv zu halten, Handhabung Alt-Tab und mit einem Mausklick abgebrochen wird.

Beantwortet am 06/07/2012 um 02:47
quelle vom benutzer

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