WinForms TabControl проблема перетаскивания - PullRequest
5 голосов
/ 21 февраля 2011

У меня есть два TabControls, и я реализовал возможность перетаскивания вкладок между двумя элементами управления.Он прекрасно работает, пока вы не перетащите последнюю вкладку с одного из элементов управления.Затем элемент управления прекращает прием капель, и я не могу вернуть вкладки на этот элемент управления.

Код перетаскивания для одного направления приведен ниже.Обратное направление совпадает с замененными именами элементов управления.

// Source TabControl
private void tabControl1_MouseMove(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Left) 
    this.tabControl1.DoDragDrop(this.tabControl1.SelectedTab, DragDropEffects.All);
}

//Target TabControl 
private void tabControl2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
  if (e.Data.GetDataPresent(typeof(TabPage))) 
    e.Effect = DragDropEffects.Move;
  else 
    e.Effect = DragDropEffects.None; 
} 

private void tabControl2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) 
{
  TabPage DropTab = (TabPage)(e.Data.GetData(typeof(TabPage))); 
  if (tabControl2.SelectedTab != DropTab)
    this.tabControl2.TabPages.Add (DropTab); 
}

1 Ответ

5 голосов
/ 21 февраля 2011

Вам необходимо переопределить WndProc в TabControl и превратить HTTRANSPARENT в HTCLIENT в сообщении WM_NCHITTEST.

Например:

const int WM_NCHITTEST = 0x0084;
const int HTTRANSPARENT = -1;
const int HTCLIENT = 1;

//The default hit-test for a TabControl's
//background is HTTRANSPARENT, preventing
//me from receiving mouse and drag events
//over the background.  I catch this and 
//replace HTTRANSPARENT with HTCLIENT to 
//allow the user to drag over us when we 
//have no TabPages.
protected override void WndProc(ref Message m) {
    base.WndProc(ref m);
    if (m.Msg == WM_NCHITTEST) {
        if (m.Result.ToInt32() == HTTRANSPARENT)
            m.Result = new IntPtr(HTCLIENT);
    }
}
...