C# EM_CHARFROMPOS, как навести точку на Intptr? - PullRequest
0 голосов
/ 28 апреля 2020

После того, как я получу позицию Caret (x, y), используя GetCaretPos, я хочу SendMessage() из EM_CHARFROMPOS. Проблема в том, что lParam должен иметь тип IntPtr, а результат GetCaretPos - это точка. Как правильно навести точку на IntPtr?

1 Ответ

1 голос
/ 28 апреля 2020

Код должен быть другим, если вы нацелены на элемент управления Rich edit по сравнению с элементом управления , но вы можете черпать вдохновение из кода NET (и вы можете определить несколько версий SendMessage, которые подходят Ваши потребности):

Для текстового поля: https://referencesource.microsoft.com/#System. Windows .Forms / winforms / Managed / System / WinForms / TextBoxBase.cs, 1754

...
var pt = (IntPtr)MAKELONG(pt.X, pt.Y);
SendMessage(handle, EM_CHARFROMPOS, 0, pt);
...
public static int MAKELONG(int low, int high) {
  return (high << 16) | (low & 0xffff);
}

[DllImport("user32", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

Для расширенного текстового поля: https://referencesource.microsoft.com/#system. windows .forms / winforms / Managed / System / WinForms / RichTextBox.cs, 2323

...
var pt = new POINT(pt.X, pt.Y);
SendMessage(handle, EM_CHARFROMPOS, 0, pt);
...

[StructLayout(LayoutKind.Sequential)]
public class POINT
{
  public int x;
  public int y;
}

[DllImport("user32", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, POINT lParam);
...