トップ回答者
CRichEditCtrlのDrag&Drop機能をキャンセルしたい。

質問
回答
-
一つの案ですが、CRichEditCtrl を派生して OnLButtonDown イベント捕捉直後に SetSel などして選択領域を解除するようにすると、選択領域のドラッグ&ドロップをさせないようにできます。
// ヘッダー #pragma once #include "afxcmn.h" class CMyRichEditCtrl : public CRichEditCtrl { public: CMyRichEditCtrl(); ~CMyRichEditCtrl(); DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags, CPoint point); };
// コード #include "stdafx.h" #include "MyRichEditCtrl.h" CMyRichEditCtrl::CMyRichEditCtrl() { } CMyRichEditCtrl::~CMyRichEditCtrl() { } BEGIN_MESSAGE_MAP(CMyRichEditCtrl, CRichEditCtrl) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() void CMyRichEditCtrl::OnLButtonDown(UINT nFlags, CPoint point) { int nCharIndex = CharFromPos(point); SetSel(nCharIndex, nCharIndex); // 選択状態を解除 CRichEditCtrl::OnLButtonDown(nFlags, point); }
また、CRichEditCtrl 内の選択領域のドラッグ&ドロップではなく、他のアプリケーションからのドラッグ&ドロップを無効にするには、RevokeDragDrop 関数へ CRichEditCtrl のウィンドウハンドルを渡すことで禁止にすることが出来ます。
参考サイト: https://msdn.microsoft.com/ja-jp/library/ms692643(VS.85).aspx
追記:
スクロールバーが表示されているとき、画面上に表示されていない位置を SetSel に渡すとその位置にスクロールが移動してしまう問題があったため、SetSel に渡す数値を CharFromPos から取得するようにコードを修正しました。- 編集済み kenjinoteMVP 2018年4月16日 6:24
- 回答としてマーク 立花楓Microsoft employee, Moderator 2018年6月13日 6:40
すべての返信
-
一つの案ですが、CRichEditCtrl を派生して OnLButtonDown イベント捕捉直後に SetSel などして選択領域を解除するようにすると、選択領域のドラッグ&ドロップをさせないようにできます。
// ヘッダー #pragma once #include "afxcmn.h" class CMyRichEditCtrl : public CRichEditCtrl { public: CMyRichEditCtrl(); ~CMyRichEditCtrl(); DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags, CPoint point); };
// コード #include "stdafx.h" #include "MyRichEditCtrl.h" CMyRichEditCtrl::CMyRichEditCtrl() { } CMyRichEditCtrl::~CMyRichEditCtrl() { } BEGIN_MESSAGE_MAP(CMyRichEditCtrl, CRichEditCtrl) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() void CMyRichEditCtrl::OnLButtonDown(UINT nFlags, CPoint point) { int nCharIndex = CharFromPos(point); SetSel(nCharIndex, nCharIndex); // 選択状態を解除 CRichEditCtrl::OnLButtonDown(nFlags, point); }
また、CRichEditCtrl 内の選択領域のドラッグ&ドロップではなく、他のアプリケーションからのドラッグ&ドロップを無効にするには、RevokeDragDrop 関数へ CRichEditCtrl のウィンドウハンドルを渡すことで禁止にすることが出来ます。
参考サイト: https://msdn.microsoft.com/ja-jp/library/ms692643(VS.85).aspx
追記:
スクロールバーが表示されているとき、画面上に表示されていない位置を SetSel に渡すとその位置にスクロールが移動してしまう問題があったため、SetSel に渡す数値を CharFromPos から取得するようにコードを修正しました。- 編集済み kenjinoteMVP 2018年4月16日 6:24
- 回答としてマーク 立花楓Microsoft employee, Moderator 2018年6月13日 6:40
-
Resありがとうございます。
CRichEditCtrl を派生して、 LButtonDown/OnMouseMove/LButtonUp イベントでいろいろ処理をしております。
選択状態を表示したままでいろいろ処理する必要もありますので、選択情報を解除する事は出来ないですね。
RevokeDragDropの情報はありがとうございました。- 編集済み Freeプログラマー 2018年4月14日 9:15
-
Resありがとうございます。
右ボタンも使っているのでそれと勘違いしてました。 (選択したままいろいろやってます)
左ボタンだと、選択解除して、Drag&Dropも起きずに良さそうです。
明日までいろいろテストしてこれで良さそうでしたら回答マークを付けて閉じさせて頂きます。
この度はありがとうございました。
- 回答としてマーク Freeプログラマー 2018年4月18日 5:25
- 回答としてマークされていない 立花楓Microsoft employee, Moderator 2018年6月13日 6:40
-
関連でいろいろ調べていましたら、RichEditCtrl の作成時ウィンドウスタイルに ES_NOOLEDRAGDROP を付けることで、ドラッグドロップの機能を OFF にできることが分かりました。
参考サイト : https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb774367
-
Freeプログラマーさん、こんにちは。フォーラム オペレーターの立花です。
MSDN フォーラムへご投稿くださいましてありがとうございます。
[回答としてマーク] の設定つきましてもご協力くださいましてありがとうございます。
[回答としてマーク] ですが参考となった投稿に対してご設定くださいませ。
kenjinote さんの投稿が参考となった場合は kenjinote さんのアイコンの
上方にある [回答としてマーク] をクリックします。
お手数ではございますが、どうぞよろしくお願いいたします。
~ 参考になった投稿には回答としてマークの設定にご協力ください ~
MSDN/TechNet Community Support 立花楓