• 締切済み

C#で作図ツール作成

作図ツールを作っています。 PowerPointの「カギコネクタ」のようなものを描画後に移動させたり変形させる場合はどのような実装が適切なのか素人ゆえさっぱりわかりません。 pictureboxなどのコントロールに描画するのか、直線に分解して個々のコントロールをまとめて管理するのかなど、より簡単で一般的(適切)な実装があればアドバイスいただければと思います。

みんなの回答

noname#247307
noname#247307
回答No.1

これはビットマップ描画ではなくて、いわゆるドロー系ツールを作る場合、ということですね。おおまかに分けて、2つのやり方があります。 1つは、描画する図形の情報(図形の種類、位置、大きさ、線分の太さ、色、といったもの)を配列などにまとめて保管しておき、そこから順にデータを取り出して描画していくメソッドなどを用意する、というものです。つまり、「図形のデータ」と「描画処理」に分けてそれぞれ管理する、というやり方ですね。 もう1つは、描く図形のそれぞれに図形表示のクラスを定義していき、そのインスタンスをコレクションなどでまとめて管理する、というやり方ですね。抽象クラスクラスとして位置、大きさ、線分の太さ、色、といったプロパティ、それらを元に図形を描くメソッドなどをもったものを定義し、このサブクラスとしてそれぞれの図形クラスを定義していくわけです。 前者は、プログラムとしてはシンプルになりデータも扱いやすいでしょうが、図形の種類の増やすなど拡張が面倒です。後者はプログラムが全体に大きくなるでしょうが、後で拡張や修正がしやすいでしょう。

yakipurin3
質問者

お礼

ご回答ありがとうございます。 実装のイメージが出来ました。 トライしてみます。

