龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

ASP.NET编写组件控件实例:多列下拉框和鼠标相关组件(2)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
/// summary /// 鼠标按下事件 /// /summary /// paramname="sender"/param /// paramname="e"/param private void SizableControl_MouseDown( object sender,MouseEventArgse) { if ( ! m_Enable) return ; m

       /// <summary>
        
/// 鼠标按下事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void SizableControl_MouseDown(object sender, MouseEventArgs e)
        {
            
if (!m_Enable)
                
return;

            m_ResizeOriginalPoint 
= Control.MousePosition;
        }

        
/// <summary>
        
/// 鼠标移动事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void SizableControl_MouseMove(object sender, MouseEventArgs e)
        {
            
if (!m_Enable)
                
return;

            
if (e.Button == MouseButtons.None)
            {
                
this.CheckMousePoint(sender as Control, e.Location);
                
return;
            }

            
if (e.Button != MouseButtons.Left)
                
return;

            Point OffsetPoint 
= Control.MousePosition;
            OffsetPoint.Offset(
-m_ResizeOriginalPoint.X, -m_ResizeOriginalPoint.Y);

            
switch (m_HandleArea)
            {
                
case ResizeHandleAreaEnum.TopLeft:
                    
this.SetControlBound(OffsetPoint.X, OffsetPoint.Y, -OffsetPoint.X, -OffsetPoint.Y);
                    
break;
                
case ResizeHandleAreaEnum.TopCenter:
                    
this.SetControlBound(0, OffsetPoint.Y, 0-OffsetPoint.Y);
                    
break;
                
case ResizeHandleAreaEnum.TopRight:
                    
this.SetControlBound(0, OffsetPoint.Y, OffsetPoint.X, -OffsetPoint.Y);
                    
break;
                
case ResizeHandleAreaEnum.CenterLeft:
                    
this.SetControlBound(OffsetPoint.X, 0-OffsetPoint.X, 0);
                    
break;
                
case ResizeHandleAreaEnum.CenterRight:
                    
this.SetControlBound(00, OffsetPoint.X, 0);
                    
break;
                
case ResizeHandleAreaEnum.BottomLeft:
                    
this.SetControlBound(OffsetPoint.X, 0-OffsetPoint.X, OffsetPoint.Y);
                    
break;
                
case ResizeHandleAreaEnum.BottomCenter:
                    
this.SetControlBound(000, OffsetPoint.Y);
                    
break;
                
case ResizeHandleAreaEnum.BottomRight:
                    
this.SetControlBound(00, OffsetPoint.X, OffsetPoint.Y);
                    
break;
                
case ResizeHandleAreaEnum.Center:
                
default:
                    
break;
            }

            
this.m_ResizeOriginalPoint = Control.MousePosition;
        }

        
/// <summary>
        
/// 鼠标离开事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void SizableControl_MouseLeave(object sender, EventArgs e)
        {
            
if (!m_Enable)
                
return;

            (sender 
as Control).Cursor = Cursors.Default;
            
this.m_ResizableControl.Cursor = Cursors.Default;
        }

其他方法都是辅助检测和调整坐标用的。下面介绍如何实现自定义的UITypeEditor。这里定义了一个枚举ResizeHandleAreaEnum,用来标识调整大小的区域。因为设置的响应操作的区域允许有多个,所以这些枚举值必须都是2的次方数,在二进制中表示则都只有一位是1的,这样就可以通过位操作来解析值了。

Code

枚举定义好之后,在项目中添加一个自定义控件,在其中放置8CheckBox,设置Appearance属性为Button外观。然后排布为虚拟边框的效果,如下图:

UITypeEdtior
 

该控件主要是将ResizeHandleAreaEnum枚举值和CheckBox控件的选中状态对应起来,通过位操作来解析和设置响应操作的区域枚举,内部代码如下:

Code

 

实现IExtenderProvider接口后,将组件拖放到窗体上,设置相关HandleControl之后,则会为其内部控件增加HandleMove属性,效果如下图:

扩展属性
 

接下来介绍ResizableComponent可改变大小组件的实现。

该组件的类图如下:
ResizableComponent类图
ResizableComponent类详细信息

 

组件的类图和类详细信息
MovableComponent组件类图
MovableComponent类详细信息
 

MovableComponent组件包含5个属性:

Enable:指示组件是否可用

EnableInnerControl:指示是否允许HandleControl控件的内部控件响应鼠标操作。

HandleControl:响应鼠标操作的控件,可以和被移动的控件不一致,一般是被移动控件内部的控件。

MovableControl:被移动的控件。

MoveableDirection:控件可以被移动的方向,默认为All,不限制移动方向。


精彩图集

赞助商链接