1

たとえば、Google Chrome/FireFox の機能を模倣したいのですが、ブックマークを再配置するとき、メニュー項目をドラッグすると、次のように提案されたドロップ ポイントに黒い線が作成されます。

代替テキスト http://www.freeimagehosting.net/uploads/977900a13a.jpg

メニューを再配置するためのドラッグ/ドロップ機能を既に実装していますが、これらの区切り線を追加機能として追加したいと考えています。

.NET Framework (3.5) 内でこれを行う方法はありますか、それとも Win32 API 呼び出しに頼る必要がありますか? その道に進む前に聞きたかっただけです。

4

2 に答える 2

0

純粋な .NET コードでこれを行う一般的な方法は、ドロップ ポイント ラインのように見えるように色とサイズが設定されたボーダレス フォームを作成することです。また、このフォームで TopMost プロパティを True に設定します。

次に、MouseDown/MouseUp/MouseMove イベントを使用して、ユーザー アクションに応じていつどこにドロップ ラインを表示するかを決定します。

ドロップ ライン フォームを正しく配置するには、 Control.PointToScreenおよび/またはControl.RectangleToScreen (およびおそらく Control.PointToClient) メソッドを調べる必要があります。

于 2010-04-15T02:07:03.810 に答える
0

これを行う最も簡単な方法は、ドラッグしているポップアップ メニューのハンドルを取得することだと思います。ハンドルを取得したら、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」です) - FindWindowz オーダーで常に一番上のメニューを返すようです。もう 1 つの良い点は、メニュー ウィンドウ自体に描画しているため、線が半透明のドロップ カーソルの下に表示されることです。

皮肉なことに、私はこれをさまざまなプログラムやメニューでテストしました。Internet Explorer の [お気に入り] メニューを除いて、それらすべてとすべてのメニューで機能しました。その特定のメニューは、組み込みの Windows メニュー以外のものを使用していると思います。通常の .Net メニューでこれを行っている場合は、問題なく動作するはずです。

于 2010-04-15T02:28:05.923 に答える