none
コントロールの重ね合わせについて RRS feed

  • 質問

  • お世話になっております。

    現在、ダイアグラム(工程図)を作成しております。

    ここに表示されているオブジェクトは全てコントロールで作成されています。

    本来であれば、オブジェクトを管理し全てをキャンバスとして描画すればよいのでしょうが
    知識も乏しくD&D移動やオブジェクトの選択がやり易いだろうということからこうなりました。

    さて、現時点では、それなりにオブジェクトの作成はできたのですが
    矢印を描画する際に【工程アイテムを透過して背景が見えて】しまいます。

    この問題に関しては、親オブジェクトを設定してあげることで解決するのでしょうが
    複数(最大100個)のオブジェクトを生成した時に、個々の透過処理を行うのでしょうか?

    1.工程アイテムを全て配置する
    2.それらの上に矢印をおく
    3.矢印同士の重ね合わせは?

    すみません、質問が曖昧になってしまいましたが、こういった場合の制作ロジックは
    どのようなものになるのかご教示頂けませんでしょうか。

    宜しくお願い致します。

    2015年3月25日 2:00

回答

  • これはWinFormsでの対応は難しいかもしれません。
    背景透過は親によって描画されるためです。

    透過にあたって以下の案を考えてみました。

    ・都度矢印コントロールと親コントロールを紐付ける
     →透過は出来る。ただし、親コンテナからはみ出た場合に描画されない。

    ・Paintイベントで矢印を描画してしまう。
     →透過は出来るしはみ出ることも出来る。矢印が重なった場合の透過も出来る。
      ただし矢印をドラッグでどう移動させれば良いのかが課題。
      工程アイテム間をなんらかの方法で紐付けし、間をPaintイベントで描画するだけならばいけそう。

    #WPFであれば透過も楽なんですがね・・・

    <追記>
    Paintでもはみ出るのはダメかもしれません。
    となるとどちらの案も微妙ですね…。
    他の方からの回答をお待ちください。

    2015年3月25日 3:57
    モデレータ
  • Regionプロパティを使ってその形に切り抜いてやれば良いんじゃないでしょうか。

    // それはそれでヒットテストが微妙になるかもしれませんが。

    • 回答としてマーク コーベル 2015年3月26日 0:13
    2015年3月25日 4:21
  • この辺りはあまり開発経験が無く、検索しただけなのですが、以下が参考になりませんでしょうか?

    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-sharp

    Label 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
    2015年3月25日 5:44
    モデレータ
  • Hongliangさんが書かれている方法だと、以下が参考になると思います。

    フォームやコントロールの形を変える
    http://dobon.net/vb/dotnet/form/formregion.html

    #以前、Code Projectでも見かけたのですが、探せませんでした。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク コーベル 2015年3月26日 0:13
    2015年3月25日 6:24
    モデレータ
  • 補足として。
    「矢印をドラッグして移動できる」、あるいは「矢印は矩形の対角線であり、矩形の境界でサイズを変えられる」といった機能がある場合、Region で切り抜くアプローチでは、つかみづらくなる(=ヒットテスト(当たり判定)が微妙になる)ということです。

    -----

    以下は個人的な意見として書きます。

    この手のものは、コントロールベースでやっているといずれきつくなります。
    透過の問題もそうですが、数を多く貼り付けると、表示までに時間がかかる、ちらつくといったトラブルをどうしても解決しづらく、結局、自前で全部 Draw していくことになることが多いと思います。
    短期でしのぐならよいですが、長く使っていく、置く数が増えるなら、再考をおすすめしたいです。。

    • 回答としてマーク コーベル 2015年3月26日 0:13
    2015年3月25日 13:29
    モデレータ