関連するQ&A

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

  • イラストレーターの描画ツールで同じ線幅で描くには

    線幅について2点質問があります。 1つ目 直線ツールや円弧ツールなどの描画ツールで、何度も同じ線幅で線を描きたいときにはどうしたらよいのでしょうか? 一度線幅を設定して描いても、テキスト入力や別のオブジェクトの移動など他の作業を行ったあとに同じツールで描画すると線幅が未設定になって色のない(透明な)線になってしまいます。 毎回線幅に数字を入力するのが面倒なのです。 2つ目 線幅の数値を設定する欄の横の▼をクリックするとリストがでますが、そこによく使う数値を登録することはできないのでしょうか? ちなみに0.6ptや0.7ptをよく使います。 IllustratorのバージョンはCS3を使っています。 どなたかおわかりになる方がいらっしゃいましたら、教えていただけますでしょうか? よろしくお願いいたします。

  • テトリスの作り方について質問します。

    テトリスの作り方について質問します。 ゲームプログラミングの勉強をしています。 今のお題はテトリスなのですが、少々行き詰ってしまいました。 今の進行状況ですが、 落下ブロックの生成 ↓ 自動落下処理 ↓ キー判定でブロック移動処理 ↓ 徐々にブロックが落ちてきて、一番下のラインまで落ちる までいったのですが、その次のブロックの着地処理といいますか、落下ブロックが下まで落ちた時に積み上がる処理のイメージが湧かずに困っています。 まだ、『積み上がったブロックが揃っている段があるか』まで実装するつもりはありませんので、まず『積み上がるブロックの表現』について悩んでいます。 例えば、積み上がるブロック用のPictureBoxを用意して、落下ブロックをコピーして描画していく、とか、背景になっている親コントロールに直接描画してしまう、とか。 いずれにしても、後々、『積み上がったブロックに揃っている段があり、そのラインが消えて、そこから上のブロックがダンッ!と落ちる』処理がやり易くなる方法を探しています。 何かアドバイスをください。

  • C#(.net) ドロー系ソフト作成 図形選択方法

    C#(.net framework 4.0)で現在業務に使用しているソフトで、地図画像に対して、ごく初歩的な図形(直線や矢印、円、四角形、文字程度)を挿入する事が必要になりそうでして、ドローソフト系のようなプログラミングを行いたいと思っています。(Excel上での図形挿入の様なイメージ) Graphicsを使用して、線や塗りなどの描画はすぐにできると思うのですが、一度描画した線や四角を移動させたり大きさを調整したりするために、対象の図形をマウスでクリックして選択する方法がまるでうかびません。通常、この「図形を選択する」というのはどのように実現させているのでしょうか?思いつくものとしては、 図形をコントロールとして扱い、マウスイベントを直接受け取れるようにする? (そもそもコントロールの使い方として間違っているような気がしますし、パフォーマンスにかなりの悪影響がありそう…) 別に座標マップを作り、どの図形がどのドットに対応しているかを記録する? (線を引いた結果、どの座標がどの図形かをすべて計算する必要があると、かなりの計算とコード量になりそう…) くらいです。基本的な、もしくは一般的な方法や考え方がありましたら是非教えてください。ペイント系ならそれなりにネット上に情報はあるような気もするのですが、ドロー系に関する情報はなかなか少ないようで困っています。ドロー系ソフト作成時に参考になるコードや情報や本などありましたら、そちらも教えていただけると助かります。よろしくお願いいたします。 P.S. 質問投稿時にさんざん迷ったのですが、C#(.Net Framework)のカテゴリーって、こちらの C・C++ でよろしかったんでしょうかw

  • C++/CLIで画像処理

    お世話になります VC 2010 C++/CLIで作成されている、既存プロジェクトに以下のグラフィック機能を追加したいのですが、 色々試しては挫折してます。 実現可能なライブラリを教えていただけないでしょうか。 【補足】 ・既存プロジェクトはそれなりに大きなものなので、既存部の書き換えは考えておりません ・既存プロジェクトはPictureBoxで出来る範囲の色々な描画を行っているので、ここはそのまま残す予定 【追加機能】※ 以下は新規に子フォームを作成して、独立した機能として追加予定 1. 異なるサイズの画像(写真)を重ねて描画する(これは、単純なので標準の機能を始め全てで出来ます。) 2. 上面の画像を半透明にして、背景の写真を透過 (上面画像の背景を透過するのではなく、上面画像の全体を透過) 3. 上面の画像をマウスに追従して移動 4. 上面の画像の4点を個別にマウス指定で変形 5. 1~4で出来上がった画像の合成&出力 【試したもの】(理解ミスが有るかもしれません) ※事前検討で実現困難なライブラリも小細工できないかと、念のためそれぞれ試しております。 1. 標準の機能 ・アドバイスをいただき、透過はできたのですが、4の変形ができない (画像データを変形毎に計算して求めるのは非現実的なので適用していません・・変形後も移動が有る為) 2. OpenCV ・透過処理がアルファブレンドなので、3の処理が遅い (理想はOpenGLの様にZバッファを使用して、背景が透過するもの・・・背景を意識しない処理のみで済むもの) ・透過処理がアルファブレンドなので、同サイズの画像か背景を上面と重なる部分を検出して切り出す必要がある (上面の画像の変形を考えると、背景を上面に合わせて切り出すのは困難) ・4が矩形しか対応していないので、ひし形までしか変形できない (視点の変更で形状こそ求めているものに近くなるが、今回の用途ではユーザーに単純操作で変形させてあげる必要がある) 3.OpenGL ・画像単体での読み書きができない (テクスチャマッピング機能を用いるか他のライブラリを併用する必要がある) ・平面ポリゴンを定義して、テクスチャマッピングをした場合、4の変形時にマッピング画像が追従するようにする必要がある 4.DXLib ・追加機能に対応する機能を持ってはいるが、そもそもCLIに対応していない 5.GDI+ ・CLI対応のサンプルが見つからない? (CLI以外のサンプルは多々見かけるのですが、ウインドウのハンドルやポインタの使い方が異なり、苦戦中) ・そもそも、説明しているサイトが少ない (私のような素人がみるとどれがGDI+の記述でどれが標準の機能なのか判らないものばかり  せめてGDI+のXXXを使用すると以下のソースになるみたいな説明がされているサイトがが有れば教えてください) 6.Direct2D ※まだ検証してません

  • 曲線の描画方法

    VB2005でプログラミングをしています。 目標としては、曲線を描画して、更にその曲線をドラッグなどができるようにしようとしています。 ピクチャーボックスに曲線を描くのはDrawCurveでできましたがこれでは曲線の移動などはできないので、別の方法を探しています。 調べているとLineShapeというコントロールがあることを知り、曲線は無理でもこのLineShapeで作った直線のコントロールをグループ化して折れ線のようにし、さらにグループ化した折れ線をドラッグなどの処理が行えるようにできないかと模索しています。このような処理は可能でしょうか? 一応、LineShapeを繋ぎ合わせて折れ線はできましたが、マウスカーソルをこのコントロールの上に持っていくとやはり直線一本一本がバラバラでしか認識できません。マウスカーソルを持っていったときに折れ線として認識できるようにしたいのですが、いい案はないでしょうか?ご教授お願いいたしますm(_ _)m

  • コントロールツールボックスの利用法。

    VBA(エクセル)初心者です。 マクロは、ちょっとした作業を簡略化する・条件付の計算を自動化させる程度にしか、使いこなせてません。 そんなど素人の小生ゆえ(^_^A、コントロールツールボックスを使って、ボタンorチェック項目を作成・利用する方法について、やり方がよく分からないので、質問させていただきます。 とりあえず、作ってみたものは。。。 いくつかの項目を選択することで、別のシートに格納されている一覧表から条件にあった数値を、打ち出す。といったタイプのものです。 選択項目は、例えば『地域』、『月』、『時間帯』といった感じの項目を3つ程設け、「どこそこの、何月、何時のデータはコレ」と出したいのです。 データの格納法によって、引き出し方も異なってくるでしょうし、それは後でじっくり考えるとして・・・ その前に、選択肢(ボタンorチェック項目)の設置の仕方が分からずに困っております; ほんと、ど素人の質問でお恥ずかしいのですが、ご回答のほど宜しくお願いいたします。

  • [.NET2003] あのコントロールは何というのですか?

    これから.NET2003 C#でプログラミングをしようとしていています。MFCからの移行組みです。 すごくド素人な質問で恐縮ですが、 .NET2003の画面デザインの時に表示される、コントロール一覧のツールボックスがありますよね。 データ、コンポーネント、Windowsフォーム、全般で切り替えられる、アレです。 クリックすると、その部分がスルスルとカーテンみたいに伸び縮みして、そのタブの部分の一覧が表示される、アレです。 アレを実装したいのですが、アレは何というコントロールなんでしょうか? それともVSが独自に作ったコントロールなのでしょうか?

  • Illustratorのスナップの取り方

     Illustrator の超初心者です、Illustrator Ver10についての質問です。宜しくお願いします。  既に描かれている直線、曲線にペンツールを近づけるとペンの右下に「×」、「/」、「Λ」 が表示されますが、この意味はどのような意味で、どのような場合に使うのでしょうか。  また、ダイレクト選択ツール、選択ツールでも「■」、「□」が表示されますがどのような意味でしょうか。  鉛筆ツールで、線の端点、四角形の頂点、中心点にスナップさせるのは皆さんどのようにされているのでしょうか。  いくら図形の上を動かしても、「+」から変わりません。  大きさの異なる四角形を同じ中心になるように移動、複写する時などはどのように作図すればよいのでしょうか。  AutoCADから入っているので常にスナップの取り方が気になって仕方がありません。  色々と本を読んで調べてもそれらしきことを解説している本に見当たりません。  ネットでも調べてもそのようなサイトも見当たらなく困っています。 宜しくお願いします。

  • JLabelとJLabelを結ぶ直線をJComponentとしてカプセル化

    別にJLabelでなくてもよいのですが、JPanel上のJComponentを繋ぐ直線を表すクラスをJComponentを継承したクラスとして扱いたいのですが、どのようにすればよいでしょうか? というのもやりたいことは、JPanel上のJComponentを移動させたときにそれを繋ぐ線も動くとともに、その線上で発生するイベント(たとえばMouseEvent)を処理したいからです。 現段階ではJPanelに直に線を描画し、JPanelと同じ大きさのオフスクリーンに各線の識別IDを色とした線を描画することで、カーソルの位置から当たり判定をするという荒い方法で対処しています。 なんとかこの線をオブジェクととしてカプセル化したいのですが、なにかよい方法はないでしょうか? ピュアJavaで実装したいため、SWT+EMF(+Draw2D)は考えていません。 またそのようなピュアJavaのライブラリがあれば教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう