Drag&drop — это модель переноса данных общего назначения, не привязанная к каталогам Проводника

Это перевод Drag and drop is a general purpose transfer model, not exclusive to Explorer directories. Автор: Реймонд Чен.

Если вы спроектировали свою программу таким образом, что она подразумевает, что пользователь может перетаскивать ваш объект только в каталог файловой системы, то вы уже проиграли.

piers хочет определить назначение операции перетаскивания. Однако из постановки вопроса становится ясно, что piers, на самом деле, заинтересован в пути назначения. Но кто сказал, что назначением будет каталог? Пользователь может перетащить объект в сообщение e-mail, бросить на FTP-сайт, на Web-сайт (через Web-папки), или даже в каталог операционной системы внутри виртуальной машины!

Следующее уточнение ещё больше запутывает. Если пользователь перетащит файл на FTP или другую виртуальную папку, то как ваша программа может перезапустить закачку? Вы же не знаете пароля для FTP. Вы не знаете как перезапустить виртуальную машину и войти в неё тем же пользователем. А даже если вы сможете это сделать, то вы понятия не имеете, как писать в папку внутри виртуальной машины — только менеджер виртуальной машины знает, как это сделать. В мире сегодня существует бесчисленное множество вариантов виртуальных папок. Я крайне сомневаюсь, что вы знаете как запихать свои данные в каждый вариант виртуальной папки.

Как только пользователь перетащит объект, сам процесс переноса — это личное дело только источника (source) и назначения (target). И вы, как источник, не можете просто взять и сказать: «теперь командую я», потому что даже если бы назначение согласилось, то вы всё ещё остаётесь с проблемой, а как же это осуществить.

Какова моя рекомендация?†

Объект перетаскивания (data object) в цикле drag/drop должен следовать стандартному протоколу Оболочки, так что пользователь сможет перетащить объект в e-mail, FTP и т.д.‡

Для дополнительного шика, я бы создал ловушку drag/drop (drag/drop hook). Пользователь сможет перетащить объект, используя правую кнопку мыши°. Когда пользователь отпустит кнопку мыши, появится контекстное drop-меню — вместе с вашей ловушкой. Ловушка может создать пункт вроде «Скопировать с КрутойПрограммой» (конечно же, пункт создаётся ловушкой только в случае, если объект данных идентифицировал себя как созданный в КрутойПрограмме). Если пользователь выбирает «Скопировать с КрутойПрограммой», то вы можете выполнить своё копирование с дополнительными возможностями.

Уголок зануды

† Заметьте, что я не утверждаю, что все продукты Microsoft следуют моим рекомендациям. Также заметьте, что это мои личные рекомендации, не являющиеся официальной позицией Корпорации Microsoft.

‡ И, прежде чем реализовывать не стандартный протокол передачи объекта, вам нужно понимать стандартный протокол.

° Точнее: вторичную кнопку мыши, поскольку вы могли поменять кнопки мыши местами.

Читать на сайте автора.

Списывание остатков

Это перевод Scrapping the Scraps. Автор: Реймонд Чен.

Хотя это случается не часто, но иногда всё же из Windows удаляется какая-то старая функциональность (что, конечно же, празднуется всей командой).

К примеру, в Windows XP был удалён интерфейс по установке фонового узора рабочего стола. Сама функциональность сохранена, и вы можете написать программу, которая вызывает SystemParametersInfo(SPI_SETDESKPATTERN) — просто теперь нет интерфейса пользователя для этой функциональности. Почему интерфейс для установки узоров был удалён из апплета Экран Панели управления?

Наши исследования показали, что практически никто не использует сегодня узоры. Они были очень популярны в старые времена, когда памяти было мало, она была дорогой, и пользователи не хотели тратить четверть своей памяти на мегабайтный растровый рисунок обоев. Крохотный монохромный рисунок 8х8, повторённый по всему экрану, предоставлял возможности по персонализации экрана 640х480 за гораздо меньшую «цену».

Однако время делало узоры всё менее привлекательными. Во-первых, конечно же, сегодня компьютеры имеют намного больше памяти, чем в 1983 году. Во-вторых (также конечно же), сегодня мониторы имеют гораздо большее разрешение экрана. Симпатичный для экрана 640х480 узор 8х8 будет выглядеть серым пятном на мониторе 1900х1080.

Это не единственная возможность, которую мы отправили в мусорную корзину за эти годы. Фрагменты (scraps, .shs-файлы) — вот ещё один пример удалённой функциональности. Впервые представленные в Windows 95, фрагменты являются частями документа, сохранёнными в файл. Файл в действительности является OLE-объектом. Идея была в том, что вы могли, к примеру, выделить текст в редакторе и перетащить его на рабочий стол, где создавался файл фрагмента. Потом вы могли взять этот фрагмент и перетащить его обратно в редактор или любую другую программу, и сохранённый в фрагменте текст вставился бы в новый документ. Это что-то вроде копирования/вставки, только вместо временного хранения в буфере обмена, данные сохранялись в постоянный файл.

Итак, когда вы создали файл фрагмента, то единственное, что вы можете с ним сделать, так это «перетащить» его на другой документ — аналогично тому, что единственное, что можно сделать с содержанием буфера обмена, это вставить его куда-то. Позже кто-то добавил новую возможность: вы могли дважды-щёлкнуть по файлу фрагмента, и он открывался в программе, которая его создала (поскольку внутри фрагмента могло быть что угодно, то для его отображения мы могли только попросить сделать это программу, его создавшую).

Я не знаю, была ли эта возможность добавлена как отладочный инструмент или как реальная возможность для пользователей посмотреть содержимое фрагмента без создания пустого документа и перетаскивания в него фрагмента. В любом случае, эту возможность сразу полюбили писатели вирусов, потому что она позволяла им создавать фрагменты с данными вида «приложение, которое создало этот фрагмент — это cmd.exe, а сам фрагмент документа — вот этот .bat-файл». И когда пользователь дважды-щёлкал по такому файлу фрагмента, просмотрщик фрагментов передавал .bat-файл из фрагмента командному интерпретатору: «Пожалуйста, открой вот это и покажи его пользователю».

Учитывая историю просмотра фрагментов, команде Оболочки (Shell) было поручено удалить эту функциональность из Windows Vista. Чтобы выполнить назначенную задачу, команда провела исследование: насколько популярной была эта функциональность в реальном мире. Для этого команда Оболочки попросила команду поддержки продукта поднять свои записи и сказать им, сколько людей позвонило с вопросами по фрагментам. Идея состояла в том, что по популярной функциональности будет много вопросов, а по не популярной — не будет (поскольку её никто и не использует). В частности, фрагменты не совсем относятся к категории «абсолютно очевидно», поэтому малое число вопросов нельзя будет объяснить «ну, это же так просто, поэтому нам никто и не звонит!»

Команда поддержки продуктов подготовила ответ. За прошедший год она получила целых четыре вопроса по фрагментам. Все они были заданы в форме «Я как-то создал вот такой странный файл. Что это такое и как мне его удалить?»

Читать на сайте автора.