Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

Ошибка в Windows Common Controls 6.0 или руки?   Найти похожие ветки 

 
DVM ©   (2003-04-23 22:34) [0]

Обращаюсь к знатокам WinApi и Windows Common Controls 6.0!

Недавно столкнулся с неправильным, или по крайней мере странным поведением SysListView32. После долгих изысканий я, наконец-то, научился делать Drag"n"Drop для ListView, созданного на WinApi. Все нормально работало, пока я не решил подцепить к своей программе манифест, для придания элементам управления XP-шного вида.

Манифест такой:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" publicKeyToken="6595b64144ccf1df" name="Microsoft.Windows.Shell.ListViewDemo" version="6.0.0.0" processorArchitecture="*"/>
<description>Sample MSDN code for Tree View Drag and Drop</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
language="*"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
/>
</dependentAssembly>
</dependency>
</assembly>

Все заработало, но ListView стал не совсем правильно создавать образ перетаскиваемого итема.
Вообще-то это делаю я так:

hDragImageList := ListView_CreateDragImage(hListView, iPos, ptImage);
в обработчике LVN_BEGINDRAG. (это обычный метод)
далее манипулирую ImageList (ImageList_BeginDrag,ImageList_DragEnter,ImageList_DragMove, ImageList_EndDrag, ImageList_DragLeave...), но дело не в ImageList.

После(именно после) подключения манифеста при перетаскивании в изображении перетаскиваемого итема значок смещен относительно подписи влево точек этак на 20 (все выглядит криво). Без манифеста все нормально. Сломал всю голову, но ничего не придумал. Ведь у ListView_CreateDragImage нет больше никаких параметров.

Т.е. с новыми Common Controls, а именно с SysListView работа чем то отличается. Но чем? Кто знает? Может кому попадались какие то статьи и пр.

Очень буду благодарен за помощь!


 
DVM ©   (2003-04-23 22:45) [1]

Вот как это выглядит:

http://www.dm.rsl.ru/ListView_bug.jpg

Без манифеста все ок:

http://www.dm.rsl.ru/ListView_normal.jpg

Только на картинках не видно указателя мыши, но, я думаю все понятно.


 
AlexKa   (2003-04-24 15:18) [2]

> Есть такой глюк.
> Как лечить:
> В ComCtrls.pas ищем
> procedure TCustomListView.UpdateColumn(AnIndex: Integer);
> в D6 это 15046 строка.
> Находим место:
> if FImageIndex <> -1 then
> fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES;
> Исправляем на:
> if FImageIndex <> -1
> then fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES
> else mask := mask and not (LVCF_IMAGE);
> И все. Вообще же с темами XP есть еще кое какие проблемы,
> ну например, не рисуется градиент в PageControl.
> Более менее нормальную поддержку Themes API обещают только
> в D7, где то к концу лета.
> Код приведен, естественно, для D5,D6.


 
DVM ©   (2003-04-24 16:37) [3]

Да, но моя программа не использует VCL, и TCustomListView тут ни при чем. Проблема где то глубже. Но все равно спасибо. Хоть что-то.

Кто нибудь сталкивался с подобным?????????????????


 
DVM ©   (2003-04-25 08:58) [4]

Ауууу-людииии! Неужели не у кого не возникала проблема? Все пишут только на VCL/MFC? И только для <=XP


 
Delfin   (2003-04-25 13:34) [5]

