Я создаю программу телефонной книги «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# и перетаскивающих строк, но все же лучшее, что я мог найти.
В качестве альтернативы включите захват мыши в 'MouseDown' и вызовите' DoDragDrop' из 'MouseMove', если курсор находится за пределами границ элемента управления. –
Спасибо за ответ.Мне удалось решить вторую проблему, изменив «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 ^, поэтому его можно использовать здесь, чтобы получить необходимую информацию о типе. –
Он сделал трюк, спасибо –