2010-11-04 12 views
1

Je développe un éditeur d'image en utilisant activeX C# .net 2.0listview se comporte différents lorsqu'il est utilisé en composant activex

J'utilise le contrôle ListView pour afficher des images miniatures. Normalement, si vous utilisez la touche Maj pour sélectionner plusieurs éléments, elle sélectionne toute la plage entre l'élément sélectionné et l'élément sur lequel vous avez cliqué. Mais lorsqu'il est utilisé en tant qu'activeX, il sélectionne les éléments dans un canevas rectangulaire entre les éléments sélectionnés et ceux qui ont été cliqués.

Je ne peux pas ajouter l'image donc je vais illustrer comme ça :)

deuxième point est sélectionné et cliquez sur i Maj 7.

c'est ce que je dois:

x xxx
xxx x

c'est ce qui se passe:

x xx x
x xx x

gras x: sélectionnée.

Le composant est utilisé dans l'application .net. également dans les applications Web en tant qu'objet ActiveX. Je veux que la liste de visualisation se comporte de la même manière à chaque endroit. Des idées?

PS: .net version 2.0

Répondre

2

Il est pas clair ce que 'utilisé comme activex' pourrait signifier. Si cela signifie que votre composant est utilisé dans un autre, programme non .NET alors cela a une explication. Le code pour le contrôle ListView natif, enveloppé par la classe .NET ListView, est stocké dans comctl32.dll. Il existe deux versions de cette DLL, une dans c: \ windows \ system32, une autre dans le cache côte à côte Windows (c: \ windows \ winsxs \ etc ...)

une version héritée, utilisée par les anciens programmes. L'utilisation de la version côte-à-côte nécessite que le programme dise à Windows qu'il veut utiliser la dernière version, et non l'ancienne version. Ces versions ne se comportent pas de la même manière, voir un comportement différent dans la façon dont elles sélectionnent les éléments pourrait certainement s'expliquer par cela.

Vous êtes soumis à ce que ce programme dit à Windows. Ceci est généralement fait en incluant un manifeste, mais ce n'est pas une option réaliste. Il est très susceptible de casser le programme quand il obtient une version de comctl32.dll avec laquelle il n'a jamais été testé. La méthode par programme est CreateActCtx(), vous devez l'épingler avant de créer le contrôle ListView. Cette fonction API n'est pas vraiment facile à utiliser. Considérez si vous voulez vraiment que votre vue de liste se comporte différemment de toute autre vue de liste que ce programme pourrait utiliser.

+0

Je pense qu'il veut qu'ils se comportent de la même manière, mais ils ne le sont pas (si je comprends bien). Mais je suis entièrement d'accord, ils chargent deux versions différentes de ce contrôle. Est-il possible qu'il fasse référence à l'héritage comctl32 directement dans le projet? Enumérant System.Diagnostics.Process.GetCurrentProcess(). Les modules du débogueur lui diraient quelle version de comctl32 il charge. –

+0

+1 Merci beaucoup! C'est un bon point de vue. Je vais essayer d'utiliser un manifeste ou utiliser CreateActCtx() et donner des commentaires. – honibis