C#如何实现可编辑自定义控件(从Control类继承)

jickie阿文 2007-02-28 03:08:17
如题,从Control类继承时,如何实现用户文本输入,达到和TextBox的效果?
(第一次发帖,希望各位高手挑战)
...全文
1468 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chendong152 2012-06-14
  • 打赏
  • 举报
回复
mark
jickie阿文 2007-03-02
  • 打赏
  • 举报
回复
protected virtual void AddItemsCore(object[] value)
{
if (((value == null) ? 0 : value.Length) != 0)
{
this.BeginUpdate();
try
{
this.Items.AddRangeInternal(value);
}
finally
{
this.EndUpdate();
}
}
}

public void BeginUpdate()
{
base.BeginUpdateInternal();
}

private void CheckNoDataSource()
{
if (base.DataSource != null)
{
throw new ArgumentException(System.Windows.Forms.SR.GetString("DataSourceLocksItems"));
}
}

private void ChildWmGetObject(ref Message m)
{
if (((m.HWnd == this.editHandle) || (m.HWnd == this.listHandle)) && (-4 == ((int) m.LParam)))
{
Guid refiid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
try
{
AccessibleObject accessibleImplemention = null;
System.Windows.Forms.UnsafeNativeMethods.IAccessibleInternal o = null;
if (m.HWnd == this.editHandle)
{
if (this.editAccessibleObject == null)
{
System.Windows.Forms.IntSecurity.UnmanagedCode.Assert();
try
{
accessibleImplemention = new ChildAccessibleObject(this, this.editHandle);
this.editAccessibleObject = new InternalAccessibleObject(accessibleImplemention);
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
o = this.editAccessibleObject;
}
else
{
if (this.listAccessibleObject == null)
{
System.Windows.Forms.IntSecurity.UnmanagedCode.Assert();
try
{
accessibleImplemention = new ChildAccessibleObject(this, this.listHandle);
this.listAccessibleObject = new InternalAccessibleObject(accessibleImplemention);
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
o = this.listAccessibleObject;
}
IntPtr handle = Marshal.GetIUnknownForObject(o);
try
{
m.Result = System.Windows.Forms.UnsafeNativeMethods.LresultFromObject(ref refiid, m.WParam, new HandleRef(this, handle));
}
finally
{
Marshal.Release(handle);
}
return;
}
catch (Exception exception)
{
throw new InvalidOperationException(System.Windows.Forms.SR.GetString("RichControlLresult"), exception);
}
}
this.DefChildWndProc(ref m);
}
jickie阿文 2007-03-02
  • 打赏
  • 举报
回复
下面是ComboBox源码:
namespace System.Windows.Forms
{
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Globalization;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;

[DefaultEvent("SelectedIndexChanged"), DefaultProperty("Items"), Designer("System.Windows.Forms.Design.ComboBoxDesigner, System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public class ComboBox : ListControl
{
private bool canFireLostFocus = false;
private GCHandle childWindowRoot;
private const int DefaultSimpleStyleHeight = 150;
private IntPtr dropDownHandle;
private InternalAccessibleObject editAccessibleObject;
private IntPtr editHandle;
private IntPtr editWndProc;
private static readonly object EVENT_DRAWITEM = new object();
private static readonly object EVENT_DROPDOWN = new object();
private static readonly object EVENT_DROPDOWNSTYLE = new object();
private static readonly object EVENT_MEASUREITEM = new object();
private static readonly object EVENT_SELECTEDINDEXCHANGED = new object();
private static readonly object EVENT_SELECTEDITEMCHANGED = new object();
private static readonly object EVENT_SELECTIONCHANECOMMITTED = new object();
private bool fireLostFocus = true;
private bool fireSetFocus = true;
private bool integralHeight = true;
private ObjectCollection itemsCollection;
private InternalAccessibleObject listAccessibleObject;
private IntPtr listHandle;
private IntPtr listWndProc;
private short maxDropDownItems = 8;
private bool mouseEvents;
private bool mouseInEdit;
private bool mousePressed;
private short prefHeightCache = -1;
private static readonly int PropDrawMode = PropertyStore.CreateKey();
private static readonly int PropDropDownWidth = PropertyStore.CreateKey();
private static readonly int PropItemHeight = PropertyStore.CreateKey();
private static readonly int PropMaxLength = PropertyStore.CreateKey();
private static readonly int PropStyle = PropertyStore.CreateKey();
private int requestedHeight;
private int selectedIndex = -1;
private bool selectedValueChangedFired = false;
private bool sorted;

[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
public event EventHandler BackgroundImageChanged
{
add
{
base.BackgroundImageChanged += value;
}
remove
{
base.BackgroundImageChanged -= value;
}
}

[System.Windows.Forms.SRDescription("drawItemEventDescr"), System.Windows.Forms.SRCategory("CatBehavior")]
public event DrawItemEventHandler DrawItem
{
add
{
base.Events.AddHandler(EVENT_DRAWITEM, value);
}
remove
{
base.Events.RemoveHandler(EVENT_DRAWITEM, value);
}
}

[System.Windows.Forms.SRDescription("ComboBoxOnDropDownDescr"), System.Windows.Forms.SRCategory("CatBehavior")]
public event EventHandler DropDown
{
add
{
base.Events.AddHandler(EVENT_DROPDOWN, value);
}
remove
{
base.Events.RemoveHandler(EVENT_DROPDOWN, value);
}
}

[System.Windows.Forms.SRDescription("ComboBoxOnDropDownDescr"), System.Windows.Forms.SRCategory("CatBehavior")]
public event EventHandler DropDownStyleChanged
{
add
{
base.Events.AddHandler(EVENT_DROPDOWNSTYLE, value);
}
remove
{
base.Events.RemoveHandler(EVENT_DROPDOWNSTYLE, value);
}
}

[System.Windows.Forms.SRDescription("measureItemEventDescr"), System.Windows.Forms.SRCategory("CatBehavior")]
public event MeasureItemEventHandler MeasureItem
{
add
{
base.Events.AddHandler(EVENT_MEASUREITEM, value);
this.UpdateItemHeight();
}
remove
{
base.Events.RemoveHandler(EVENT_MEASUREITEM, value);
this.UpdateItemHeight();
}
}

[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
public event PaintEventHandler Paint
{
add
{
base.Paint += value;
}
remove
{
base.Paint -= value;
}
}

[System.Windows.Forms.SRCategory("CatBehavior"), System.Windows.Forms.SRDescription("selectedIndexChangedEventDescr")]
public event EventHandler SelectedIndexChanged
{
add
{
base.Events.AddHandler(EVENT_SELECTEDINDEXCHANGED, value);
}
remove
{
base.Events.RemoveHandler(EVENT_SELECTEDINDEXCHANGED, value);
}
}

[System.Windows.Forms.SRDescription("selectionChangeCommittedEventDescr"), System.Windows.Forms.SRCategory("CatBehavior")]
public event EventHandler SelectionChangeCommitted
{
add
{
base.Events.AddHandler(EVENT_SELECTIONCHANECOMMITTED, value);
}
remove
{
base.Events.RemoveHandler(EVENT_SELECTIONCHANECOMMITTED, value);
}
}

public ComboBox()
{
base.SetStyle(ControlStyles.StandardClick | ControlStyles.UserPaint, false);
this.requestedHeight = 150;
}
jickie阿文 2007-03-02
  • 打赏
  • 举报
回复
其实只是想体验一下从零开发控件的感觉。
正在借鉴系统ComboBox源码。
搞懂之后,再告诉大家。就此揭帖。
谢谢,各位参与。
GavinLv 2007-03-01
  • 打赏
  • 举报
回复
可以考虑用Reflector看看TextBox源代码,但是还是推荐看看有没有别的解决方案,这个难度有点高,感觉不划算
北京的雾霾天 2007-02-28
  • 打赏
  • 举报
回复
为什么不用TextBox来编辑呢?
Window中编辑都是通过TextBox来实现的啊.
jickie阿文 2007-02-28
  • 打赏
  • 举报
回复
其他功能基本实现,参与也就是学习,大家一起交流经验,步入技术顶端。
jickie阿文 2007-02-28
  • 打赏
  • 举报
回复
本来目的是扩展ComboBox(Win),主要功能有:多列下拉显示,左右中对齐方式,多种边框,。。
现在的难点是可编辑的实现。
难度是大一点,不然我也就不发帖了。请大家多多参与。
北京的雾霾天 2007-02-28
  • 打赏
  • 举报
回复
完全达到和TextBox的效果一样可能不太容易,难做的一点是光标的显示问题,如果要求不高,可以通过画图的方式来显示处理用户按下的键值.

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