Cum de a crea un # Winforms de control C, care trece mouse-ul

voturi
8

Cum se poate crea un control C # Winforms, care iese din limitele regiunii sale? Cum ar fi o caseta derulantă. Cam ca în cazul în care ați avut un DropDownBox într-un panou de dimensiuni mici.

Întrebat 09/12/2008 la 18:21
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
8

Windows Forms nu acceptă Windows, cum ar fi la fel de bine, este destul de fundamental incompatibil cu proiectantul. Iată un exemplu de cod pentru a obține ai început. Nu puteți utiliza acest control în proiectantul, acesta trebuie să fie creat la run-time. De asemenea, trebuie apelată metoda sa se elimina () tine.

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;
    }
  }
}
Publicat 09/12/2008 la 22:41
sursa de către utilizator

voturi
2

Am făcut ceva similar cu faptul că recent, și am folosit un ListBox. Răcoarea gândesc la un listbox, este că îl puteți afișa oriunde doriți, chiar și în afara limitelor de control dumneavoastră. În acest fel, atunci când detectează printr-un clic pe butonul sau orice altceva, de care aveți nevoie pentru a afișa meniul drop-down pe care doriți, doar populează ListBox și afișați-l oriunde doriți. Am luat ideea de aici:

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

Ele arată cum să construiască un personalizat DataGridView cu filtrare, și pentru a afișa valorile de filtrare, ele plasează un ListBox sub celula antet.

Publicat 09/12/2008 la 20:08
sursa de către utilizator

voturi
0

Există un articol bun aici:

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

Aceasta are o clasă care se ocupă de unele dintre aspectele dificile de a obține acest lucru să funcționeze corect, cum ar fi păstrarea bara de titlu fereastra aplicație activă, manipulare Alt-Tab și anularea cu un clic de mouse.

Publicat 06/07/2012 la 02:47
sursa de către utilizator

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