2009-09-15 10 views
0

Je suis en train de créer une application agrandisseur dans .net à l'aide de l'API Windows Grossissement. J'ai à peu près tout fonctionné sauf pour réellement régler le niveau d'agrandissement (qui est de 100% par défaut). Le problème est, je ne peux trouver aucun exemple n'importe où sur le net et toute la documentation pour l'API est le code C++. C'est la fonction particulière avec laquelle j'ai des problèmes.Windows Grossissement API, .NET et matrices

bool SetMagFactor(float magfactor) 
{ 
    MAGTRANSFORM matrix; 
    memset(&matrix, 0, sizeof(matrix)); 
    matrix.v[0][0] = magfactor; 
    matrix.v[1][1] = magfactor; 
    matrix.v[2][2] = 1.0f; 
    return MagSetWindowTransform(hwndMag, &matrix); 
} 

La structure MAGTRANSFORM est définie comme suit:

typedef struct tagMAGTRANSFORM { 
    float v[3] [3]; 
} MAGTRANSFORM, *PMAGTRANSFORM; 

La partie la plus déroutante de c'est le memset - Je ne sais pas ce qu'il fait ou ce que son équivalent est en .NET, mais Ce qui est aussi source de confusion, c'est le tableau/matrice multi-demensional et comment je gérerais cela dans .NET aussi.

Toute aide serait grandement appréciée.

Répondre

2

Le memset vient juste d'effacer la matrice pour commencer. Vous n'auriez pas besoin de le faire dans .NET. Je soupçonne que la simple façon de définir la struct en C# serait de spécifier chaque élément individuellement:

public struct MagTransform 
{ 
    readonly float m00; 
    readonly float m10; 
    readonly float m20; 
    readonly float m01; 
    readonly float m11; 
    readonly float m21; 
    readonly float m02; 
    readonly float m12; 
    readonly float m22; 

    public MagTransform(float magnificationFactor) : this() 
    { 
     m00 = magnificationFactor; 
     m11 = magnificationFactor; 
     m22 = 1.0f; 
    } 
} 

Vous devrez peut-être de préciser la mise en page - Je crains que je ne suis pas si chaud sur marshalling.

Comme vous pouvez le voir, j'ai supposé les valeurs que vous voulez en fonction de l'exemple de code. Il y aura des avertissements sur les valeurs inutilisées, mais ça va. Vous pouvez utiliser pourrait utiliser un tampon fixe à la place, et le code dangereux ... mais je pense que j'utiliserais probablement ce qui précède. Fondamentalement, vous avez juste besoin de 9 flotteurs.

+0

Malheureusement, il échoue lorsque je passe la structure à la fonction MagSetWindowTransform. Je reçois une exception bizarre - "System.ExecutionEngineException thrown" si j'essaie de le martialiser comme LayoutKind.Auto et "L'enregistrement spécifié ne peut pas être mappé à une classe de valeur gérée". –

+0

LayoutKind.Explicit? –

+0

Identique à la définition de l'absence de disposition - System.ExecutionEngineException généré –