2

3D アプリで Winforms (および最終的には HostElement 経由の WPF) を使用するために、Winforms を SharpDX プロジェクトと統合しようとしています。

次のことができるように、コントロールまたはフォームを作成または構成する必要があります。

を。
b.テクスチャにレンダリングします (スプライトとして表示できます*) 。コントロールがアクティブでないときに、入力をフィルター処理してマウス/キーボード イベントを削除します。

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

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

* Winforms は真の透明度をサポートしていないため、(コントロールを画面にレンダリングするのではなく) この方法で行う必要があるため、ピクセル シェーダーで色分けされたピクセルをクリップする必要があります。

(確認するために、特に DirectX テクスチャを意味しているわけではありません。単純な System.Drawing ビットマップに満足しています (実際には好むでしょう))。

4

1 に答える 1

3

これを開始する 1 つの方法を次に示します。

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


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);
        }
    }
}
于 2012-02-22T18:00:19.453 に答える