エディットボックスへのDrag&Dropについて
- エディットボックスへの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 よろしくお願いいたします。
- stkmghck
- お礼率55% (5/9)
- C・C++・C#
- 回答数3
- ありがとう数4
- みんなの回答 (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); //追加
その他の回答 (2)
- tsukasa-12r
- ベストアンサー率65% (358/549)
例えば、 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 の方の方法の方が簡潔で良さそうですね。
お礼
tsukasa-12rさん、 再度、ご回答ありがとうございました。 上記のコードとCDropTarget::OnDropに if(this->m_pWndSrc == pWnd) return FALSE; を追加したら、うまく動きました! 確かに今回はgoo39さんの方が簡潔でしたので そちらを採用したいと思います。 しかしながら、ドラッグ元をとる方法がわかり、 今後大いに役にたちそうな気がします。 本当にありがとうございました!
- tsukasa-12r
- ベストアンサー率65% (358/549)
COleDropTargetの派生クラスの OnDragEnter()、および OnDrag() で、ドロップ先がドラッグ元と同じなら DROPEFFECT_NONE を返すようにして、ドラッグ元にはドロップできないようにしてはどうでしょうか。
補足
tsukasa-12rさん、 ご回答ありがとうございます。 私も以前この方法でどうにかならないか考えていたのですが、 ドロップ先がOnDragEnter()、および OnDrag()の引数CWnd* pWndで取れるとして、 ドラッグ元のとり方がよくわからず断念したしだいです。 よろしければ このドラッグ元のとり方も教えていただけないでしょうか。 よろしくお願いいたします。
関連するQ&A
- VC++2010 エディットボックスのリードオンリ
現在は私はVC++2010 MFCでアプリケーションを開発しています。 エディットボックスのプロパティにリードオンリーの機能があるんですが、 プログラムで実現しようとするとどのようにしたらよろしいのかわかりませんでしたので 質問させていただきました。 ではよろしくお願いします
- 締切済み
- C・C++・C#
- VC++2010 MFC エディットボックスの質問
VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします
- ベストアンサー
- その他([技術者向] コンピューター)
- VC++2010 エディットボックス 数値検出
VC++2010 エディットボックス 数値検出について質問なんですが、 そういう関数とかありますか? 数値が0.01~65536まで入力される仕様になっており 文字列を受信したら無効にするようにしたいのですが よろしくお願いします
- ベストアンサー
- C・C++・C#
- VC++2010 エディットボックスに値を表示
現在、VC++2010 MFCでアプリケーションを作成しています。 そこで質問なんですが、 エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか よろしくお願いします。
- 締切済み
- C・C++・C#
- VC++2010 ボタンなどのレイアウト大きさ変更
VC++2010のMFCで現在開発しているんですが、 ボタン、スタティックテキスト、エディットボックスの文字の大きさを変更したいんですが どのようにすればいいかわかりません。よろしくお願いします。 またステータスバーに色を付けたいんですがどのようにすれば色を付けることができますか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- エディットボックスの改行について
よろしくお願いいたします。 環境 WIN98 VC++6.0 MFC にて 改行が可能なエディットボックスのデータをテキストファイルに保存すると、エディットボックスと同様に改行されて保存されます。 ファイルからデータを読出し、エディットボックスに表示する場合もちゃんと改行されていて問題ありません。 ここで、エディットボックスが2つあり、それぞれのエディットボックスのデータが2行あったとすると、ファイルには4行保存されます。 次にファイルからデータを読出し、エディットボックスに表示する場合、1個目のエディットボックスのデータが2行と分かっていれば良いのですが、そうでない場合は何行読み出してエディットボックスに表示すれば良いか分かりません。 そこで、1個目のデータを保存する時に、最終行の次の行にendという文字を保存することにしました。 これで、読み出すときはendを目印に必要な行数を読み出せます。 しかしながら、エディットボックスの文字の中にたまたまendが使われるとうまく行きません。 長くなりましたが、このような場合、一般的にはどのようにして対処すれば良いのでしょうか? お分かりの方よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- エディットボックスのカーソル取得方法
複数のエディットボックスがあり、マウスで選択したエディットボックスに文字列を表示させたいのですが、うまくいきません。使用ツールはVC++です。
- ベストアンサー
- C・C++・C#
- エディットボックス
VC++、APIでwindowsプログラムを書いています。ダイアログボックスで質問があります。 case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT1, "0"); return TRUE; で読み取り専用エディットボックス内に初期値を書き case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam ; SetTextColor( hdc, RGB( 255, 255, 255)) ;// 白色 SetBkMode(hdc, TRANSPARENT); // 背景を透過 return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ; } でダイアログボックス内のスタティックテキストと読み取り専用エディットボックスの背景を同時に透過させているのですが、エディットボックス内の文字を void ddd( HWND hDlg, int xxx) { char ttt[100]; sprintf(ttt,"%d",xxx); SetDlgItemText(hDlg, IDC_EDIT1, ttt); return ; } で書き換えると古いテキストが残ったように表示されます(背景に色を指定すれば古いテキストは残らない)。 うまく表示させるにはどういった方法があるでしょうか? ご存知の方、よろしくお願いします。 ちなみにダイアログボックスにはビットマップが貼ってあります。
- 締切済み
- C・C++・C#
- エディットボックスの非表示方法
はじめまして。 プログラミング初心者です。 エディットボックスの非表示方法について教えてください。 現在、MFCによる、スケジュール管理システムを作成中です。クライアント/サーバ型で行っています。 クライアントの画面において、スケジュールを見ることが可能です。ただ、変更や追加などを行うときは、ID、パスワードを入力してログインする必要があります。 そのログイン方法は、スケジュールを見る画面にIDとパスワードのエディットボックスがありますので、そこに入力し、サーバでID、パスのチェックを行い一致すると、ログイン状態になり、ログオフボタンが表示されます。 しかし、IDとパスのエディットボックスは表示されたままになります。 その表示を非表示に切り替えたいのですがどのようにしたらいいのかわかりません。 開発環境は、Windows2000およびWindowsNTです。 ツールはVC++6.0です。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
goo39さん、 ご回答いただきありがとうございます。 ご回答のとおり、やりましたらうまくいきました! RevokeでDropリストからはずし、 Drag&Dropの後、Registerでリストに再追加するのですね。 1ヶ月以上悩んでいたので、感激です! 本当にありがとうございました。