2012-02-22 11 views
2

3DアプリケーションでWinforms(そして最終的にはHostElement経由のWPF)を使用するために、SharpDXプロジェクトにWinformsを統合しようとしています。Winformsコントロールのペイントメソッドをオーバーライドして、テクスチャにペイントする方法を教えてください。

は、私が作成したり、コントロールを設定したり、私ができるような形態にする必要があります。それをテクスチャにレンダリングします(スプライトとして表示することができます*)
b。コントロールがアクティブでないときにマウス/キーボードイベントを取り除くためにその入力をフィルタリングします。

私はOnPaintとOnPaintBackgroundをオーバーライドするためにControlとFormのサブクラス化を試みましたが、これらは子コントロールには影響しません - フォームの境界線についても(そして、まだ「親」が描かれていると思われる白い四角で残っています)。

コントロールまたはフォームのペイントを画面に停止し、代わりにビットマップのみを描画できますか?(例えば、ツリーが描画される前にGraphicsをオーバーライドできる方法はありますか?)

*これはWinformsがサポートしていないので、このようにする必要があります本当の透明性があるので、ピクセルシェーダでカラーコード化されたピクセルをクリップする必要があります。

(私は特にDirectXのテクスチャを意味するものではありません、確認するために - 私はと満足しています(実際には)簡単なたSystem.Drawingビットマップを好む)

答えて

3

をここにそれについて行く開始する一つの方法は次のとおりです。

  • 我々はコントロールの画像
  • テストフォームは、ピクチャボックスと、myButtonという
  • のインスタンスを必要とし得るために私達のカスタムメソッドを呼び出し
  • を保護されているInvokePaintを公開することができるように派生コントロールクラスを作成します。


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

関連する問題