none
CRichEditCtrlのDrag&Drop機能をキャンセルしたい。

    質問

  • VisualStudio2010 MFC でソフトを開発しております。
    表題通りなんですが、CRichEditCtrlのDrag&Drop機能を削除する(出来なくする)をする方法がありましたらご教授ください。


    また、削除する方法が無ければ、
    Drag&Drop の完了イベントが判ればそれでも結構です。(Drag&Dropすると、LButtonUpイベントも来ないようなんで)

    みなさんよろしくお願いします。

    2018年4月14日 5:10

回答

  • Resありがとうございます。

    右ボタンも使っているのでそれと勘違いしてました。 (選択したままいろいろやってます)

    左ボタンだと、選択解除して、Drag&Dropも起きずに良さそうです。

    明日までいろいろテストしてこれで良さそうでしたら回答マークを付けて閉じさせて頂きます。

    この度はありがとうございました。 

    2018年4月14日 9:37

すべての返信

  • 一つの案ですが、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 から取得するようにコードを修正しました。

    2018年4月14日 7:37
  • Resありがとうございます。

    CRichEditCtrl を派生して、 LButtonDown/OnMouseMove/LButtonUp イベントでいろいろ処理をしております。
    選択状態を表示したままでいろいろ処理する必要もありますので、選択情報を解除する事は出来ないですね。

    RevokeDragDropの情報はありがとうございました。


    2018年4月14日 8:40
  • 選択状態も使っているので、

    すみません。上記の意味がよくわからなかったのですが、OnLButtonDown イベントでは選択状態を解除したくないということでしょうか? 通常、ドラッグ&ドロップの操作が実装されていないテキスト入力コントロールですと、OnLButtonDown イベントで選択状態は解除され、その後、マウスの左ボタンを押したままカーソルを移動させると、新たに選択範囲を指定する挙動だったと思います。

    実装したい挙動を詳しく教えていただけますでしょうか?

    2018年4月14日 9:22
  • Resありがとうございます。

    右ボタンも使っているのでそれと勘違いしてました。 (選択したままいろいろやってます)

    左ボタンだと、選択解除して、Drag&Dropも起きずに良さそうです。

    明日までいろいろテストしてこれで良さそうでしたら回答マークを付けて閉じさせて頂きます。

    この度はありがとうございました。 

    2018年4月14日 9:37
  • 関連でいろいろ調べていましたら、RichEditCtrl の作成時ウィンドウスタイルに ES_NOOLEDRAGDROP を付けることで、ドラッグドロップの機能を OFF にできることが分かりました。

    参考サイト : https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb774367

    2018年4月16日 6:49
  • ありがとうございます。 試させて頂きます。
    2018年4月18日 5:25
  • Freeプログラマーさん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    [回答としてマーク] の設定つきましてもご協力くださいましてありがとうございます。
    [回答としてマーク] ですが参考となった投稿に対してご設定くださいませ。

    kenjinote さんの投稿が参考となった場合は kenjinote さんのアイコンの
    上方にある [回答としてマーク] をクリックします。

    お手数ではございますが、どうぞよろしくお願いいたします。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年4月18日 5:42
    モデレータ