2010-12-13 43 views
0

我正在制作一个“高科技”电话簿程序,如果我成功了,用户将能够将一个号码,一个人或一个位置拖放到另一个人的个人资料页面,将他们链接起来一起。拖放的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#和拖放字符串,但仍然是我能找到的最好的。

回答

2

它不起作用,因为DragEnter事件处理程序丢失。您需要将e-> Effect设置为其中一个e-> AllowedEffects以使DragDrop事件运行。 DragOver仅用于提供反馈。

在MouseDown上开始拖动的确会干扰Click事件,因此不会有鼠标向上的事件触发点击。如果你想支持两者,那么你需要使它更具选择性,并且只有当你看到用户进行拖动时才开始拖动。这需要将鼠标位置存储在MouseDown事件中。使用MouseMove事件检查左侧按钮是否仍然关闭。并且当您看到鼠标移动超过SystemInformation :: DoubleClickSize时调用DoDragDrop()。

此外,你应该检查DragEnter事件处理程序,正在拖动一个对象,你知道如何处理。例如,您不想接受从资源管理器拖拽文件。

+1

或者,如果光标位于控件的边界之外,则在MouseDown中启用鼠标捕获,并从MouseMove中调用DoDragDrop。 – 2010-12-13 18:35:24

+0

感谢您的回复。我设法通过改变'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

+0

它做到了这一招,谢谢 – 2010-12-13 20:38:50