これを行う最も簡単な方法は、ドラッグしているポップアップ メニューのハンドルを取得することだと思います。ハンドルを取得したら、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));
}
}
このサンプルは、メニューの左上隅に 20x20 の赤い正方形を描画するだけです。ドロップ ラインをレンダリングするには、ドロップ ラインがどこにあるべきかを正確に把握するためにもう少し作業を行う必要があり、そこに必要なものを描画します。両端に小さな部分矢印が付いた高さ 2 ピクセルの黒い線に見えるので、模倣するのは難しくありません。
描いたものを片付けることを心配する必要があるかもしれませんが、私はそれを疑います. ポップアップ メニュー ウィンドウは一時的なもので、ドロップ カーソルをその上に移動すると自動的に再描画されると思います。そうでない場合は、ドロップ ラインの位置が変わるたびに、ポップアップ メニュー ウィンドウに再描画メッセージを送信する必要があります。
複数のネストされたメニューを開いている場合でも機能するように見えます (おそらくすべてのクラス名は「#32768」です) - FindWindow
z オーダーで常に一番上のメニューを返すようです。もう 1 つの良い点は、メニュー ウィンドウ自体に描画しているため、線が半透明のドロップ カーソルの下に表示されることです。
皮肉なことに、私はこれをさまざまなプログラムやメニューでテストしました。Internet Explorer の [お気に入り] メニューを除いて、それらすべてとすべてのメニューで機能しました。その特定のメニューは、組み込みの Windows メニュー以外のものを使用していると思います。通常の .Net メニューでこれを行っている場合は、問題なく動作するはずです。