DOBON.NET DOBON.NETプログラミング掲示板過去ログ

オートシェイプのような機能

環境/言語:[VB.NET NET Framework1.1]
分類:[.NET]

こんにちは
MS Officeのオートシェイプのような機能を実装したく悩んでいます
(オートシェイプの形状は、矩形や矢印のようなシンプルなものだけと考えています)

まず、下敷きのコントロールですが今回はDataGridを使用しています。
その上に、オートシェイプのような物として、矩形や、矢印を配置したいのです。

DataGridのGraphicsを取得してそこに矩形を描けばよいのでしょうが、
その矩形を移動したり変形したりする為には、コントロールを分けるべきだと考えました。

そこで、DataGridの上にPictureBoxを子コントロールとして追加して、
そのPictureBox.Paintメソッドのオーバライドで、PictureBoxに矩形や矢印(不透明)は描画できましたが、
PictureBox自体の背景が透明にできません(下のDataGridが見えるようにしたい)

下にあるコントロールを表示させたまま、上のコントロールに矩形や矢印を描くにはどうしたらよいのでしょうか?
よろしくお願いします

-------------------------------------------------
背景を透明にするために試した事は以下です
1.PictureBoxのサブクラスで SetStyle(ControlStyles.Opaque, True)
2.Paintメソッドでの FillRectangle(New SolidBrush(Color.FromArgb(0)),rectangle)
3.PictureBox.BackColor = color.Transparent とか Color.FromArgb(0)
4.PictureBox.Parent = DataGrid とか
5.PictureBox.Imageに透明のBitMapを指定
6.背景イメージのをアルファ値をColorMatrixで変更
keiさん、こんにちは
描画したい部分だけをRegionに設定してあげればよいかと思います。
http://dobon.net/vb/dotnet/form/formregion.html
ゆさん、ありがとうございます

> 描画したい部分だけをRegionに設定してあげればよいかと思います。

以下のようにPictureBoxの外接1pxのRegionを設定してみたところ
たしかにコントロールがそのような形状になりました

しかしこれではコントロールの中で描画できる部分が限られている為
矢印等には対応できません


なにか他に良い方法はないでしょうか?

-------------------------------------------
Dim rct As Rectangle = PictureBox1.ClientRectangle
Dim rgn As New Region(rct)
rgn.Exclude(New Rectangle(1, 1, rct.Width - 2, rct.Height - 2))
PictureBox1.Region = rgn
rgn.Dispose()
keiさん、こんにちは

以前、イメージボタンを作成したときに使った方法を・・

イメージの幅、高さでループして1ピクセル単位で色を取得。
透明色をあらかじめ決めておき、そのピクセルが透明色で
なくなったところで、Rectangleを作成してRegionにAddRectangleします。

Regionに設定できるのは1点ではありませんので、透明にしたい部分を
複数設定してみてください。
ゆさん、こんにちは

> Regionに設定できるのは1点ではありませんので、透明にしたい部分を
> 複数設定してみてください。

調べたらRegionオブジェクトには形状を組み合わせる
Union,Intresect,Exclude,Xor,Complement の様に多数のメソッドがありました

たとえば矢印型のコントロールを作成したければ
Regionを組み合わせてその形にしてしまえば良いということですよね?

いろいろありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板