Hoe maak je een C # Winforms controle dat Hovers creëren

stemmen
8

Hoe kun je een C # Winforms controle die uitgaat van de grenzen van de regio te creëren? Zoals een keuzelijst. Zoiets als wanneer je had een Dropdownbox in een klein formaat Panel.

De vraag is gesteld op 09/12/2008 om 18:21
bron van user
In andere talen...                            


3 antwoorden

stemmen
8

Windows Forms heeft geen ramen als dat ondersteunen nou ja, het is vrij fundamenteel onverenigbaar is met de ontwerper. Hier is een code om mee te beginnen. U kunt deze controle niet in de ontwerper, moet worden gemaakt op run-time. U moet ook de methode dispose () bellen jezelf.

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;
    }
  }
}
antwoordde op 09/12/2008 om 22:41
bron van user

stemmen
2

Ik deed iets vergelijkbaar met die onlangs, en ik gebruikte een ListBox. De koele denken over een keuzelijst, is dat je het overal waar u wilt kunt weergeven, zelfs buiten de grenzen van uw controle. Op die manier, wanneer je op te sporen door middel van een druk op de knop of wat dan ook, dat je nodig hebt om het dropdown-menu dat u wilt weergeven, net bevolken de ListBox en weergeven waar u maar wilt. Ik kreeg het idee van hier:

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

Ze laten zien hoe je een aangepaste DataGridView te bouwen met filtering, en om het filter waarden weer te geven, die zij in een ListBox onder het kopje cel.

antwoordde op 09/12/2008 om 20:08
bron van user

stemmen
0

Er is een goed artikel hier:

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

Dit heeft een klasse die behandelt een aantal van de lastige aspecten van het krijgen van deze correct te laten werken, zoals het bijhouden van de toepassing titelbalk actief, behandeling Alt-Tab en annuleren met een muisklik.

antwoordde op 06/07/2012 om 02:47
bron van user

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