BearOcean

Say HelloWorld
随笔 - 19, 文章 - 0, 评论 - 149, 引用 - 4
数据加载中……

.Net 标准控件与自定义控件

最近在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,这样,右键点击便什么也出不来了。

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

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

posted on 2006-04-26 12:11 BearOcean 阅读(1829) 评论(8)  编辑 收藏 网摘 所属分类: .NET

评论

#1楼    回复  引用  查看    

win form
:)
2006-04-26 12:14 | 瓶子      

#2楼    回复  引用  查看    

请问是海洋吗?
2006-04-26 13:10 | 菌哥      

#3楼 [楼主]   回复  引用  查看    

To 请问是海洋吗?

呵呵,不是
2006-04-26 13:24 | BearOcean      

#4楼    回复  引用    

输入框有必要防止拷贝么?
2006-04-26 18:17 | ttt [未注册用户]

#5楼    回复  引用  查看    

其实也可以通过截获Windows 消息来达到屏蔽拷贝与粘贴的功能,同时可以限制用户可以输入的字符,详情请见http://divineeagle.cnblogs.com/articles/385989.html
2006-04-26 21:44 | DivineEagle      

#6楼 [楼主]   回复  引用  查看    

To:ttt
我并不是说TextBox防拷贝有什么实用价值,只是这个最简单,所以那它来举例罢了。

To:DivineEagle
你的方法我看了。有机会来探讨一下这个问题:)
关于WndProc
2006-04-27 08:48 | BearOcean      

#7楼    回复  引用  查看    

学到也。。。
2006-04-27 10:26 | Konimeter      

#8楼    回复  引用    

学习
2006-04-27 16:05 | habin [未注册用户]




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索
[推荐职位]上海盛大网络招聘.Net开发工程师

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: