0

C# のフォーム (System.Windows.Forms) に toolStrip1 を配置し、5 つの toolStrip ボタンを追加しました。ここで、ユーザーがこれらのボタンを toolStrip1 内の別の位置にドラッグして並べ替えられるようにする方法を知りたいと思います。Microsoft の記事で示唆されているように、 toolStrip1.AllowItemReorder を trueに設定し、AllowDropを falseに設定しました。

これで、toolStrip1 でアイテムの再注文の自動処理が有効になります。しかし、それは機能しません-ALTキーを押したままにすると、toolStrip1はユーザーによる並べ替えの試みに反応します。アイテムの並べ替え中にAltキーを押したままにしないために、 DragEvent、DragEnter、DragLeaveを自分で処理する必要がありますか?

もしそうなら、ALT キーを押さずに (Internet Explorer のお気に入りのように) toolStrip1 内の別の位置に 1 つのアイテムをドラッグしたい場合、toolStripButtons を持つ toolStrip でこのイベントがどのように見えるかの例を教えてください。私はこの問題について経験がありません。

4

1 に答える 1

2

まあ、少しハッキーなこのソリューションを使用する必要があるかもしれません。全体のアイデアは、コードでキーを押し続けるAlt必要があるということです。MouseDownイベントで(でも)試しましたPreFilterMessage handlerが、失敗しました。Alt発火時にキーを押し続けるのに適した唯一のイベントはですMouseEnterMouseEnterすべての のイベント ハンドラーを登録する必要があります。マウスがこれらのアイテムの 1 つを離れたら、イベント ハンドラーでキーToolStripItemsを離す必要があります。キーが離された後、キーを送信してフォームをアクティブにする必要があります (そうしないと、 を含むコントロール ボタンであっても、すべてのホバー効果が無視されるように見えます)。動作するコードは次のとおりです。AltMouseLeaveAltESCMinimize, Maximize, Close

public partial class Form1 : Form {
  [DllImport("user32.dll", SetLastError = true)]
  static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
  public Form1(){
     InitializeComponent();
     //Register event handlers for all the toolstripitems initially
     foreach (ToolStripItem item in toolStrip1.Items){
        item.MouseEnter += itemsMouseEnter;
        item.MouseLeave += itemsMouseLeave;
     }
     //We have to do this if we add/remove some toolstripitem at runtime
     //Otherwise we don't need the following code
     toolStrip1.ItemAdded += (s,e) => {
        item.MouseEnter += itemsMouseEnter;
        item.MouseLeave += itemsMouseLeave;
     };
     toolStrip1.ItemRemoved += (s,e) => {
        item.MouseEnter -= itemsMouseEnter;
        item.MouseLeave -= itemsMouseLeave;
     };
  }
  bool pressedAlt;
  private void itemsMouseEnter(object sender, EventArgs e){
        if (!pressedAlt) {
            //Hold the Alt key
            keybd_event(0x12, 0, 0, 0);//VK_ALT = 0x12
            pressedAlt = true;
        }
  }
  private void itemsMouseLeave(object sender, EventArgs e){
        if (pressedAlt){
            //Release the Alt key
            keybd_event(0x12, 0, 2, 0);//flags = 2  -> Release the key
            pressedAlt = false;
            SendKeys.Send("ESC");//Do this to make the GUI active again
        }            
  }
}
于 2013-09-27T15:58:58.730 に答える