找回密码
 立即注册

QQ登录

只需一步,快速开始

ghostlyt

初级会员

18

主题

76

帖子

214

积分

初级会员

积分
214

活字格认证微信认证勋章

ghostlyt
初级会员   /  发表于:2015-11-28 17:45  /   查看:6583  /  回复:6
想实现控件自定义的粘贴行为,比如粘贴时要过滤某些特殊字符,该怎么做?
重载的WndProc方法里无法拦截到WM_PASTE消息。。
Inputman是否提供了相应的接口?

6 个回复

倒序浏览
Leo
超级版主   /  发表于:2015-11-30 14:48:00
沙发
回复 1楼ghostlyt的帖子

通常情况下,不允许粘贴的字符也不会允许输入。具体的你们的需求是什么?难道说你们希望某些字符/字符组合可以输入,但是不允许粘贴?是这样吗?
回复 使用道具 举报
Leo
超级版主   /  发表于:2015-11-30 15:59:00
板凳
如果非要单纯的判断是否是粘贴导致的文本变化,这个比较复杂,没有专门的接口搞这个事情,因为有以下时机可以执行Paste操作
  • 某些按键组合(注意我没有说CTRL+V,因为还有其他组合也能执行Paste)
  • 用户定义的快捷键(GcShortcut),实际上是调用控件上的Paste或者ShortcutPaste方法
  • 右键菜单

硬判的话,基本无解。
所以我为啥需要和你确认需求,是否是输入也不能输入特定的禁用字符/字符组合。

评分

参与人数 1金币 +999 收起 理由
Alice + 999 奖励金币

查看全部评分

回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2015-11-30 18:31:00
地板
现在是这样的,GcNumber控件,按业务是不允许输入负值,但是可以存在负值的情况(根据某些计算得出的负值)。
键盘输入符号的情况可以通过按键事件进行屏蔽,
但是粘贴行为中不能控制负数的情况。所以想在粘贴前进行预处理,将负值屏蔽掉。
回复 使用道具 举报
Leo
超级版主   /  发表于:2015-12-1 10:04:00
5#
回复 4楼ghostlyt的帖子

了解。
你看这么着能不能解决你的问题。
有一个神秘的属性叫做ValueSign,默认情况下你把它设置为Positive,仅允许输入正值(这样连你键盘输入的处理也免了)
我猜测通过某些计算得出负值的情况肯定是通过代码设置Value属性送进去的。这样的话,我们做一些特殊的处理,允许负值设置进去,代码如下:
============
  1.         public Form1()
  2.         {
  3.             InitializeComponent();
  4.             this.gcNumber1.ValueSign = ValueSignControl.Positive;
  5.             this.gcNumber1.TextChanging += gcNumber1_TextChanging;
  6.         }
  7.         private void SetNegativeValueToGcNumber(GcNumber gcNumber, decimal value)
  8.         {
  9.             // 本方法设计用来送入负值,一切正值皆不干活。
  10.             System.Diagnostics.Debug.Assert(value < 0m);
  11.             gcNumber1.ValueSign = ValueSignControl.NoControl;
  12.             gcNumber1.Value = value;
  13.         }
  14.         void gcNumber1_TextChanging(object sender, TextChangingEventArgs e)
  15.         {
  16.             // 虽然基于某些业务要求,Number可以计算出正值,但是原则上一旦开始输入,就将这个正值的限制重置回来。
  17.             var text = e.Result;
  18.             var gcNumber = sender as GcNumber;
  19.             if (gcNumber == null)
  20.             {
  21.                 return;
  22.             }
  23.             if (string.IsNullOrEmpty(text))
  24.             {
  25.                 gcNumber.ValueSign = ValueSignControl.Positive;
  26.                 return;
  27.             }
  28.             decimal targetValue;
  29.             if (decimal.TryParse(text, out targetValue))
  30.             {
  31.                 if (targetValue >= 0)
  32.                 {
  33.                     gcNumber.ValueSign = ValueSignControl.Positive;
  34.                 }
  35.             }
  36.         }
  37.         private void button1_Click(object sender, EventArgs e)
  38.         {
  39.             SetNegativeValueToGcNumber(this.gcNumber1, -1);
  40.         }
复制代码
============
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2015-12-1 20:33:00
6#
回复 5楼Leo的帖子

这么黑科技真的好吗-_-||
ValueSign变为Positive的时候,好像既存的负值会被清掉。
不过大体思想了解了,回头再检讨一下需求,此问题可以关闭了。
回复 使用道具 举报
Leo
超级版主   /  发表于:2015-12-2 08:41:00
7#
回复 6楼ghostlyt的帖子

&gt;ValueSign变为Positive的时候,好像既存的负值会被清掉。
是的,
不过我是在后期的文本发生变化的时候重置ValueSign为Positive,如果你希望通过代码设负值,则可以直接调用SetNegativeValueToGcNumber()方法送进去负值。
重点是这个黑科技省去了很多试图控制按键行为,Copy/Paste的麻烦。

可以仔细查看以下最原始的业务需求,看看这个方案是否有所帮助。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部