Winformsコントロールのペイント方法をオーバーライドして、テクスチャに塗装するにはどうすればよいですか?
質問
3DアプリでWinForms(そして最終的にはホステルメントを介してWPF)を使用するために、WinFormsをSharpDXプロジェクトと統合しようとしています。
できるようにコントロールまたはフォームを作成または構成する必要があります。
a。テクスチャにレンダリングします(スプライトとして表示できます*)
b。入力をフィルタリングして、コントロールがアクティブでない場合にマウス/キーボードイベントを削除します。
私はサブクラス化のコントロールとフォームを試して、オンペイントとオンペイントバックグラウンドをオーバーライドしましたが、これらは子供のコントロールに影響を与えません。 「親」が描かれていると思われる白い広場)。
スクリーンへのコントロールまたはフォームの絵を停止し、代わりにビットマップにのみ描画するにはどうすればよいですか? (たとえば、ツリーが塗装される前にグラフィックをオーバーライドできる方法はありますか?)
*Winformsが真の透明度をサポートしていないため、この方法で(スクリーンにレンダリングするのではなく)この方法で実行する必要があるため、ピクセルシェーダーで色分けされたピクセルをクリップする必要があります。
(確認するために、私は具体的にDirectXテクスチャを意味しません - 私は(実際には単純なシステムを好む)ことに満足しています。
解決
これがそれを始め始める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);
}
}
}
所属していません StackOverflow