.Net 标准控件与自定义控件 转自:http://www.souzz.net 博客园

转载 2006年05月19日 15:58:00

最近在csdn上讨论textbox的防拷贝。
一般得出的结论是可以重写Form的ProcessCmdKey 方法。

代码如下:

        protected override bool ProcessCmdKey(ref Message msg,Keys keyData)  
        

 
            
if(keyData == (Keys.Control | Keys.C)||keyData ==(Keys.Control | Keys.V))
            
{
                MessageBox.Show(
"不能粘贴,复制");
                
return true;
            }

 
            
else 
                    
return base.ProcessCmdKey(ref msg, keyData); 
//            return false;
 
        }
 


ProcessCmdKey将截获Form的命令按键,并进行处理。
该方法判断 用户是否按下了Ctrl+C和Ctrl+V按键组合。
如果是,则弹出一个对话框,并返回真,这里返回了true,则表示我已经对该事件进行了处理,程序不需要继续对它做别的处理。
否则,调用base.ProcessCmdKey继续对事件做处理。

但是个人认为这样做有很大的问题。
首先,这样做并不能从根本上解决TextBox防拷贝,因为当用户点击鼠标右键的时候,仍然可以激活标准的contextmeun .可以通过该弹出菜单轻松的完成拷贝。

其次,ProcessCmdKey重载自From, 也就是说以该Form为容器的所有子控件上按键都将接受这个重灾方法的处理。
举例来说,我想实现一个Form,其中有一个TextBox1,不能拷贝其上的数据。还有一个TextBox2允许用户粘贴拷贝,那么用这个方法就无法实现,不管是在哪个控件。程序都会无情地弹出一个MessageBox 告诉你不能拷贝。

所以在Form中重载ProcessCmdKey不但实用价值不高,而且给人的感觉非常不好。。。

所以更好的办法就是开发自定义控件。例如在这个应用中的TextBox, 完全可以开发一个NoCopyTextBox。
该控件继承自TextBox.

我们在该控件中重载ProcessCmdKey方法, 并替换掉NoCopyTextBox的默认contextmenu,这样就可以很好的解决上诉问题。
而且在将来的开发中,遇到同样的问题,我们可以直接使用NoCopyTextBox
对于那些不需要禁止Copy的TextBox使用标准控件就好。

NoCopyTextBox代码如下:

 

public class NoCopyTextBox :System.Windows.Forms.TextBox
    
{
        ContextMenu noContext 
=new ContextMenu();
    
        
public NoCopyTextBox()
        
{
            
this.ContextMenu =noContext;
        }


        
private void InitializeComponent()
        
{
        }


        
protected override bool ProcessCmdKey(ref Message msg,Keys keyData)  
        

 
            
if(keyData == (Keys.Control | Keys.C)||keyData ==(Keys.Control | Keys.V))
            
{
                MessageBox.Show(
"不能粘贴,复制");
                
return true;
            }

 
            
else 
                
return base.ProcessCmdKey(ref msg, keyData); 
            
//            return false;
 
        }
 
    }

该控件在构造的时候用一个空contextmenu代替了默认contextmeun,这样,右键点击便什么也出不来了。

所以我想说的是,实际上可以在实际开发中,在以有标准控件的基础上去创造细节不同的控件。这可能比直接使用标准控件麻烦,但总算比重头开始制造控件来的轻松多了:)

所以应用派的程序员还是应该有自己的一套库比较好。

自定义.NET Calarder日历控件(实现博客园日历)

这几天看了下.net 日历控件,去Google了下出来很多,大家都知道.netframework版本中自带的日历控件只有日期没有备注的,比如我在1月1日下面要显示出‘元旦节’这三个字,那要怎么做呢? ...

转自博客园的一篇关于日期格式的文字《.NET中DateTime时间格式转换(附用户定义格式)》

.NET中DateTime时间格式转换(附用户定义格式) 在开发.NET应用程序的时候,会遇到DateTime时间的格式问题,不过对于一般的应用来说,只要设置 System...
  • kimifdw
  • kimifdw
  • 2012年11月01日 09:50
  • 2162

网页设计师的 12 款免费的 Firefox 4 插件(转自:http://www.oschina.net/news/20761/12-best-free-firefox-4-add-ons-for)

Firefox 4 正式版发布没多久,怎么感觉这个版本老了呢?因为现在都 Firefox 7 Beta 了,唉。本文介绍 10 款 Firefox 4 的插件,适合网页设计师使用的包括调试、测试和开发...
  • lslxdx
  • lslxdx
  • 2011年09月23日 14:50
  • 598

在ASP.NET中动态加载内容 用户控件和模板(转http://www.da8848.cn/article/jiaocheng/NET/3838.html)

在ASP.NET中动态加载内容(用户组件和模板)要点:1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板“...

asp.net 编写自定义控件

  • 2014年11月04日 13:43
  • 180KB
  • 下载

ASP.NET自定义控件教程.pdf

  • 2013年08月18日 16:50
  • 742KB
  • 下载

asp.net 自定义控件(2种方法)

一、在类中写自定义控件 自定义DropDownList: 1,首先创建一个cs类文件Controls(采用工厂模式) using System.Collections.Generic; using S...

.net 简单翻页自定义控件

  • 2015年09月19日 23:48
  • 455KB
  • 下载

.net 简单分页自定义控件

  • 2015年08月25日 10:27
  • 574KB
  • 下载

.Net自定义控件 小结

以下内容为转载: 写在前面: .Net已经成为许多软件公司的选择,而.Net自定义WinForm界面控件,也成为编程的热点,越来越多的程序员会开发自己需要的自定义界面控件.小作坊网介绍了多种...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.Net 标准控件与自定义控件 转自:http://www.souzz.net 博客园
举报原因:
原因补充:

(最多只允许输入30个字)