エディットボックスへのDrag&Dropについて

このQ&Aのポイント
  • エディットボックスへのDrag&Dropによってテキストが消えてしまう現象に悩んでいます。
  • http://www.softist.com/programming/dandd/dandd.htmのサンプルプログラムを参考に、コントロール間のDrag&Dropの仕方を学習しています。
  • 同じエディットボックスへのDrag&Dropをしてもテキストが消えないようにする方法を教えてください。
回答を見る
  • ベストアンサー

同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへのDrag&Drop(VC++/MFC) 同じエディットボックスへDrag&Dropすると テキストが消えてしまう現象に悩んでいます。 現在、 下記のサイト http://www.softist.com/programming/dandd/dandd.htm のサンプルプログラムを参考に コントロール間のDrag&Dropの仕方を学習しています。 このサンプルではエディットボックス間で文字列のコピーができるようになっていますが、 私がほしい機能は文字列の移動です。 そこで、サンプルのEditForDD.cppの DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY); の下に、 if(DropEffect == DROPEFFECT_COPY) this->SetWindowTextA(""); という一文を加えて、Drag&Dropする際にDrag元のテキストを削除するようにしました。 その結果、異なるエディットボックス間での移動は可能になりましたが、 Drag元のエディットボックスにテキストを戻そうとすると テキストが消えてしまいまうようになってしまいました。 このように同じエディットボックスにDrag&Dropをしても テキストが消えないようにする方法をご存じの方はいらっしゃいませんでしょうか? なお、開発環境は以下の通りです。 開発環境:Visual Studio 2005 Standard Edition 利用言語:VC++/MFC OS:Windows XP よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • goo39
  • ベストアンサー率36% (13/36)
回答No.1

Revokeをして同じエディットボックスにはDrop出来ないようにし Drag&Drop後に再びRegisterをしてはどうでしょうか? m_DropTarget.Revoke(); //追加 DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY); //DROPEFFECT_SCROLL if(DropEffect == DROPEFFECT_COPY) this->SetWindowTextA(""); m_DropTarget.Register(this); //追加

stkmghck
質問者

お礼

goo39さん、 ご回答いただきありがとうございます。 ご回答のとおり、やりましたらうまくいきました! RevokeでDropリストからはずし、 Drag&Dropの後、Registerでリストに再追加するのですね。 1ヶ月以上悩んでいたので、感激です! 本当にありがとうございました。

その他の回答 (2)

回答No.3

例えば、 VOID CDropTarget::SetDropSrc( CWnd *pWnd ) { m_pWndSrc = pWnd; } のようなメソッドを作り、 m_DropTarget.SetDropSrc( this ); DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY); //DROPEFFECT_SCROLL としてやれば良い、と思っていましたが、実際にやってみると、DoDragDrop の後で、 m_DropTarget.SetDropSrc( NULL ); としてやらなければ、次にドロップしようとしたときにドロップ不可の状態のままになってしまいました・・・。 #1 の方の方法の方が簡潔で良さそうですね。

stkmghck
質問者

お礼

tsukasa-12rさん、 再度、ご回答ありがとうございました。 上記のコードとCDropTarget::OnDropに if(this->m_pWndSrc == pWnd) return FALSE; を追加したら、うまく動きました! 確かに今回はgoo39さんの方が簡潔でしたので そちらを採用したいと思います。 しかしながら、ドラッグ元をとる方法がわかり、 今後大いに役にたちそうな気がします。 本当にありがとうございました!

回答No.2

COleDropTargetの派生クラスの OnDragEnter()、および OnDrag() で、ドロップ先がドラッグ元と同じなら DROPEFFECT_NONE を返すようにして、ドラッグ元にはドロップできないようにしてはどうでしょうか。

stkmghck
質問者

補足

tsukasa-12rさん、 ご回答ありがとうございます。 私も以前この方法でどうにかならないか考えていたのですが、 ドロップ先がOnDragEnter()、および OnDrag()の引数CWnd* pWndで取れるとして、 ドラッグ元のとり方がよくわからず断念したしだいです。 よろしければ このドラッグ元のとり方も教えていただけないでしょうか。 よろしくお願いいたします。

