2012-02-22 4 views
2

내 3D 응용 프로그램에서 Winforms (그리고 결국 HostElement를 통해 WPF)를 사용하기 위해 SharpDX 프로젝트에 Winforms를 통합하려고합니다.Winforms 컨트롤의 페인트 메서드를 재정 의하여 어떻게 텍스처에 페인트 할 수 있습니까?

A :

내가 만들거나 컨트롤을 구성하거나 내가 할 수있는 그러한 양식 할 필요가있다. 그것을 텍스처로 렌더링하십시오. (스프라이트로 표시 할 수 있습니다.)
b. 컨트롤이 활성화되어 있지 않을 때 입력을 필터링하여 마우스/키보드 이벤트를 제거합니다.

나는 Control과 Form을 서브 클래 싱하여 OnPaint와 OnPaintBackground를 오버라이드하려고 시도했으나 이것들은 자식 컨트롤에 영향을 미치지 않는다. - 또는 폼 테두리와 관련하여 (그리고 그것들이 나 자신으로는 충분하지 않더라도 나는 여전히 '부모'가 그려져 있다고 추정하는 흰색 사각형으로 남았습니다.)

어떻게 컨트롤이나 폼 페인팅을 화면에 표시하지 않고 대신 비트 맵으로 만 그릴 수 있습니까? (예를 들어, 트리를 그리기 전에 그래픽을 재정의 할 수있는 방법이 있습니까?)

* Winforms에서 지원하지 않는 방식으로 (컨트롤을 화면에 렌더링하는 것과는 대조적으로) 이렇게해야합니다. 진정한 투명성 때문에 픽셀 쉐이더에서 색으로 구분 된 픽셀을 클립해야합니다.

(내가 특별히 다이렉트 텍스처를 의미하지 않는다, 확인 - 내가 (사실은 선호에) 간단한 System.Drawing 비트 맵과 행복)

답변

3

는 여기에 대해려고 시작하는 한 방법입니다 :

우리는
  • 는 컨트롤의 이미지를 얻기 위해 우리의 사용자 정의 메소드를 호출 보호 InvokePaint를 노출 할 수 있도록
    • 파생 컨트롤 클래스를 작성
    • 시험의 형태는 그림 상자와 myButton에
    • ,745의 인스턴스를 필요


    using System; 
    using System.Drawing; 
    using System.Windows.Forms; 
    
    namespace WindowsFormsApplication1 
    { 
        public partial class Form1 : Form 
        { 
         public Form1() { InitializeComponent(); } 
    
         private void Form1_Load(object sender, EventArgs e) 
         { 
          // create image to which we will draw 
          var img = new Bitmap(100, 100); 
    
          // get a Graphics object via which we will draw to the image 
          var g = Graphics.FromImage(img); 
    
          // create event args with the graphics object 
          var pea = new PaintEventArgs(g, new Rectangle(new Point(0,0), new Size(100,100))); 
    
          // call DoPaint method of our inherited object 
          btnTarget.DoPaint(pea); 
    
          // modify the image with algorithms of your choice... 
    
          // display the result in a picture box for testing and proof 
          pictureBox.BackgroundImage = img; 
         } 
        } 
    
        public class MyButton : Button 
        { 
         // wrapping InvokePaint via a public method 
         public void DoPaint(PaintEventArgs pea) 
         { 
          InvokePaint(this, pea); 
         } 
        } 
    } 
    
  • +0

    명시 적으로 호출 InvokePaint가 잘 작동하고 지금 내 텍스처로 렌더링, 감사합니다! – sebf

    +0

    "DrawToBitmap"을 사용할 수도 있습니다. 나는 이것이 통제에서 파생 될 필요성을 피할 것이라고 생각한다. btnTarget.DrawToBitmap (img, 새 사각형 (새 점 (0,0), 새 크기 (100,100)); – chrispepper1989