Да, вы можете использовать все API RichText с вашим элементом управления RichTextBox.
Вам может быть интересно взглянуть на следующие сайты:
http://www.pinvoke.net/default.aspx/user32.sendmessage - как отправлять сообщения в окна с помощью p / invoke.
Вы можете использовать свойство Handle
RichTextBox
, чтобы получить дескриптор окна этого элемента управления, а затем отправлять ему сообщения .
Также посмотрите на эти включаемые файлы, поставляемые с SDK от Microsoft, которые не будут использоваться непосредственно в C #, но эти файлы содержат все константы, которые вам могут понадобиться, такие как WB_ISDELIMITER
, WB_CLASSIFY
и другие.
В следующем примере I
продемонстрировать, как использовать API
при условии.
EDIT:
Этот новый пример имеет код, помеченный как небезопасный, но он лучше, потому что он не страдает от проблемы односимвольной строки, поскольку я могу иметь параметр char*
и манипулировать им. старый образец следует за этим:
Это код C # , а не C ++ ... чтобы скомпилировать его, вам нужно перейти к параметрам проекта и установить флажок , чтобы разрешить небезопасный код для запуска .
Щелкните правой кнопкой мыши проект -> Свойства (Alt + Enter) -> Построить -> Общие -> Разрешить небезопасный код (необходимо проверить)
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace q6359774
{
class MyRichTextBox : RichTextBox
{
const int EM_SETWORDBREAKPROC = 0x00D0;
const int EM_GETWORDBREAKPROC = 0x00D1;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
this.Text = "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz";
NewMethod();
}
unsafe private void NewMethod()
{
if (!this.DesignMode)
SendMessage(this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(new EditWordBreakProc(MyEditWordBreakProc)));
}
[DllImport("User32.DLL")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
unsafe delegate int EditWordBreakProc(char* lpch, int ichCurrent, int cch, int code);
unsafe int MyEditWordBreakProc(char* lpch, int ichCurrent, int cch, int code)
{
const int WB_ISDELIMITER = 2;
const int WB_CLASSIFY = 3;
if (code == WB_ISDELIMITER)
{
char ch = *lpch;
return ch == '-' ? 0 : 1;
}
else if (code == WB_CLASSIFY)
{
char ch = *lpch;
var vResult = Char.GetUnicodeCategory(ch);
return (int)vResult;
}
else
{
var lpch2 = lpch;
// in this case, we must find the begining of a word:
for (int it = ichCurrent; it < cch; it++)
{
char ch = *lpch2;
if (it + 1 < cch && lpch2[0] == '-' && lpch2[1] != '-')
return it;
if (lpch2[0] == '\0')
return 0;
lpch2++;
}
}
return 0;
}
}
}
Старый образец кода
Образец состоит из класса, который наследуется от RichTextBox и размещает пользовательский обработчик, используя EM_SETWORDBREAKPROC
. Этот класс будет разбивать строки только в том случае, если над символом - Ни до, ни после.
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace q6359774
{
class MyRichTextBox : RichTextBox
{
const int EM_SETWORDBREAKPROC = 0x00D0;
const int EM_GETWORDBREAKPROC = 0x00D1;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
this.Text = "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz";
if (!this.DesignMode)
SendMessage(this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(new EditWordBreakProc(MyEditWordBreakProc)));
}
[DllImport("User32.DLL")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
delegate int EditWordBreakProc(string lpch, int ichCurrent, int cch, int code);
int MyEditWordBreakProc(string lpch, int ichCurrent, int cch, int code)
{
const int WB_ISDELIMITER = 2;
const int WB_CLASSIFY = 3;
if (code == WB_ISDELIMITER)
{
if (lpch.Length == 0 || lpch == null) return 0;
char ch = lpch[ichCurrent];
return ch == '-' ? 0 : 1;
}
else if (code == WB_CLASSIFY)
{
if (lpch.Length == 0 || lpch == null) return 0;
char ch = lpch[ichCurrent];
var vResult = Char.GetUnicodeCategory(ch);
return (int)vResult;
}
else
{
if (lpch.Length == 0 || lpch == null) return 0;
for (int it = ichCurrent; it < lpch.Length; it++)
{
char ch = lpch[it];
if (ch != '-') return it;
}
}
return 0;
}
}
}
Это всего лишь черновик, поэтому вам, возможно, придется улучшить его, чтобы достичь своих целей.
Поместите элемент управления в форму окна и запустите.
Измените размер окна и посмотрите, хотите ли вы это сделать!
Вам придется искать границы слов ... Мне пока не удалось заставить его работать.