我正在制作一个“高科技”电话簿程序,如果我成功了,用户将能够将一个号码,一个人或一个位置拖放到另一个人的个人资料页面,将他们链接起来一起。拖放的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.由于我已实施PhonebookElement的MouseDown操作,因此无法识别点击。 (我尝试了MouseClick动作,但这也行不通。)我已经将if(dde == DragDropEffects::None){doClick();}
部分放入MouseDown动作中作为解决方法,但这并不完美,因为如果用户将控件拖动到某个地方,他/她不应该也不会被视为点击。
2.整件事不起作用:D
我不知道我在做什么错(可能是我使用GetData()
函数,我对DataFormats不是很熟),但是构造函数MakeRelationsWindow获取“未定义值”作为其第二个参数。
我该如何纠正这两个问题?
P.S.我正在学习本教程:http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx
这是用于C#和拖放字符串,但仍然是我能找到的最好的。
或者,如果光标位于控件的边界之外,则在MouseDown中启用鼠标捕获,并从MouseMove中调用DoDragDrop。 – 2010-12-13 18:35:24
感谢您的回复。我设法通过改变'MakeRelationWindow(this-> m_hparent,(PhonebookElement ^)e-> Data-> GetData(System :: Windows :: Forms :: DataFormats :: Serializable)来解决第二个问题。 ''到'MakeRelationWindow(this-> m_hparent,(PhonebookElement ^)e-> Data-> GetData(this-> m_hparent-> GetType() - > ToString()),this);'它也可以和DragOver一起使用;至于第一个,我正在尝试你的解决方案,再次感谢。编辑:'this-> m_hparent'当然是一个PhonebookElement ^对象,所以它可以在这里用来获取所需的类型信息 – 2010-12-13 19:31:48
它做到了这一招,谢谢 – 2010-12-13 20:38:50