COleDataSource を利用した Drag

以前 DoDragDrop で少し調べたが,その時は途中になっていた.
その時の内容で,例えば CListBox に表示されてるファイルリストのすべてを,CListBox の外側でドラッグするすることはできる.
  void CDragLBDlg::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CStringArray sa ;
    ::ToStringArray(FileNames,&sa) ;
    ::StringArrayToDoDragFiles(sa) ;
    }


CListCtrl であれば,OnBegindragXxxx が利用できるので,
  void CDragLVDlg::OnBegindragListFiles(NMHDR* pNMHDR, LRESULT* pResult)
  {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    {
      CStringArray sa ;
      for (int index=0 ; index<m_ListFiles.GetItemCount() ; index++) {
        if (m_ListFiles.GetItemState(index,LVIS_SELECTED) == LVIS_SELECTED) {
          tstring str = FileNames[index] ;
          sa.Add(str.c_str()) ;
          }
        }
      if (sa.GetSize() > 0) {
        ::StringArrayToDoDragFiles(sa) ;
        }
      }
    *pResult = 0;
    }


今回やりたかったのは,CListBox の項目のドラッグ.
ドラッグ部分は CListCtrl とほぼ同様となると思われるが,ドラッグ開始のタイミングが取れない.
CDragListBox と開始時の動きは似ているが,MFC のコードを見るとちょっと難しそう.
いろいろと検索すると,CListBox のサブクラス化で対応するみたいとわかったが,手順が...
動的なサブクラス化と言うらしい.
Inside Visual C++ には,囲み記事に CNonNumericEdit がある.
利用する手順はわかるが,作成する手順がわからない
今も利用はしている CView からの VXxxxView ファミリがあるが,10 年以上前で手順は覚えてない.


いろいろ探して「MFC クラスウィザード」を利用することがわかった.
今まで,よく見ていたダイアログなのに...

後は,WM_LBUTTONDOWN を処理する様にして,
  void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CListBox::OnLButtonDown(nFlags, point);
    int sel = GetCurSel() ;
    if (sel == LB_ERR) { return ; }
    CString str ;
    GetText(sel,str) ;
    CStringArray sa ;
    sa.Add(str) ;
    ::StringArrayToDoDragFiles(sa) ;
    }
ダイアログに追加したリスボックスで,これを利用する様にダイアログのヘッダを修正.


MSDN CTRLTEST サンプル
テクニカル ノート 14
標準コントロールからのコントロールの派生
[MSVC] MFCを使用しての動的サブクラス化
Create Client Windows, Drag and Drop Between Listboxes


2014/08/11 追記
COleDataSource を利用して,他の AP に CF_HDROP で渡そうとすると,
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Assertion Failed!
Program: …Documents\Visual Studio 2010\Projects\TestVC10\Debug\T_SC.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp
Line: 43
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
—————————
中止(A) 再試行(R) 無視(I)
—————————

COleDataSource の使い方が間違っていた.
開放する時に delete ではうまくない.
データ オブジェクトとデータ ソース : 作成と破棄

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ



コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください