Здравствуйте, adavydenko, Вы писали:
A>Привет всем.
A> Подскажите пожалуйста, как реализовать отображение картинки для D&D с помощью вызова метода InitializeFromWindow() интерфейса IDragSourceHelper. В МСДН-е написано что этот метод посылает окну сообщение DI_GETDRAGIMAGE.
Проверь, зарегистрировал ли ты DI_GETDRAGIMAGE сообщение.
A>Но у меня это сообщение не приходит и вызов InitializeFromWindow() возвращает E_FAIL.
Посмотри в spy++
A> Ранее, для формирования картинки я использовал метод InitializeFromBitmap, но обнаружил, что он работает только на системах Windows2000+SP3 и старше На системах с голой Win2k вплоть до 2-го сервиспака эта функция не работает.
Неверно. Эта функция работает в любой версии shell от W2K. Тут правда есть одна тонкость (которая нигде конечно не документирована). Если у тебя в настройках системы свойство Display Properties-> Effects -> Show window contents while dragging выключено, картинка отображаться не будет. (Поскольку картика D&D — это окно с прозрачностью)
A>В связи с этим я хочу перейти на InitializeFromWindow, судя по стандартному примеру DragImg она должна работать везде.
Нет смысла, поскольку все равно вызовится InitializeFromBitmap .
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Подскажите пожалуйста, как реализовать отображение картинки для D&D с помощью вызова метода InitializeFromWindow() интерфейса IDragSourceHelper. В МСДН-е написано что этот метод посылает окну сообщение DI_GETDRAGIMAGE. Но у меня это сообщение не приходит и вызов InitializeFromWindow() возвращает E_FAIL. Примеров реализации этого механизма я не нашел. Примеры со стандартными компоненами List/Tree не в счёт, так как мне нужно самому сформировать картинку для отображения.
Ранее, для формирования картинки я использовал метод InitializeFromBitmap, но обнаружил, что он работает только на системах Windows2000+SP3 и старше На системах с голой Win2k вплоть до 2-го сервиспака эта функция не работает. В связи с этим я хочу перейти на InitializeFromWindow, судя по стандартному примеру DragImg она должна работать везде.
Здравствуйте, adavydenko, Вы писали:
A>Привет всем.
A> Подскажите пожалуйста, как реализовать отображение картинки для D&D с помощью вызова метода InitializeFromWindow() интерфейса IDragSourceHelper. В МСДН-е написано что этот метод посылает окну сообщение DI_GETDRAGIMAGE. Но у меня это сообщение не приходит и вызов InitializeFromWindow() возвращает E_FAIL. Примеров реализации этого механизма я не нашел. Примеры со стандартными компоненами List/Tree не в счёт, так как мне нужно самому сформировать картинку для отображения.
A> Ранее, для формирования картинки я использовал метод InitializeFromBitmap, но обнаружил, что он работает только на системах Windows2000+SP3 и старше На системах с голой Win2k вплоть до 2-го сервиспака эта функция не работает. В связи с этим я хочу перейти на InitializeFromWindow, судя по стандартному примеру DragImg она должна работать везде.
Как я понял перед началом работы ты должен зарегестрировать сообщение DI_GETDRAGIMAGE для своего окна RegisterWindowMessage. Ты это делаешь?
Здравствуйте, korzhik, Вы писали:
A>> Подскажите пожалуйста, как реализовать отображение картинки для D&D с помощью вызова метода InitializeFromWindow() интерфейса IDragSourceHelper. В МСДН-е написано что этот метод посылает окну сообщение DI_GETDRAGIMAGE. Но у меня это сообщение не приходит и вызов InitializeFromWindow() возвращает E_FAIL. Примеров реализации этого механизма я не нашел. Примеры со стандартными компоненами List/Tree не в счёт, так как мне нужно самому сформировать картинку для отображения.
A>> Ранее, для формирования картинки я использовал метод InitializeFromBitmap, но обнаружил, что он работает только на системах Windows2000+SP3 и старше На системах с голой Win2k вплоть до 2-го сервиспака эта функция не работает. В связи с этим я хочу перейти на InitializeFromWindow, судя по стандартному примеру DragImg она должна работать везде.
K>Как я понял перед началом работы ты должен зарегестрировать сообщение DI_GETDRAGIMAGE для своего окна RegisterWindowMessage. Ты это делаешь?
Здравствуйте, AndrewJD, Вы писали:
A>>Но у меня это сообщение не приходит и вызов InitializeFromWindow() возвращает E_FAIL. AJD>Посмотри в spy++
Смотрел, ничего не приходит
A>> Ранее, для формирования картинки я использовал метод InitializeFromBitmap, но обнаружил, что он работает только на системах Windows2000+SP3 и старше На системах с голой Win2k вплоть до 2-го сервиспака эта функция не работает.
AJD>Неверно. Эта функция работает в любой версии shell от W2K. Тут правда есть одна тонкость (которая нигде конечно не документирована). Если у тебя в настройках системы свойство Display Properties-> Effects -> Show window contents while dragging выключено, картинка отображаться не будет. (Поскольку картика D&D — это окно с прозрачностью)
Огромное спасибо, теперь ясна причина моей проблемы.
A>>В связи с этим я хочу перейти на InitializeFromWindow, судя по стандартному примеру DragImg она должна работать везде. AJD>Нет смысла, поскольку все равно вызовится InitializeFromBitmap .
Стандартный пример DragImg выдаёт корректную картинку при вызове InitializeFromWindow(), даже когда опция Show window contents while dragging выключена. Более того иконки на рабочем столе тоже можно таскать, они отображаются корректно. Или это реализовано как-то по другому ?
A> Стандартный пример DragImg выдаёт корректную картинку при вызове InitializeFromWindow(), даже когда опция Show window contents while dragging выключена.
А что за стандартный пример DragImg?
Кроме того, что мешает тебе включить эту опцию на период выполнения D&D ?
A> Более того иконки на рабочем столе тоже можно таскать, они отображаются корректно. Или это реализовано как-то по другому ?
Иконки на рабочем столе — это обычный ListView. Соответственно все работает.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
A>> Стандартный пример DragImg выдаёт корректную картинку при вызове InitializeFromWindow(), даже когда опция Show window contents while dragging выключена. AJD>А что за стандартный пример DragImg?
Пример из Microsoft SDK.
AJD>Кроме того, что мешает тебе включить эту опцию на период выполнения D&D ?
Да, большое спасибо так и сделал, всё работает.
A>> Более того иконки на рабочем столе тоже можно таскать, они отображаются корректно. Или это реализовано как-то по другому ? AJD>Иконки на рабочем столе — это обычный ListView. Соответственно все работает.
Да, и когда опция Show content отключена, то вместо иконок отрисовываются квадратики. Насколько я понимаю делается это с помощью вызова InitializeFromWindow. Вот мне и интересно можно ли в своём окне поймать и обработать вызов DI_GETDRAGIMAGE. Так как примера такого я не встречал, то подумал что найдётся кто-то, кто это делал и скажет мне, что мол да, я такое делал у тебя где-то баг.