2010-12-13 2 views
0

Я создаю программу телефонной книги «hightech», где, если мне удастся, пользователи смогут перетаскивать номер или лицо или местоположение на страницу профиля другого, связывая их вместе.Проблемы с Visual C++ с перетаскиванием перетаскивания

Элементы (например, числа или лица) представлены классом, полученным из System :: Windows :: Forms :: UserControl (так что это по существу панель с надписями на ней и данные о представленном элементе, хранящемся в его переменных-членах) , Эта панель перетаскивается в окно, которое передает его конструктору другого окна, что делает связь между элементами. Если щелкнуть этот элемент, он отобразит страницу своего профиля в окне.

код элемента, который обеспечивает перетаскивание:

/* PhonebookElement.h */ 
private: 
    System::Void PhonebookElement_Click(System::Object^ sender, 
      System::EventArgs^ e) { 
     doClick(); 
    } 

    System::Void nameLabel_MouseDown(System::Object^ sender, 
      System::Windows::Forms::MouseEventArgs^ e) { 
     DragDropEffects dde = DoDragDrop(this, DragDropEffects::Copy); 
     if(dde == DragDropEffects::None) 
      doClick(); 
    } 

Код окна профиля страница, который принимает перетаскивание:

/* PhonebookInfoWindow.h */ 
private: 
    System::Void PhonebookInfoWindow_DragOver(System::Object^ sender, 
      System::Windows::Forms::DragEventArgs^ e) { 
     e->Effect = DragDropEffects::Copy; 
    } 

    System::Void PhonebookInfoWindow_DragDrop_1(System::Object^ sender, 
      System::Windows::Forms::DragEventArgs^ e) { 
     MakeRelationWindow^ mrw = gcnew MakeRelationWindow(this->m_hparent, 
      (PhonebookElement^)e->Data->GetData(
       System::Windows::Forms::DataFormats::Serializable),this); 
     mrw->Show(); 
    } 

Конструктор отношение производителя окна:

/* MakeRelationWindow.h */ 
MakeRelationWindow(PhonebookElement^ first, PhonebookElement^ second, Object^ parent) 
{ 
     InitializeComponent(); 
     // 
     //TODO: Add the constructor code here 
     // 
     this->typeBox->MaxLength = LSTRINGLENGTH; 

     this->first = first; 
     this->second = second; 
     this->parent = parent; 

     this->descriptionBox->Text = "Linking together\r\n" + 
      this->first->maindata + "\r\nand\r\n" + this->second->maindata; 
} 

у меня есть две проблемы:
1. Поскольку я реализовал действие MouseDown для PhonebookElement, он не распознает клики. (Я пробовал действие MouseClick, но это тоже не сработало.) Я поместил часть if(dde == DragDropEffects::None){doClick();} в действие MouseDown в качестве обходного пути, но это не идеально, потому что если пользователь перетаскивает элемент управления где-нибудь, он/она должен 't, это будет рассматриваться как щелчок.
2. Все это не работает: D
Я не знаю, что я делаю неправильно (возможно, это мое использование функции GetData(), я не очень-то знаком с DataFormats), но конструктор MakeRelationsWindow получает «неопределенное значение» в качестве второго параметра.

Как я могу исправить эти две проблемы?

P.S. Я следовал этому руководству: http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx
Это для C# и перетаскивающих строк, но все же лучшее, что я мог найти.

ответ

2

Это не работает, потому что обработчик события DragEnter отсутствует. Вам нужно установить e-> Эффект на один из e-> Разрешенных эффектов, чтобы запустить событие DragDrop. DragOver предназначен только для обеспечения обратной связи.

Запуск перетаскивания MouseDown действительно мешает событию Click, не будет события мыши, чтобы вызвать щелчок. Если вы хотите поддерживать то и другое, вам нужно сделать его более избирательным и только начать перетаскивание, когда вы увидите, что пользователь делает перетаскивание. Это требует сохранения положения мыши в событии MouseDown. Используйте событие MouseMove, чтобы проверить, остается ли левая кнопка нажатой. И вызовите DoDragDrop(), когда вы видите, что мышь перемещена более чем SystemInformation :: DoubleClickSize.

Кроме того, вы должны проверить в обработчике событий DragEnter, что объект перетаскивается, который вы знаете, как обращаться. Вы не хотели бы, скажем, принять перетаскивание файла из Проводника.

+1

В качестве альтернативы включите захват мыши в 'MouseDown' и вызовите' DoDragDrop' из 'MouseMove', если курсор находится за пределами границ элемента управления. –

+0

Спасибо за ответ.Мне удалось решить вторую проблему, изменив «MakeRelationWindow» (this-> m_hparent, (PhonebookElement ^) e-> Data-> GetData (System :: Windows :: Forms :: DataFormats :: Serializable), это); 'to' MakeRelationWindow (this-> m_hparent, (PhonebookElement ^) e-> Data-> GetData (this-> m_hparent-> GetType() -> ToString()), это);' и он работает аккуратно с DragOver тоже ; что касается первого, я пробую ваше решение, еще раз спасибо. edit: 'this-> m_hparent' - это, конечно, объект PhonebookElement ^, поэтому его можно использовать здесь, чтобы получить необходимую информацию о типе. –

+0

Он сделал трюк, спасибо –

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