Как вы можете сделать приложение MFC с представлением HTML, последовательно принимающим файлы перетаскивания? - PullRequest
1 голос
/ 27 января 2009

Я пытаюсь расшифровать поведение CHtmlView, когда файлы перетаскиваются в клиентскую область, поэтому я создал новое приложение MFC и закомментировал строку CHtmlView, которая переходит к MSDN при запуске. В моем основном фрейме я переопределил CWnd :: OnDropFiles () с помощью функции, которая показывает окно сообщения, чтобы увидеть, когда отправляется WM_DROPFILES.

OnDropFiles () запускается для всех, кроме первой попытки перетащить файл в приложение. Уникально то, что приложение впервые интерпретируется приложением как запрос на отображение данных в файле, а не как запрос на открытие файла. Я пытался переопределить OnDrop () из класса представления, но он никогда не вызывался.

Почему первый раз отличается? Как я могу отловить все попытки перетащить файл в мое приложение?

Ответы [ 3 ]

1 голос
/ 30 января 2009

Это часть базового WebBrowser управляющего поведения. CHtmlView устанавливает RegisterAsDropTarget на true по умолчанию, что означает, что элемент управления перехватывает операцию удаления и выполняет собственную обработку.

Если вы хотите запретить это, вызовите SetRegisterAsDropTarget(FALSE) в вашей реализации OnInitialUpdate. Все операции удаления будут затем взаимодействовать с главным окном.

0 голосов
/ 30 января 2009

Предисловие: Я экстраполирую найденную документацию и не беспокоюсь, если я ошибаюсь. Пожалуйста, убедитесь, что следующее объяснение имеет смысл, то есть попробуйте, прежде чем голосовать за мой ответ или принять его:)

После поиска в Google OnDropFiles я обнаружил, что он унаследован от класса CWnd: (страница MSDN)


Согласно этой статье MSDN:

Параметры
hDropInfo

Указатель на внутреннюю структуру данных, которая описывает отброшенные файлы. Этот дескриптор используется функциями Windows DragFinish, DragQueryFile и DragQueryPoint для получения информации об удаленных файлах.

Цитирование позже:

"Фреймворк вызывает эту функцию-член, когда пользователь отпускает левую кнопку мыши над окном, которое зарегистрировалось в качестве получателя удаленных файлов.

"Как правило, производный класс предназначен для поддержки удаленных файлов и регистрируется во время создания окна.

Эта функция-член вызывается платформой, чтобы ваше приложение могло обрабатывать сообщение Windows. Параметры, передаваемые в вашу функцию, отражают параметры, полученные платформой при получении сообщения. Если вы вызываете реализацию этой функции в базовом классе, эта реализация будет использовать параметры, изначально переданные с сообщением, а не параметры, которые вы передаете в функцию. "


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

Поэтому я считаю, что в тот момент, когда вы в первый раз помещаете что-то в CHTMLView, оно регистрируется, и только затем «работает как положено».

Если мое понимание верно, то возникает новый вопрос, каким образом вы можете форсировать регистрацию Представления. Из связанных ссылок в MSDN Technote, похоже, что вы можете принудительно запустить DragAcceptFiles (см. Здесь) , что в противном случае могло бы сработать, когда событие удаления завершится.

0 голосов
/ 29 января 2009

Я бы порекомендовал перейти на HTMLayout - это лучше, чем CHtmlView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...