zoukankan      html  css  js  c++  java
  • RichTextBox粘贴两次以及去掉粘贴内容的格式问题

    RichTextBox是一个支持RTF的文本框,但很多情况下我们并不希望用户采用快捷键(如CTRL+V)来粘贴有格式的内容,或者我们需要清除用户粘贴的内容的格式,怎么办呢? 其实非常简单: 去掉格式:把剪切板的字符串取出来放到一个变量中(这个过程就去掉格式了),再将变量中的值设回剪贴板,然后粘贴就ok了

    private void tbClob_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Control && e.KeyCode == Keys.V)
                {
                    IDataObject dataObj = Clipboard.GetDataObject();
                    if (dataObj.GetDataPresent(DataFormats.StringFormat))
                    {
                        e.Handled = true; //去掉格式文本的格式 
                        var txt = (string) Clipboard.GetData(DataFormats.StringFormat);
                        Clipboard.Clear();
                        Clipboard.SetData(DataFormats.StringFormat, txt);
                        tbClob.Paste();
                    }
                }
            }
    
            private void tbTemplate_KeyDown(object sender, KeyEventArgs e)
            {
                //防止ctrl+v粘贴有格式的文本进来 
                if (e.Control && e.KeyCode == Keys.V)
                {
                    e.Handled = true;
                    //这句是关键,不然你会发现粘贴了两次 
                    v.miPaste.PerformClick();
                }
            }
    
            private void miPaste_Click(object sender, EventArgs e)
            {
                v.tbTemplate.Paste(DataFormats.GetFormat(TextDataFormat.UnicodeText.ToString()));
            }

    网上有很多种方式(纯粹是扩展阅读,可以不看),例如自己扩展一个RichTextBox,在其中拦截WM_PASTE消息,如下:

    namespace WindowsApplication2
    {
        internal class RichTextPaste : RichTextBox
        {
            protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                switch (m.Msg)
                {
                    case 257:
                        if ((int) m.LParam == -1071841279 && (int) m.WParam == 17)
                        {
                            MessageBox.Show("Fired");
                        }
                        break;
                }
            }
        }
    }

    有用,比较复杂,还有消息判断简单的,如:

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if(m.Msg== WM_PASTE)//0x302:WM_PASTE 还有一种处理手法,就是注册本应用只接收文本类的粘贴,采用:RegisterClipboardFormat,也可以
        {
        }
    }

    采用:RegisterClipboardFormat,也可以

  • 相关阅读:
    笔记(二) C#sql语句
    [叩响C#之门]写给初学者:多线程系列(七)——互锁(Interlocked类)
    C# Async与Await的使用
    C#线程锁使用全功略
    一个C#的加锁解锁示例
    【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
    Control.BeginInvoke()和delegate的BeginInvoke()的区别
    crm04 action操作 和 多级过滤
    VIM和sed 替换字符串方法
    解决Centos关闭You have new mail in /var/spool/mail/root提示(转)
  • 原文地址:https://www.cnblogs.com/Memory/p/2602176.html
Copyright © 2011-2022 走看看