2009-09-15 10 views
0

Windows 확대 API를 사용하여 .net에서 확대경 앱을 만들려고합니다. 실제로 거의 배율 수준 (기본값은 100 %)을 설정하는 것을 제외하고는 모든 것이 작동합니다. 문제는, 어디서나 인터넷에서 예제를 찾을 수없고 API에 대한 모든 문서가 C++ 코드라는 것입니다. 이것은 내가 문제가있는 특정 기능입니다. 다음과 같이Windows 확대 API, .NET 및 행렬

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); 
} 

MAGTRANSFORM 구조가 정의 :

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

이 가장 혼란스러운 부분은 memset 함수입니다 - 나는 그것이 그와 동등한은 .NET에서 무엇을 수행 또는 어떤 모르겠지만, 혼란 스러울뿐만 아니라 다중 차원 배열/행렬과 .NET에서 이것을 어떻게 처리 할 것인가도 있습니다.

도움을 주시면 감사하겠습니다.

답변

2

memset은 시작하기 위해 행렬을 지우고 있습니다. .NET에서는이 작업을 수행 할 필요가 없습니다. - 내가 마샬링에 너무 섹시하지 않다 두려워

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; 
    } 
} 

당신은 또한 레이아웃을 지정해야 할 수도 있습니다 : 나는 개별적으로 각각의 요소를 지정하는 것입니다 C#에서 구조체를 정의하는 간단한 방법을 생각한다.

보시다시피 샘플 코드를 기반으로 원하는 값으로 가정했습니다. 사용하지 않은 값에 대한 경고가 있지만 괜찮습니다.

은 고정 버퍼 대신 안전하지 않은 코드를 사용할 수 있지만 위의 코드를 사용하는 것이 좋습니다. 기본적으로 9 개의 수레가 필요합니다.

+0

구조체를 MagSetWindowTransform 함수에 전달하면 실패합니다. 내가 이상한 예외 - "System.ExecutionEngineException Throw"를 시도하고 LayoutKind.Auto 및 "지정된 레코드를 관리되는 값 클래스에 매핑 할 수 없으므로"무술을 시도합니다. –

+0

LayoutKind.Explicit? –

+0

레이아웃 없음으로 지정하는 것과 동일 - System.ExecutionEngineException throw 됨 –