Visual C ++ проблемы с перетаскиванием - PullRequest
0 голосов
/ 13 декабря 2010

Я создаю «высокотехнологичную» программу телефонной книги, в которой, если мне это удастся, пользователи смогут перетаскивать число, или человека, или местоположение на страницу профиля другого, связывая их вместе.

Элементы (например, числа или персоны) представлены классом, производным от 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 # и строк перетаскивания, но все же лучшее, что я смог найти.

1 Ответ

2 голосов
/ 13 декабря 2010

Не работает, потому что отсутствует обработчик событий DragEnter. Вам нужно установить e-> Effect на один из e-> AllowedEffects, чтобы запустить событие DragDrop. DragOver предназначен только для предоставления обратной связи.

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

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

...