您的位置:首页 > 其它

RichTextBox粘贴两次以及去掉粘贴内容的格式问题

2012-07-21 12:13 302 查看
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,也可以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