🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

5057閲覧

図形をドラッグ&ドロップで移動するC++プログラム

LenItsuki

総合スコア89

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/25 09:39

ビューワーに表示している図形をドラッグ&ドロップで移動するプログラムを開発したい次第です.
開発環境は以下のとおりです.

  • OS:Windows10 64 bit
  • プログラミング言語:C++
  • 開発で使用しているツール:msys2,mingw64,emacs,g++,opengl

既に,図形を表示するプログラムまではできています.
あとは,その図形をドラッグ&ドロップするプログラムを記述するのみです.
参考になる情報を探しているのですが,未だ見つけれていません.
参考になるサンプルプログラムやライブラリ,関数をご存知でしたら,ご教示頂けますと助かります.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ウィンドウライブラリとか使ってるのかどうかわかりませんが、2Dでいいんですか?
ドラッグは概念的には↓のような感じです。
(GeometryViewerはいくつかの図形を表示しているビュークラスだと思ってください。)

C++

1class GeometryViewer 2{ 3private: 4 std::vector<Geometry*> m_geometries; 5 Geometry* m_draggingGeometry = nullptr; 6 Point m_dragOffset; 7public: 8 9 void mouseDown(const Point& p) 10 { 11 m_draggingGeometry = getGeometryAtPoint(p); 12 if(m_draggingGeometry){ 13 // 図形の位置からクリックした位置までのオフセットを記憶 14 m_dragOffset = p - m_draggingGeometry->location(); 15 invalidate(); 16 } 17 } 18 19 void mouseMove(const Point& p) 20 { 21 if(m_draggingGeometry){ 22 // マウスの位置からマウスダウン時のオフセットを引けばドラッグする位置が求まる 23 m_draggingGeometry->setLocation(p - m_dragOffset); 24 invalidate(); 25 } 26 } 27 28 void mouseUp(const Point& p) 29 { 30 if(m_draggingGeometry){ 31 // ドラッグ終了 32 m_draggingGeometry = nullptr; 33 invalidate(); 34 } 35 } 36 37 Geometry* getGeometryAtPoint(const Point& p) 38 { 39 // 図形の配列から位置を含むものを探す 40 for(auto g : m_geometries){ 41 if(g->contains(p)) return g; 42 } 43 return nullptr; 44 } 45};

単純にマウスダウン時にその位置に図形があるか調べ、あればその図形と図形の原点からのオフセットを記憶、マウス移動時はマウスの位置からオフセット分を引いた位置を図形の位置としてやればドラッグできます。
3Dの場合でもマウスの位置に対応する(x,y,z)と図形のオフセットから同様に計算できます。

投稿2019/09/25 13:47

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LenItsuki

2019/09/25 14:30

誠にどうもありがとうございます.いまのところ2Dです.なにぶん,C++の初心者なので,ご教示頂いたクラスを組み入れることにハードルがありますが...トライしてみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問