Я создаю «высокотехнологичную» программу телефонной книги, в которой, если мне это удастся, пользователи смогут перетаскивать число, или человека, или местоположение на страницу профиля другого, связывая их вместе.
Элементы (например, числа или персоны) представлены классом, производным от 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 как обходной путь, но он не идеален, потому что если пользователь перетаскивает элемент управления куда-нибудь в / он не должен, это будет рассматриваться как щелчок.
2. Все это не работает: D
Я не знаю, что я делаю неправильно (возможно, это мое использование функции GetData()
, я не очень знаком с DataFormats), но конструктор MakeRelationsWindow получает «неопределенное значение» в качестве второго параметра.
Как я мог исправить эти две проблемы?
P.S. Я следовал этому уроку: http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx
Это для C # и строк перетаскивания, но все же лучшее, что я смог найти.