CADのようなソフトを作るには?

[戻る]
2010/04/06(火) 16:59:03
CADほど高度なものではないのですが、
X,Yの移動量がリストになったデータがあり、そのデータをもとに
一筆書きのように描画するソフトの作成を目指しています。

さらに描画は拡大・縮小・スクロールに対応し、
移動量リストが選択でき、選択したポイントを描画でポイント表示させたい
と思います。

しかしながら、図形描画に関していろいろと疑問点がありつまずいています。
いくつか疑問点について教えていただけないでしょうか?

尚、開発環境はVC++6.0 でMFCを使用します。

(1)図形の描画領域にはコントロールが必要?
 ダイアログベースのアプリで考えていて、コントロールを置かなくても
 ダイアログ上に図形描画はできると思いますが、必要なのでしょうか?
 ピクチャーコントロール上に描画したほうがよいのでしょうか?

(2)拡大・縮小のやり方
 表示領域のみを描画しなおす手法がよいのでしょうか?
 裏画面に全体を最大に拡大した描画をしておき、必要な部分だけを縮小して
 表示するほうがよいのでしょうか?
 (そもそもこんなことができるのか、よくわかりませんが)

(3)スクロールのやり方
 スクロールバーを自前で準備して、あとは拡大・縮小と同じように
 表示領域のみを描画しなおすか、全体から必要な分だけを表示するという
 やり方しかないでしょうか?
 もっとよい手法があるのでしょうか?

(4)ポインタの表示方法
 ポインタの表示はどのようにすればよいのでしょうか?
 図形描画の上にポインタだけを重ねて描画するといったことは可能でしょうか?
 それとも、ポインタの描画も含めた図形描画を行わなければならないでしょうか?

たいへん、抽象的なわかりにくい質問ばかりですが、
ご回答をよろしくお願いします。

maru 2010/04/06(火) 19:04:49
下記のSCRIBBLE サンプルを勉強すれば必要なことはほぼそろっていると思います。
http://msdn.microsoft.com/ja-jp/library/f35t8fts.aspx
このサンプルは VC2008ですがVC6にも同等サンプルがあったはずです。

でも、いまさらVC6?

仲澤@失業者 2010/04/06(火) 19:25:14
仮定1.移動量の単位がピクセルでなく、
    何らかの物理単位である場合を仮定します。

>(1)図形の描画領域にはコントロールが必要?
  描画専用コントロールを作成したほうがよいか?
  という質問だと解釈すると「その方が良い」と考えます。

>(2)拡大・縮小のやり方
  そもそも仮定1.で「物理単位->画面ピクセル」変換が必要なので、
  そこに拡大率とオフセット量を勘案するのは簡単です。
  別の方法として(これを「拡大方法A」とします)
  SetMapMode(HDC,MM_ISOTROPIC)で、SetWindowExtEx() SetViewportExtEx()
  SetWindowOrgEx() SetViewportOrgEx()
  を使って拡大縮小オフセット移動を行う方法も理解さえできれば簡単です。

>(3)スクロールのやり方
  「拡大方法A」を使うならSetViewportOrgEx()か、SetWindowOrgEx()
  に与えるx,yが、オフセット量(スクロール量)になります。
  それ以外は自前で実装します。

>(4)ポインタの表示方法
  「ポインタ」が何であるのかわかりません。
  あてずっぽうですが、描画点を強調表示したいのであれば、
  その座標に「×」でも描画すればよいのではないでしょうか。

2010/04/06(火) 21:36:57
maru様、仲澤@失業者様、ご回答ありがとうございました。

>下記のSCRIBBLE サンプルを勉強すれば必要なことはほぼそろっていると思います。
過去の質問でもこのサンプルについてでてきてましたね。
VC6のものをさがしてみます。

>でも、いまさらVC6?
はい、今さらですが。。。

仲澤@失業者様、質問がわかりにくかったと思いますが、
おそらく予想された内容の質問どおりです。

わたくしなりに解釈しましたが間違ってないでしょか?

>(1)図形の描画領域にはコントロールが必要?

   ダイアログのベースの上に直接描画するのではなく、
   ダイアログの上にピクチャーコントロールをのせて
   ピクチャーコントロールのOnDraw()で記述するということですね。

   少し疑問なのですが、描画専用コントロールというのは、ピクチャー
   コントロール以外にもあるのでしょうか?
   また、ダイアログに直接描画するのではなく、描画専用コントロールを
   作成したほうがよいのはなぜでしょうか?

>(2)拡大・縮小のやり方

  「拡大方法A」がよさそうですね。
  教えていただいた、マップ関数を勉強してみます。

>(3)スクロールのやり方

  こちらも「拡大方法A」であれば、容易そうですね。
  スクロールバーなどは、自前でやるしかないのですね。

>(4)ポインタの表示方法

  図形描画はそのままで、×だけを重ねて表示するということが
  できるのかなと思いましたが、やはり×も図形の一部として
  描画する必要があるのですね。


  

2010/04/07(水) 00:58:35
私はたいしたはアドバイスできませんが
ラバーバンドみたいな言葉も覚えないと
CAD系は難しいです。

ryo 2010/04/07(水) 01:27:28
プログラムの知識・技術があり、
かつ、作りたい物の仕様が固まっていてそれを理解しているのなら、
最初から、結末を想定していろいろ考えておくべきでしょうが、
今はまだ、どっちも中途半端な感じがします。

いきなり、「今考えてる最終目標」を目指して、あれこれ頭で考えても
あまり意味はないと思います

一旦、自分の知識で作れる部分だけでもつくってから
行き詰ったところを質問し、理解と経験を深めて作り直す
・・・を1,2回繰り返したほうがいいと思います


>  図形描画はそのままで、×だけを重ねて表示するということが
>  できるのかなと思いましたが、やはり×も図形の一部として
>  描画する必要があるのですね。
何がいいたいのかわからない。

2010/04/07(水) 10:04:52
[[解決]]
な様、ryo様、ご回答ありがとうございました。

ラバーバンドという言葉は初めて聞きました。
確かに重要な要素ですね。最終的に対応していきたいと思います。

ryo様

たいへん核心的なご意見ありがとうございます。
たしかに今、中途半端なところです。
本来は行き詰ったところを局所的に質問するべきですよね。

まずは、自分の手を動かして、実際にいろいろと試しながら
進めていきたいと思います。
みなさま、たいへんありがとうございました。

古いスレッドには追加発言できません。