アプリ版:「スタンプのみでお礼する」機能のリリースについて

同じエディットボックスへの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

よろしくお願いいたします。

A 回答 (3件)

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); //追加
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/27 10:13

例えば、


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 の方の方法の方が簡潔で良さそうですね。
    • good
    • 0
この回答へのお礼

tsukasa-12rさん、
再度、ご回答ありがとうございました。

上記のコードとCDropTarget::OnDropに
if(this->m_pWndSrc == pWnd) return FALSE;
を追加したら、うまく動きました!

確かに今回はgoo39さんの方が簡潔でしたので
そちらを採用したいと思います。
しかしながら、ドラッグ元をとる方法がわかり、
今後大いに役にたちそうな気がします。

本当にありがとうございました!

お礼日時:2010/01/28 18:45

COleDropTargetの派生クラスの


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

この回答への補足

tsukasa-12rさん、
ご回答ありがとうございます。

私も以前この方法でどうにかならないか考えていたのですが、
ドロップ先がOnDragEnter()、および OnDrag()の引数CWnd* pWndで取れるとして、
ドラッグ元のとり方がよくわからず断念したしだいです。

よろしければ
このドラッグ元のとり方も教えていただけないでしょうか。
よろしくお願いいたします。

補足日時:2010/01/27 10:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!