2013-09-27 3 views
0

У меня есть toolStrip1, размещенный на форме (System.Windows.Forms) на C# и добавленный к нему пять кнопок toolStrip. Теперь мне интересно, как позволить пользователю переупорядочить эти кнопки, перетащив их на другие позиции в toolStrip1. Я установил для инструмента toolStrip1.AllowItemReorder значение true и AllowDrop для false как указано в статье Microsoft.Переупорядочить toolStrip элементы внутри одного инструментаStrip, не удерживая клавишу ALT нажатой в C# VS 2008

Теперь необходимо включить автоматическую обработку переупорядочения элементов в toolStrip1. Но это не сработает - только если я удерживаю ALT-Key нажатым, toolStrip1 реагирует на попытки переупорядочения пользователя. Нужно ли мне обрабатывать DragEvent, DragEnter, DragLeave сам, чтобы избежать удерживания клавиши Alt во время переупорядочения элементов?

Если это так, пожалуйста, дайте мне пример того, как эти события будут выглядеть на toolStrip с помощью toolStripButtons, если я хочу перетащить один элемент в другую позицию в toolStrip1 без каких-либо ALT-ключей (например, Internet Explorer Favorites делает). Я не испытываю этого.

ответ

2

Ну, вам, возможно, придется использовать это решение, которое немного взломано. Вся идея заключается в том, что вы должны нажать и удерживать Alt ключ по коду. Я пробовал с событием MouseDown (даже в PreFilterMessage handler), но он провалился. Единственное событие, подходящее для удержания клавиши Alt при его запуске - MouseEnter. Вы должны зарегистрировать обработчик события MouseEnter для всех ToolStripItems, когда мышь выйдет из одного из этих элементов, вам необходимо освободить ключ Alt в обработчике событий MouseLeave. После выхода ключа Alt мы должны отправить ключ ESC, чтобы сделать форму активной (в противном случае все эффекты зависания, похоже, будут проигнорированы даже на кнопках управления, включая Minimize, 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 
     }    
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^