関連するQ&A

  • VC++2010 MFC エディットボックスの質問

    VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします

  • VC++2010 エディットボックスのリードオンリ

    現在は私はVC++2010 MFCでアプリケーションを開発しています。 エディットボックスのプロパティにリードオンリーの機能があるんですが、 プログラムで実現しようとするとどのようにしたらよろしいのかわかりませんでしたので 質問させていただきました。 ではよろしくお願いします

  • VC++2010 エディットボックス 数値検出

    VC++2010 エディットボックス 数値検出について質問なんですが、 そういう関数とかありますか?  数値が0.01~65536まで入力される仕様になっており 文字列を受信したら無効にするようにしたいのですが よろしくお願いします

  • VC++2010 ボタンなどのレイアウト大きさ変更

    VC++2010のMFCで現在開発しているんですが、 ボタン、スタティックテキスト、エディットボックスの文字の大きさを変更したいんですが どのようにすればいいかわかりません。よろしくお願いします。 またステータスバーに色を付けたいんですがどのようにすれば色を付けることができますか? よろしくお願いします。

  • VC++6.0 エディットボックス小数点表示

    VC++6.0 エディットボックス小数点表示のサンプルがあるサイトあれば お教えください

  • VC++2010 エディットボックスに値を表示

    現在、VC++2010 MFCでアプリケーションを作成しています。 そこで質問なんですが、 エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか よろしくお願いします。

  • エディットボックスの改行について

    よろしくお願いいたします。 環境 WIN98 VC++6.0 MFC にて 改行が可能なエディットボックスのデータをテキストファイルに保存すると、エディットボックスと同様に改行されて保存されます。 ファイルからデータを読出し、エディットボックスに表示する場合もちゃんと改行されていて問題ありません。 ここで、エディットボックスが2つあり、それぞれのエディットボックスのデータが2行あったとすると、ファイルには4行保存されます。 次にファイルからデータを読出し、エディットボックスに表示する場合、1個目のエディットボックスのデータが2行と分かっていれば良いのですが、そうでない場合は何行読み出してエディットボックスに表示すれば良いか分かりません。 そこで、1個目のデータを保存する時に、最終行の次の行にendという文字を保存することにしました。 これで、読み出すときはendを目印に必要な行数を読み出せます。 しかしながら、エディットボックスの文字の中にたまたまendが使われるとうまく行きません。 長くなりましたが、このような場合、一般的にはどのようにして対処すれば良いのでしょうか? お分かりの方よろしくお願いいたします。

  • エディットボックスで改行

    お世話になっております。 VC++でプログラムを組んでおり、下記の要領でエディットボックスに文字を表示しています。 _itoa(inputData[i], receivedChar, 16 );//数値を文字列に変換 SetDlgItemText(argThr1->hWnd, IDC_EDIT2, receivedChar); このとき、エディットボックス内で、任意の位置で改行しながら表示する方法はありますでしょうか? よろしくお願い致します。 表示例 ABC(改行) DEF(改行)

  • エディットボックスに入力されている文字列が、スペースだけで構成されているかどうか。

    VC++6.0・Win32APIを用いて、ウィンドウズアプリケーションを作成しています。 エディットボックスに入力されている文字列が、スペース(全角スペース又は半角スペース)のみ (それらの組み合わせでも構わない)で構成されているかどうかを判別するアルゴリズムを教えてください。 ヒントでも構いません。 エディットボックスの作成や、そこからの文字列の取得については理解しています。 あっ、でもよく考えてみたらエディットボックスかどうかは関係ないですね(^_^;) 『ある文字列が・・・』で十分ですね。 お手数をお掛けしますが、よろしくお願いいたします。

  • エディットボックスのカーソル取得方法

    複数のエディットボックスがあり、マウスで選択したエディットボックスに文字列を表示させたいのですが、うまくいきません。使用ツールはVC++です。

専門家に質問してみよう