2010-11-04 2 views
1

Я разрабатываю редактор изображений ActiveX с помощью C# .NET 2.0ListView ведет себя иначе, когда используется в компоненте ActiveX

я использую элемент списка для отображения миниатюрных изображений. Обычно, если вы используете клавишу Shift для выбора нескольких элементов, он выбирает весь диапазон между выбранным и нажатым элементом. Но при использовании в качестве activeX он выбирает элементы в прямоугольном холсте между выбранными и щелканными элементами.

Я не могу добавить изображение таким образом, я проиллюстрирую, как это :)

второй элемент выбран и я Сдвиг нажмите 7.

это то, что мне нужно:

х ххх
ххх
х

это то, что происходит:

х хх х
х хх х

жирным шрифтом х: выбран.

Этот компонент используется в приложении .net. также в веб-приложениях как объект activex. Я хочу, чтобы list list вел себя одинаково в каждом месте. Любые идеи?

PS: .net версии 2.0

ответ

2

Это не то, что ясно, что 'используется как ActiveX' может означать. Если это означает, что ваш компонент используется в другой, не .NET-программа, то у этого есть объяснение. Код для собственного элемента управления ListView, завершенный классом .NET ListView, хранится в comctl32.dll. Существуют две версии этой DLL: одна в c: \ windows \ system32, другая в кеш-памяти Windows (c: \ windows \ winsxs \ etc ...)

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

У вас подлежит описанию этой программы Windows. Обычно это делается путем включения манифеста, но это не реалистичный вариант. Скорее всего, он сломает программу, когда получит версию comctl32.dll, с которой она никогда не тестировалась. Программным способом является CreateActCtx(), вам нужно будет его вывести, прежде чем создавать элемент управления ListView. Эта функция API не совсем проста в использовании. Подумайте, действительно ли вы хотите, чтобы ваше представление списка выглядело иначе, чем любое другое представление списка, которое может использовать эта программа.

+0

Я думаю, он хочет, чтобы они вели себя одинаково, но они не (если я правильно понимаю). Но я полностью согласен, что они загружают две разные версии этого элемента управления. Возможно ли, что он ссылается на устаревший comctl32 непосредственно в проекте? Перечисление System.Diagnostics.Process.GetCurrentProcess(). Модули от отладчика скажут ему, какую версию comctl32 он загружает. –

+0

+1 Большое спасибо! это хорошая точка зрения. Я попытаюсь использовать манифест или использовать CreateActCtx() и дать обратную связь. – honibis

Смежные вопросы