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,也可以

  • 相关阅读:
    eureka的fetch-registry属性解释
    数据结构设计
    typescript let和const区别
    JDK8新特性
    Synchronized的内存可见性
    java实现打印功能
    idea单元测试jpa注入失败问题----来自Spring Cloud微服务实战-idea版的 廖师兄的product
    eclipse快速生成接口
    读取 Excel 之 Epplus
    [转][Dapper]参数化查询慢
  • 原文地址:https://www.cnblogs.com/Memory/p/2602176.html
Copyright © 2011-2022 走看看