トップ回答者
コントロールの重ね合わせについて

質問
-
お世話になっております。
現在、ダイアグラム(工程図)を作成しております。
ここに表示されているオブジェクトは全てコントロールで作成されています。
本来であれば、オブジェクトを管理し全てをキャンバスとして描画すればよいのでしょうが
知識も乏しくD&D移動やオブジェクトの選択がやり易いだろうということからこうなりました。さて、現時点では、それなりにオブジェクトの作成はできたのですが
矢印を描画する際に【工程アイテムを透過して背景が見えて】しまいます。この問題に関しては、親オブジェクトを設定してあげることで解決するのでしょうが
複数(最大100個)のオブジェクトを生成した時に、個々の透過処理を行うのでしょうか?1.工程アイテムを全て配置する
2.それらの上に矢印をおく
3.矢印同士の重ね合わせは?すみません、質問が曖昧になってしまいましたが、こういった場合の制作ロジックは
どのようなものになるのかご教示頂けませんでしょうか。宜しくお願い致します。
回答
-
これはWinFormsでの対応は難しいかもしれません。
背景透過は親によって描画されるためです。透過にあたって以下の案を考えてみました。
・都度矢印コントロールと親コントロールを紐付ける
→透過は出来る。ただし、親コンテナからはみ出た場合に描画されない。・Paintイベントで矢印を描画してしまう。
→透過は出来るしはみ出ることも出来る。矢印が重なった場合の透過も出来る。
ただし矢印をドラッグでどう移動させれば良いのかが課題。
工程アイテム間をなんらかの方法で紐付けし、間をPaintイベントで描画するだけならばいけそう。#WPFであれば透過も楽なんですがね・・・
<追記>
Paintでもはみ出るのはダメかもしれません。
となるとどちらの案も微妙ですね…。
他の方からの回答をお待ちください。- 編集済み Tak1waMVP, Moderator 2015年3月25日 4:05
- 回答としてマーク コーベル 2015年3月26日 0:13
-
この辺りはあまり開発経験が無く、検索しただけなのですが、以下が参考になりませんでしょうか?
How to make the background of a label transparent in c# [duplicate]
http://stackoverflow.com/questions/25830079/how-to-make-the-background-of-a-label-transparent-in-c-sharpLabel Transparent on picturebox vs 2005 c#
http://www.44342.com/dotnet-framework-f70-t2359-p1.htm上記の方法だとドラッグ対応が難しそうですが、矢印をドラッグすることはあまり無さそうなので、大丈夫かな?
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク コーベル 2015年3月26日 0:13
-
補足として。
「矢印をドラッグして移動できる」、あるいは「矢印は矩形の対角線であり、矩形の境界でサイズを変えられる」といった機能がある場合、Region で切り抜くアプローチでは、つかみづらくなる(=ヒットテスト(当たり判定)が微妙になる)ということです。-----
以下は個人的な意見として書きます。
この手のものは、コントロールベースでやっているといずれきつくなります。
透過の問題もそうですが、数を多く貼り付けると、表示までに時間がかかる、ちらつくといったトラブルをどうしても解決しづらく、結局、自前で全部 Draw していくことになることが多いと思います。
短期でしのぐならよいですが、長く使っていく、置く数が増えるなら、再考をおすすめしたいです。。- 回答としてマーク コーベル 2015年3月26日 0:13
すべての返信
-
Tak1waさん
ご回答ありがとうございます。
背景が透過対象になってしまっている図
>また、各工程アイテムと矢印はどのように実現しているのかも教えてください。
各アイテムは、拡張ラベルコントロールを、PictureBox上のコントロールとして配置(Add)しています。
>このご質問は上記の透過問題と関連しますか?
添付図の中央上にある矢印は、コントロール順番で言えば
PictureBox⇒工程アイテム⇒矢印1⇒矢印2 となっているが、背景を描画してしまっている。
また、矢印1の先端が隠れてしまっている。望む形は、
┏━━━┓
┃ ━━⇒
┃━━⇒┃
┗━━━┛となることです。
解りにくくてすみません。
- 編集済み コーベル 2015年3月25日 2:53 修正
-
これはWinFormsでの対応は難しいかもしれません。
背景透過は親によって描画されるためです。透過にあたって以下の案を考えてみました。
・都度矢印コントロールと親コントロールを紐付ける
→透過は出来る。ただし、親コンテナからはみ出た場合に描画されない。・Paintイベントで矢印を描画してしまう。
→透過は出来るしはみ出ることも出来る。矢印が重なった場合の透過も出来る。
ただし矢印をドラッグでどう移動させれば良いのかが課題。
工程アイテム間をなんらかの方法で紐付けし、間をPaintイベントで描画するだけならばいけそう。#WPFであれば透過も楽なんですがね・・・
<追記>
Paintでもはみ出るのはダメかもしれません。
となるとどちらの案も微妙ですね…。
他の方からの回答をお待ちください。- 編集済み Tak1waMVP, Moderator 2015年3月25日 4:05
- 回答としてマーク コーベル 2015年3月26日 0:13
-
この辺りはあまり開発経験が無く、検索しただけなのですが、以下が参考になりませんでしょうか?
How to make the background of a label transparent in c# [duplicate]
http://stackoverflow.com/questions/25830079/how-to-make-the-background-of-a-label-transparent-in-c-sharpLabel Transparent on picturebox vs 2005 c#
http://www.44342.com/dotnet-framework-f70-t2359-p1.htm上記の方法だとドラッグ対応が難しそうですが、矢印をドラッグすることはあまり無さそうなので、大丈夫かな?
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク コーベル 2015年3月26日 0:13
-
補足として。
「矢印をドラッグして移動できる」、あるいは「矢印は矩形の対角線であり、矩形の境界でサイズを変えられる」といった機能がある場合、Region で切り抜くアプローチでは、つかみづらくなる(=ヒットテスト(当たり判定)が微妙になる)ということです。-----
以下は個人的な意見として書きます。
この手のものは、コントロールベースでやっているといずれきつくなります。
透過の問題もそうですが、数を多く貼り付けると、表示までに時間がかかる、ちらつくといったトラブルをどうしても解決しづらく、結局、自前で全部 Draw していくことになることが多いと思います。
短期でしのぐならよいですが、長く使っていく、置く数が増えるなら、再考をおすすめしたいです。。- 回答としてマーク コーベル 2015年3月26日 0:13