2009-11-22 5 views
3

나는 MetaFile (emf)에서 이미지를 그린 다음 UserControl의 OnPaint 내에서 회전 변환을 적용합니다. 이러한 변환을 적용한 후 어떻게 화면 좌표에서 일반 untransformed 사각형 경계 상자를 계산할 수 있습니까? 회전 된 이미지의 크기를 UserControl의 크기로 조정하려면이 기능이 필요합니다.GDI + 그림의 테두리 상자를 계산하십시오.

protected override void OnPaint(PaintEventArgs e) 
{ 
    // rotate around the center of this UserControl 
    e.Graphics.TranslateTransform(this.Width/2.0f, this.Height/2.0f); 
    e.Graphics.RotateTransform(this.Rotation); 
    e.Graphics.TranslateTransform(this.Width/-2.0f, this.Height/-2.0f); 

    // TODO: now scale so the image so it fits exactly into this UserControl 

    // draw the image at the center of this UserControl 
    float left = (this.Width - ResourceManager.MyDrawingMetaFile.Width)/2.0f; 
    float top = (this.Height - ResourceManager.MyDrawingMetaFile.Height)/2.0f; 
    e.Graphics.DrawImage(Resources.MyDrawingMetaFile, left, top); 
} 

이 뒤에 전체 아이디어는 내가 UserControl을에서 파일 .EMF 회전 표시 할과 기전력이있는 UserControl에서 사용 가능한 공간을 채우기에 allways 그리기 가지고있다. 어쩌면 더 나은 접근법이 있을까요?

필자가 작성한 fillmode/stretchmode는 Uniform 및 UniformToFill입니다 (WPF의 Viewbox와 같습니다). emf가 왜곡되어서는 안됩니다. Uniform 모드에서는 emf가 최소한 하나의 차원에서 사용자 정의 컨트롤을 완전히 채우고 아무것도 자릅니다. UniformToFill에서는 emf가 두 차원 모두에서 UserControl을 채우고, aspectratio가 일치하지 않으면 emf가 한 차원에서 잘립니다.

+0

"채우기"를 어떻게 원하십니까? emf가 사용자 컨트롤을 완전히 덮어야합니까 (emf의 일부분이 잘려야하는지) 아니면 emf가 모두 보이도록 크기를 조정해야합니까? emf가 원본 가로 세로 비율을 유지해야합니까? –

+0

필자가 작성한 fillmode/stretchmode는 Uniform 및 UniformToFill입니다 (WPF의 Viewbox와 같습니다). emf가 왜곡되어서는 안됩니다. Uniform 모드에서는 emf가 최소한 하나의 차원에서 사용자 정의 컨트롤을 완전히 채우고 아무것도 자릅니다. UniformToFill에서는 emf가 두 차원 모두에서 UserControl을 채우고, aspectratio가 일치하지 않으면 emf가 한 차원에서 잘립니다. – bitbonk

답변

1

을 수행 할 수 있습니다 - 당신이 방법을 알아낼 필요 회전은 이미지의 경계 상자에 영향을 미치므로 적절하게 크기를 조절할 수 있습니다.

그럼 당신은 다음과 같이 할 수 있습니다 : 당신의 경계 상자의

  1. 물건 네 개의 좌표를 Point를 []에.
  2. 회전 (.RotateAt)을 사용하여 매트릭스 설정
  3. 매트릭스가 4 포인트로 변환됩니다.
  4. 변환 된 네 개의 X 좌표를 정렬하고 새 경계 상자 (정렬 후 pts [3] .X - pts [0] .X)의 너비를 비교하십시오.
  5. 이제 완벽하게 맞도록 너비를 조절하는 방법을 알았습니다.
  6. 높이에 대해서도 4 단계를 반복하십시오.
+0

내 그림이 반드시 직사각형 일 필요는 없습니다.예를 들어 도면이 원형 인 경우 회전 자체가 축척 계수에 영향을 미치지 않습니다. – bitbonk

+0

그러면 이미지의 모든 * 코너 *에 대해 위의 작업을 수행해야합니다. 원은 대략적으로 계산되어야하며 여러 선분으로 구성되어야한다고 생각해야합니다. –

+0

필자는 WPF (어딘가에있는 DWM 계층에있을 수 있음)가 어떻게하는지 궁금합니다. – bitbonk

0

는 GDI와 함께 할 것입니다 방법은 다음과 같습니다

BeginPath() 
// Draw stuff 
EndPath() 
PathToRegion() 
GetRgnBox() 

GDI +는 등가물을 가지고 - GraphicsPath와 내가 당신을 이해한다면 지역 클래스가 올바르게 위

+0

내 그림은 메타 파일에서 제공되므로 GraphicsPath는 적용되지 않을 것이라고 생각합니다. – bitbonk

+0

메타 파일은 GDI 호출의 직렬화 일 뿐이므로 GraphicsPath와 함께 작동해야합니다. MetaFile 클래스에는 GetMetafileHeader 메서드가 있습니다. 메타 파일 경계 상자를 가져 와서 회전 된 크기를 얻기 위해 삼각법을 사용할 수 있습니다. –

+0

음 그래픽 패스에는 AddMetaFile 또는 AddDrawing 또는 이와 유사한 메서드가 없습니다. – bitbonk