Привет DVM!
Честно говоря я не совсем разобраз, что у тебя именно не так, но если это что-то с шрифтом, то дело в языке ресурса, который ты используешь в своем модуле. Хотя это только недалекое предположение :(
Удачи.


 
DVM ©   (2003-04-25 13:36) [6]


> AlexKa

написанное выше не помогло даже для ListView созданного на VCL.
(само собой модуль после исправлений я перекомпилировал). Может что еще надо где исправить?


 
DVM ©   (2003-04-25 13:37) [7]


> Delfin

Посмотрите на картинки. При перетаскивании значок сдвинут влево относительно надписи под ним в режиме ICON


 
REA ©   (2003-04-25 15:01) [8]

Может пропатчить эти контролзы, а может плюнуть?


 
DVM ©   (2003-04-25 16:14) [9]


> Может пропатчить эти контролзы, а может плюнуть?

Чем пропатчить? А плюнуть нельзя, к тому же заставить работать можно, у Microsoft же в Эксплорере все работает как надо - все ровненько! Только вот как?

Я попробовал только что. Создал окно на Delphi 6, положил туда ListView, включил перетаскивание, подкючил манифест - криво работает, убрал манифест - нормально.

Та же картина, если VCL не использовать.


 
REA ©   (2003-04-25 17:00) [10]

Ну значит в манифесте где-то что-то. Форматы манифестов этих читал?


 
DVM ©   (2003-04-25 17:06) [11]

Я этот манифест c сайта Microsoft-а взял. Должно быть все правильно. Все остальное работает то как надо. Только вот ListView, собака, глючит в одном единственном месте.


 
Shurik   (2003-04-27 04:33) [12]

А кто может сказать, что такое этот манифест?


 
DVM ©   (2003-04-27 12:58) [13]


> А кто может сказать, что такое этот манифест?

Это XML файл, кторый должен располагаться в том же каталоге что и программа и должен носить то же имя что и сама программа.
Proga.exe >>> Proga.exe.manifest
Или его можно затолкать в файл ресурсов приложения.

Образец манифеста написан выше.

Так значит никто с таким глюком не сталкивался?


 
Illusion ©   (2003-04-27 15:35) [14]

Странно... Никогда с таким не встречался. Если баг появляется при использования манифеста, то значит проблемма может возникать в двух случаях:
бажный манифест, который сбивает настройки шрифта иконки (уровнения и сам шрифт сбивает), или же из-за манифеста подглючивает система. Во втором случаии тебе ничего не поможет, разве что запустить программу в реалтайм режиме. Только это КРАЙНЕ не рекомендуется делать... переход в реалтайм режим - SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
что это даст? Помимо максимального возможного использования ресурсов системы это даёт повышенную защищённость учатска памяти программы.
З.Ы. Если прога делает что-то грузящее проц, это убьёт всю систему нафих при запуске проги....


 
DVM ©   (2003-04-27 15:50) [15]


> Illusion

Проблема в том, что ListView в ListView_CreateDragImage итем рисует не так как должен. В оригинале значок по центру надписи, а в изображении перетаскиваемого итема - слева от центра.
Скриншоты вверху. Система не подглючивает. Манифест от Майкрософта.

Лююююдииии!
Все у кого Delphi 4, 5, 6, 7. Система - XP.

Попробуйте у себя выполнить следующее:

1. Возьмите пустую форму.
2. Положите туда ListView, ImageList.
3. Добавьте 2-3 итема с иконками (режим ICON).
4. Разрешите перетаскивание итемов. Ну хотя бы так, как это сделано в статье:
http://www.delphimaster.ru/articles/dragndrop/index.html
5. Положите в папку с проектом манифест и попробуйте в работе.

Итемы будут таскаться неправильно!!!



 
Illusion ©   (2003-04-27 16:06) [16]

Ну чтож... Тогда мой те совет - успокойся или забей на манифесте. Если это возможно.


 
Shurik   (2003-04-28 04:19) [17]

Я так понял, что манифест влияет на поведение контролов, так что ли? А зачем он вообще нужен?


 
DVM ©   (2003-04-28 09:26) [18]


> Shurik

Он указывает системе, что для данной программы надо использовать ComCtl32.dll version 6. Подробности на:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/CommCtls/Userex/cookbook.asp

Почему именно XML мне неизвестно.


 
Shurik   (2003-04-29 13:52) [19]

А этот самый ComCtl32.dll версии 6-й, он чем от предыдущих отличается, кроме визуалього стиля?


 
DVM ©   (2003-04-30 12:25) [20]


> А этот самый ComCtl32.dll версии 6-й, он чем от предыдущих
> отличается, кроме визуалього стиля?

http://msdn.microsoft.com



 
LEON   (2003-04-30 20:24) [21]

мне кажется, что
без манифеста прога использует ComCtrl32.dll версии 5.0 (или 5.1)

а с манифестом - 6.0
в 5-ой глюка нету, а в 6-ой есть


 
Proton ©   (2003-05-03 07:22) [22]

Дусается что выравнивание по правому краю берется от шрифта выстановенного для LV. Попробуй его изменить.


 
DVM ©   (2003-05-05 10:37) [23]


> LEON


> без манифеста прога использует ComCtrl32.dll версии 5.0
> (или 5.1)

Необязательно 5, может и 4, короче, какую найдет.

> Proton


> Дусается что выравнивание по правому краю берется от шрифта
> выстановенного для LV

Так это не выравнивание, "искривление какое-то". Вряд ли дело в шрифте. Microsoft Windows Explorer XP - шрифт у него тот же, что и у меня. Но подпись под перетаскиваемым значком по центру.

Люди у кого Delphi 7 и XP, посмотрите, там (в D7) этот баг есть? Может борландовцы что подправили?



Страницы: 1 вся ветка

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.026 c
1-55531
Adil Aliev
2003-07-05 01:23
2003.07.17
Как открывать файл который создан сейчас?


6-55673
ZKK
2003-05-10 07:56
2003.07.17
IRC клиент


3-55410
Mechanikus
2003-06-23 01:33
2003.07.17
Обращение к записям через DBGrid


4-55907
Mix
2003-05-13 18:49
2003.07.17
Replace Resource


3-55457
Weare
2003-06-12 12:06
2003.07.17
Печать из базы штрих-кода