📄 gcomboxbase.cs
字号:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing.Design;
using System.Reflection;
namespace gowk.controls
{
/// <summary>
/// GComboBox 的摘要说明。
/// </summary>
public class GComboxBase:GEditBase
{
private GButton gPanel1;
private ListBox lb;
private Form f;
private int maxDrawDownItems=5;
public event System.EventHandler SelectedIndexChanged;
public GComboxBase():base(null)
{
this.gPanel1 = new GButton();
this.gPanel1.Dock=DockStyle.Right;
this.gPanel1.Width=14;
this.gPanel1.Click+=new EventHandler(gPanel1_Click);
this.Controls.Add(gPanel1);
this.lb=new ListBox();
this.lb.Dock=DockStyle.Fill;
// this.lb.DrawMode=DrawMode.OwnerDrawVariable;
// this.lb.DrawItem+=new System.Windows.Forms.DrawItemEventHandler(lb_DrawItem);
// this.lb.MeasureItem+=new MeasureItemEventHandler(lb_MeasureItem);
this.lb.BorderStyle=BorderStyle.None;
this.lb.MouseMove+=new MouseEventHandler(lb_MouseMove);
this.lb.Paint+=new PaintEventHandler(GComboxBase_Paint);
this.lb.Click+=new EventHandler(lb_Click);
this.lb.SelectedIndexChanged+=new EventHandler(lb_SelectedIndexChanged);
this.f=new Form();
this.f.TopMost=true;
this.f.ShowInTaskbar=false;
this.f.FormBorderStyle=FormBorderStyle.None;
this.f.StartPosition=System.Windows.Forms.FormStartPosition.Manual;
this.f.Deactivate+=new EventHandler(f_Deactivate);
f.Controls.Add(this.lb);
System.Reflection.MethodInfo mi=typeof(ListBox).GetMethod("SetStyle",BindingFlags.Instance|BindingFlags.NonPublic);
mi.Invoke(this.lb,new object[]{ControlStyles.DoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true});
}
private void lb_DrawItem(object sender, DrawItemEventArgs e)
{
this.OnDrawItem(e);
}
protected virtual void OnDrawItem(DrawItemEventArgs e)
{
if(e.Index==-1)return;
bool focus=(e.State & DrawItemState.Focus)==DrawItemState.Focus;
GComboxItem item=(GComboxItem)this.Items[e.Index];
Rectangle imgRect=new Rectangle(e.Bounds.X+4,e.Bounds.Y+2,16,16);
Rectangle strRect=new Rectangle(e.Bounds.X+26,e.Bounds.Y,e.Bounds.Width-18,e.Bounds.Height);
if(focus)imgRect.Offset(-1,-1);
//background
e.Graphics.FillRectangle(new SolidBrush(this.BackColor),e.Bounds);
//draw image
if(item.Image!=null)
{
e.Graphics.DrawImage(item.Image,imgRect);
}
//draw text
StringFormat sf=new StringFormat();
sf.Trimming=StringTrimming.EllipsisCharacter;
sf.LineAlignment=StringAlignment.Center;
e.Graphics.DrawString(item.Text,this.Font,new SolidBrush(this.ForeColor),strRect,sf);
//focus item
if(focus)
{
e.Graphics.DrawRectangle(new Pen(this.BorderColor.NormalColor),new Rectangle(e.Bounds.X,e.Bounds.Y,e.Bounds.Width-1,e.Bounds.Height-1));
}
}
private void gPanel1_Click(object sender, EventArgs e)
{
Point p=this.PointToScreen(new Point(0,this.Height));
this.f.Height=(this.Height-4)*this.maxDrawDownItems;
this.f.Width=this.Width;
this.f.Show();
this.f.Location=p;
}
private void f_Deactivate(object sender, EventArgs e)
{
this.f.Hide();
}
private void OnMeasureItem(MeasureItemEventArgs e)
{
e.ItemHeight=this.Height-4;
}
protected virtual void lb_MeasureItem(object sender, MeasureItemEventArgs e)
{
this.OnMeasureItem(e);
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design", typeof(UITypeEditor))]
public System.Windows.Forms.ListBox.ObjectCollection Items
{
get{return this.lb.Items;}
}
private void lb_MouseMove(object sender, MouseEventArgs e)
{
this.lb.Invalidate();
}
private void GComboxBase_Paint(object sender, PaintEventArgs e)
{
for(int i=0;i<this.Items.Count;i++)
{
Rectangle rect=this.lb.GetItemRectangle(i);
if(rect.Bottom<=0)
continue;
else if(rect.Top>this.lb.Height)
break;
else
{
DrawItemState state=DrawItemState.Default;
if(rect.Contains(this.lb.PointToClient(Control.MousePosition)))
{
state|=DrawItemState.Focus;
}
if(i==this.lb.SelectedIndex)
{
state|=DrawItemState.Selected;
}
else
{
}
this.OnDrawItem(new DrawItemEventArgs(e.Graphics,this.Font,rect,i,state));
}
}
}
public int MaxDropDownItems
{
get{return this.maxDrawDownItems;}
set{this.maxDrawDownItems=value;}
}
private void lb_Click(object sender, EventArgs e)
{
this.f_Deactivate(null,null);
}
public int SelectedIndex
{
get{return this.lb.SelectedIndex;}
set{this.lb.SelectedIndex=value;}
}
public object SelectedItem
{
get{return this.lb.SelectedItem;}
set{this.lb.SelectedItem=value;}
}
private void lb_SelectedIndexChanged(object sender, EventArgs e)
{
if(this.SelectedIndexChanged!=null)this.SelectedIndexChanged(this,e);
this.EditControl.Text=this.lb.GetItemText(this.SelectedItem);
}
public override Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
this.gPanel1.BackColor=value;
}
}
public GImage DropDownButtonImage
{
get{return this.gPanel1.GImage;}
set{this.gPanel1.GImage=value;}
}
}
public class GComboxItem
{
public GComboxItem(){}
public GComboxItem(string text){this.Text=text;}
public GComboxItem(string text,Image img):this(text){this.Image=img;}
public object Tag;
public Image Image;
public string Text;
public override string ToString()
{
return this.Text;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -