Я думаю, что самый простой способ сделать это - получить ручку всплывающего меню, которое вы перетаскиваете. Когда у вас есть ручка, вы можете нарисовать ее непосредственно с помощью объекта Graphics
.
Для получения рукоятки, вероятно, потребуется некоторый API mojo. Я ищу его.
Обновление: не очень много, хотя есть иронический улов (см. Ниже). Для этого добавьте
using System.Runtime.InteropServices;
в верхней части вашей формы или класса или что угодно. Добавить это объявление где-то:
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindowA(string lpClassName,
string lpWindowName);
окно всплывающего меню (то есть часть, которую вы обычно не видите) является верхним окном с именем класса «# 32768». Этот код показывает, как получить окна в меню для ручки и рисовать прямо на него:
IntPtr hWnd = FindWindowA("#32768", null);
if (hWnd != IntPtr.Zero)
{
using (Graphics g = Graphics.FromHwnd(hWnd))
{
g.FillRectangle(Brushes.Red,
new Rectangle(0, 0, 20, 20));
}
}
Этот пример просто рисует 20х20 красный квадрат в верхнем левом углу меню. Чтобы отобразить линию вывода, вам нужно будет немного поработать, чтобы выяснить, где именно это должно быть, и затем нарисовать все, что вы хотите. Мне кажется, что это всего лишь двухпиксельная черная линия с небольшими частичными стрелками на каждом конце, поэтому ее не должно быть трудно подражать.
Возможно, вам придется беспокоиться о том, чтобы очистить все, что вы рисуете, но я в этом сомневаюсь. Окна всплывающих меню являются временными, и я думаю, что они будут автоматически перерисовываться в любом случае, когда вы перемещаете курсор над ними. Если нет, вам может потребоваться отправить сообщение перерисовывания в окно всплывающего меню каждый раз, когда строка сбрасывания меняет позицию.
Он работает, даже если у вас открыто несколько вложенных меню (все предположительно имеют имя класса «# 32768»). FindWindow
всегда возвращает самый верхний номер в z-порядке. Еще одна хорошая вещь - потому что вы рисуете на самом окне меню, линия будет находиться под полупрозрачным курсором, который вы хотите.
Иронический улов: я проверил это на множестве различных программ и меню. Он работал над всеми ними и всеми меню, кроме меню «Избранное» в Internet Explorer. Я предполагаю, что в этом конкретном меню используется нечто иное, чем встроенные меню Windows. Если вы делаете это с помощью обычных меню .Net, он должен работать нормально.
Я * думаю * это то, о чем вы просите - можете откатиться, если это не так. – MusiGenesis
@Bryan: вам не нужно указывать язык в названии, так как он находится в тегах. –