2015-04-01 4 views
0

У нас есть UserControls, который имеет вид от RichTextBox. Мы хотели бы запретить пользователю вводить любое изображение (с копией) в этом пользовательском элементе управления.Отключить вставку изображений в RichTextBox в Winforms

я нашел несколько мест, где говорит об этом:

В настоящее время я имею это решение:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys)Shortcut.CtrlV || keyData == (Keys)Shortcut.ShiftIns) 
    { 
     if (Clipboard.ContainsImage()) 
     { 
      return false; 
     } 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

, который работает для копирования паста с CTRL + C-CTRL + V, но не в контекстном меню.

EDIT

Я попробовал данное предложение:

public class CustomRichBox : RichTextBox 
{ 
    private const int WM_PASTE = 0x0302; 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_PASTE) 
     { 
      if (Clipboard.ContainsImage()) 
      { 
       return; 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

Но когда я делаю CTRL + V, я не получаю это сообщение

+0

Не правильный ответ, но вот несколько советов о том, как это сделать с неуправляемыми элементами управления редактирования MFC: https://stackoverflow.com/questions/2250759/how-does-a-cricheditctrl-know-a-paste -операция была выполнена и http://stackoverflow.com/questions/2104809/en-protected-and-richedit. Может быть, вы могли бы попытаться использовать это как-то? – dbc

ответ

0

Вы могли бы попытаться переопределить WndProc метод для фильтрации WM_PASTE сообщение:

protected override void WndProc(ref Message m) 
{ 
    // Trap WM_PASTE with image: 
    if (m.Msg == 0x302 && Clipboard.ContainsImage()) 
    { 
     return; 
    } 
    base.WndProc(ref m); 
} 

EDIT
Unfortunatly, этот подход не будет работать, потому что контроль RichTextBox не отправляет WM_PAINT сообщение самому себе. См. Также: Detecting if paste event occurred inside a rich text box.

+0

Ну, в отношении ссылки, которую вы дали: Первое решение не работает с контекстным меню. И основывание чего-то по длине чувствует себя просто грязным. Я имею в виду, что у нас есть какая-то модельная привязка к этим текстам, поэтому, если модель изменит ее значения и отразит это на RichTextBox, она будет обнаружена как вставка – J4N

0

К сожалению, глобальное событие Paste отсутствует, на котором вы можете подписаться, как в WPF. Но, может быть, это для вас решение:

hook on default "Paste" event of WinForms TextBox control

Это работает для меня.

+0

Это должно захватить Ctrl + V и контекстное меню -> вставить? Или только второй? – J4N

+0

Это должно работать для обоих. Я пробовал с успехом. –

+0

Странно, я скопировал их код (см. Мое редактирование), но когда я делаю ctrl + V, он не работает. – J4N

Смежные вопросы