すべての返信

  • こんにちは。

    矢印を描画する際に【工程アイテムを透過して背景が見えて】しまいます。

    これがよくわかりませんでした。
    キャプチャなどで説明できますか。
    また、各工程アイテムと矢印はどのように実現しているのかも教えてください。

    また、

    矢印同士の重ね合わせは?

    このご質問は上記の透過問題と関連しますか?

    2015年3月25日 2:39
    モデレータ
  • Tak1waさん

    ご回答ありがとうございます。

    背景が透過対象になってしまっている図

    また、各工程アイテムと矢印はどのように実現しているのかも教えてください。

    各アイテムは、拡張ラベルコントロールを、PictureBox上のコントロールとして配置(Add)しています。

    このご質問は上記の透過問題と関連しますか?

    添付図の中央上にある矢印は、コントロール順番で言えば

    PictureBox⇒工程アイテム⇒矢印1⇒矢印2 となっているが、背景を描画してしまっている。
    また、矢印1の先端が隠れてしまっている。

    望む形は、

    ┏━━━┓
    ┃ ━━⇒
    ┃━━⇒┃
    ┗━━━┛

    となることです。

    解りにくくてすみません。


    2015年3月25日 2:52
  • これはWinFormsでの対応は難しいかもしれません。
    背景透過は親によって描画されるためです。

    透過にあたって以下の案を考えてみました。

    ・都度矢印コントロールと親コントロールを紐付ける
     →透過は出来る。ただし、親コンテナからはみ出た場合に描画されない。

    ・Paintイベントで矢印を描画してしまう。
     →透過は出来るしはみ出ることも出来る。矢印が重なった場合の透過も出来る。
      ただし矢印をドラッグでどう移動させれば良いのかが課題。
      工程アイテム間をなんらかの方法で紐付けし、間をPaintイベントで描画するだけならばいけそう。

    #WPFであれば透過も楽なんですがね・・・

    <追記>
    Paintでもはみ出るのはダメかもしれません。
    となるとどちらの案も微妙ですね…。
    他の方からの回答をお待ちください。

    2015年3月25日 3:57
    モデレータ
  • Regionプロパティを使ってその形に切り抜いてやれば良いんじゃないでしょうか。

    // それはそれでヒットテストが微妙になるかもしれませんが。

    • 回答としてマーク コーベル 2015年3月26日 0:13
    2015年3月25日 4:21
  • Tak1waさん

    ご回答ありがとうございます。

    今回の納品は1次納品で、とりあえず工程図の閲覧できればよいので
    2次納品にてドラッグ移動に対応しようと思います。

    なので、矢印を上から描画するようにします。

    #WPFであれば透過も楽なんですがね・・・

    他の識者の方々からWPFで制作するよう助言を頂いていたのですが、工数の兼ね合いもあり
    断念した次第です。。

    2015年3月25日 4:26
  • この辺りはあまり開発経験が無く、検索しただけなのですが、以下が参考になりませんでしょうか?

    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-sharp

    Label 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
    2015年3月25日 5:44
    モデレータ
  • Hongliangさんが書かれている方法だと、以下が参考になると思います。

    フォームやコントロールの形を変える
    http://dobon.net/vb/dotnet/form/formregion.html

    #以前、Code Projectでも見かけたのですが、探せませんでした。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク コーベル 2015年3月26日 0:13
    2015年3月25日 6:24
    モデレータ
  • 補足として。
    「矢印をドラッグして移動できる」、あるいは「矢印は矩形の対角線であり、矩形の境界でサイズを変えられる」といった機能がある場合、Region で切り抜くアプローチでは、つかみづらくなる(=ヒットテスト(当たり判定)が微妙になる)ということです。

    -----

    以下は個人的な意見として書きます。

    この手のものは、コントロールベースでやっているといずれきつくなります。
    透過の問題もそうですが、数を多く貼り付けると、表示までに時間がかかる、ちらつくといったトラブルをどうしても解決しづらく、結局、自前で全部 Draw していくことになることが多いと思います。
    短期でしのぐならよいですが、長く使っていく、置く数が増えるなら、再考をおすすめしたいです。。

    • 回答としてマーク コーベル 2015年3月26日 0:13
    2015年3月25日 13:29
    モデレータ
  • Hongliangさん
    trapemiyaさん
    Azuleanさん

    みなさん、ご回答ありがとうございます。

    regionや、親設定等、色々な対策があるのですね、本当に勉強になります。

    ありがとうございます。

    Azuleanさんの仰るとおり、コントロールでの作成は最初は楽かも知れませんが
    いずれ限界がくるのは解ります。

    昔つくったシューティングゲームを参考に、オブジェクトを座標管理し当たり判定するよう
    対策していきたいと思います。

    みなさん、ありがとうございました。

    2015年3月25日 22:17