5

次のようなもので手動で作成される単純なユーザーコントロールを作成しました

MyUserControl ctrl = new MyUserControl();

コントロールはBackColor = Color.Transparentを持つように設計されており、コントロールのをフォームの色に変えるまで、正常に動作します。

透明のように聞こえるかもしれませんが、フォームに存在するすべてのコントロールも非表示にします。しっかりした背景を取得するコントロールか、それを接続すると他の何かが発生し、他のコントロールが表示されなくなるのか、100% 確信が持てません。

基本的にこうすれば

  • フォームを作成する
  • その上にボタンをドロップします
  • ボタンのクリックハンドラーで、次のことを行います

MyUserControl ctrl = new MyUserControl();
ctrl.Parent = this;
ctrl.BackColor = Color.Transparent;
ctrl.Size = this.Parent.ClientRectangle.Size;
ctrl.Location = this.Parent.ClientRectangle.Location;
ctrl.BringToFront();
ctrl.Show();

基本的に、フォーム上に下にあるコントロールを表示しながら、ユーザーコントロールをフォーム全体にオーバーレイする必要があります(したがって、透明な背景)。実際にはフォームに属しておらず、他のすべてのものの上に表示されているだけなので、フォームコントロールコレクションに追加したくありません

親を設定せずに同じことを試みましたが、コントロールはまったく表示されませんでした。

ありがとう!

編集: ユーザー コントロールで OnPaintBackground メソッドをオーバーライドし、背景がペイントされないようにすると機能しますが、DrawImage を使用してコントロールでペイントしている PNG 画像の透明部分が台無しになります。これは理にかなっています。

4

1 に答える 1

6

Windows フォームは、透過的なコントロールを実際にはサポートしていません。
この制限を回避するには、コントロールの CreateParams プロパティをオーバーライドし、カスタム スタイルを設定します (Google で検索してください)。
さらに、コントロールだけでなく親コントロールも再描画されるように、コントロールの描画をオーバーライドする必要があります。その理由は、コントロールがそれ自体をペイントする前に背景をペイントする必要があるためです。
最後に、これまで行ってきたように、OnPaintBackground メソッドをオーバーライドして、背景が描画されないようにする必要があります。

かなりぎこちなく、完璧ではありませんが、うまくいくはずです。

于 2008-12-17T08:15:23.230 に答える